2015-01-10 2 views
0

Вот как мне нужно создать пользователя в моей базе данных, вы увидите его с ошибкой во время выполнения, и оно появляется только при нажатии кнопки.Ошибка выполнения после нажатия кнопки

проблемы появляются только при нажатии кнопки на странице.

Здесь мы имеем C# код из opretbruger.aspx.cs

protected void ButtonOpretbruger_Click(object sender, EventArgs e) 
{ 
    string fejl = "Hov Hov, Du skal læse vore betingelser"; 

    if (CheckBoxBetingelser.Checked) 
    { 
     LabelError.Visible = false; 
     cmd.Connection = conn; 

     string brugernavn = System.Globalization.CultureInfo.CurrentUICulture.TextInfo.ToTitleCase(TextBoxBrugernavn.Text); 
     cmd.CommandText = "SELECT Id, brugernavn, rank FROM brugere WHERE brugernavn = @brugernavn"; 
     cmd.Parameters.AddWithValue("@brugernavn", brugernavn); 

     conn.Open(); 
     SqlDataReader reader = cmd.ExecuteReader(); 

     if (reader.Read()) 
     { 
     LabelErrorBesked.Text = "Hov hov, denne her email er optaget " + brugernavn; 
     } 
     else 
     { 
     conn.Close(); 

     cmd.Connection = conn; 

     //ligger noget sikkert på password 
     string brugernavn1 = System.Globalization.CultureInfo.CurrentUICulture.TextInfo.ToTitleCase(TextBoxBrugernavn.Text); 
     string adgangskode = Hash.getHashSha256(TextBoxAdgangskode.Text); 

     string fornavn = TextBoxFornavn.Text; 
     string efternavn = TextBoxEfternavn.Text; 

     cmd.CommandText = @"INSERT INTO brugere (brugernavn, adgangskode, fornavn, efternavn) 
      VALUES (@brugernavn, @adgangskode, @fornavn, @efternavn);"; 
     cmd.Parameters.AddWithValue("@brugernavn", brugernavn1); 
     cmd.Parameters.AddWithValue("@adgangskode", adgangskode); 
     cmd.Parameters.AddWithValue("@fornavn", fornavn); 
     cmd.Parameters.AddWithValue("@efternavn", efternavn); 

     conn.Open(); 
     cmd.ExecuteNonQuery(); 
     conn.Close(); 

     Response.Redirect("login.aspx"); 
     } 
    } 
    else 
    { 
     LabelError.Text = fejl; 
    } 
} 

здесь мы HTML от opretbruger.aspx

<asp:Button ID="ButtonOpretbruger" runat="server" CssClass="btn pi-btn-base pi-btn-wide pi-weight-600" OnClick="ButtonOpretbruger_Click" ValidationGroup="opretbruger" /> 

Проблема заключается в том, что появляется здесь печатал это:

Ошибка сервера в приложении «/».

Ошибка

Описание: Произошла ошибка приложения на сервере. Текущие настройки для этого приложения не позволяют удаленно просматривать информацию об ошибке приложения (по соображениям безопасности). Его можно, однако, просматривать браузерами, запущенными на локальном сервере .

Детали: Чтобы включить подробности этого конкретного сообщения об ошибке, чтобы быть для просмотра на удаленных машинах, пожалуйста, создайте тег в в «web.config» файл конфигурации, расположенный в корневом каталоге текущего веб-приложения . Затем этот тег должен иметь свой атрибут «режим» , установленный на «Выкл.».

<configuration> 
    <system.web> 
     <customErrors mode="Off"/> 
    </system.web> 
</configuration> 

Примечание: Текущая страницу ошибки вы видите можно заменить на странице ошибки пользовательской модификация «defaultRedirect» атрибут конфигурации тега приложения к точке на пользовательской страницы ошибок URL.

<configuration> 
    <system.web> 
     <customErrors mode="RemoteOnly" defaultRedirect="mycustompage.htm"/> 
    </system.web> 
</configuration> 

в моем web.config выглядит следующим образом:

<system.web> 
    <compilation targetFramework="4.5" /> 
    <httpRuntime targetFramework="4.5" /> 
    <globalization uiCulture="en-US" /> 
    <!--<globalization uiCulture="da" culture="da-DK" />--> 
    </system.web> 

Eidt UPDATE

protected void ButtonOpretbruger_Click(object sender, EventArgs e) 
{ 
    string fejl = "Hov Hov, Du skal læse vore betingelser"; 

    if (CheckBoxBetingelser.Checked) 
    { 
     LabelError.Visible = false; 
     SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ToString()); 
     SqlCommand cmd = new SqlCommand(); 
     cmd.Connection = conn; 

     string brugernavn = System.Globalization.CultureInfo.CurrentUICulture.TextInfo.ToTitleCase(TextBoxBrugernavn.Text); 
     cmd.CommandText = "SELECT Id, brugernavn, rank FROM brugere WHERE brugernavn = @brugernavn"; 
     cmd.Parameters.AddWithValue("@brugernavn", brugernavn); 

     conn.Open(); 
     SqlDataReader reader = cmd.ExecuteReader(); 

     if (reader.Read()) 
     { 
     LabelErrorBesked.Text = "Hov hov, denne her email er optaget " + brugernavn; 
     } 
     else 
     { 
     conn.Close(); 

     SqlConnection conn1 = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ToString()); 
     SqlCommand cmd1 = new SqlCommand(); 
     cmd1.Connection = conn; 

     string adgangskode = Hash.getHashSha256(TextBoxAdgangskode.Text); 

     string fornavn = TextBoxFornavn.Text; 
     string efternavn = TextBoxEfternavn.Text; 

     cmd1.CommandText = @"INSERT INTO brugere (brugernavn, adgangskode, fornavn, efternavn) 
      VALUES (@brugernavn, @adgangskode, @fornavn, @efternavn);"; 
     cmd1.Parameters.Add("@brugernavn", brugernavn); 
     cmd1.Parameters.Add("@adgangskode", adgangskode); 
     cmd1.Parameters.Add("@fornavn", fornavn); 
     cmd1.Parameters.Add("@efternavn", efternavn); 

     conn1.Open(); 
     cmd1.ExecuteNonQuery(); 
     conn1.Close(); 

     Response.Redirect("login.aspx"); 
     } 
    } 
    else 
    { 
     LabelError.Text = fejl; 
    } 
} 

ошибки являются: имя переменной '@brugernavn' уже объявлен. Имена переменных должны быть уникальными в рамках пакета запросов или хранимой процедуры. Должен объявить скалярную переменную "@adgangskode".

+3

Получите страницу с консоли сервера или установите 'mode = Off', чтобы получить полное сообщение об ошибке. Поместите это здесь, и мы увидим. –

+0

@PatrickHofman Где я его добавляю? Должен ли я писать его в web.config ?, Im New on Asp.net & C# –

+0

Да, пожалуйста. Добавьте конфигурационную часть XML в сообщение об ошибке. –

ответ

3

Вы повторно используете ту же команду (переменная с именем cmd) дважды. Это является причиной вашей ошибки, поскольку ваш предыдущий код мешает вашему более позднему коду.

Сплит cmd переменная в два. Один для первого утверждения, второй для второго.


Это должно быть полный код:

protected void ButtonOpretbruger_Click(object sender, EventArgs e) 
{ 
    string fejl = "Hov Hov, Du skal læse vore betingelser"; 

    if (CheckBoxBetingelser.Checked) 
    { 
     LabelError.Visible = false; 

     using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ToString())) 
     { 
      conn.Open(); 

      using (SqlCommand cmd = new SqlCommand()) 
      { 
       cmd.Connection = conn; 

       string brugernavn = System.Globalization.CultureInfo.CurrentUICulture.TextInfo.ToTitleCase(TextBoxBrugernavn.Text); 
       cmd.CommandText = "SELECT Id, brugernavn, rank FROM brugere WHERE brugernavn = @brugernavn"; 
       cmd.Parameters.AddWithValue("@brugernavn", brugernavn); 

       using (SqlDataReader reader = cmd.ExecuteReader()) 
       { 
        if (reader.Read()) 
        { 
        LabelErrorBesked.Text = "Hov hov, denne her email er optaget " + brugernavn; 
        } 
        else 
        { 
        using (SqlCommand cmd1 = new SqlCommand()) 
        { 
         cmd1.Connection = conn; 

         string adgangskode = Hash.getHashSha256(TextBoxAdgangskode.Text); 

         string fornavn = TextBoxFornavn.Text; 
         string efternavn = TextBoxEfternavn.Text; 

         cmd1.CommandText = @"INSERT INTO brugere (brugernavn, adgangskode, fornavn, efternavn) 
          VALUES (@brugernavn, @adgangskode, @fornavn, @efternavn);"; 
         cmd1.Parameters.Add("@brugernavn", brugernavn); 
         cmd1.Parameters.Add("@adgangskode", adgangskode); 
         cmd1.Parameters.Add("@fornavn", fornavn); 
         cmd1.Parameters.Add("@efternavn", efternavn); 

         cmd1.ExecuteNonQuery(); 
        } 

        Response.Redirect("login.aspx"); 
        } 
       } 
      } 
     } 

     conn.Close(); 
     } 
    else 
    { 
     LabelError.Text = fejl; 
    } 
} 
+2

... и начните использовать с помощью {} блоков для IDisposables. – Darek

+0

Прекратить использование 'AddWithValue' :) –

+0

Действительно. Я думаю, что ОР нарушает почти все правила. По крайней мере, он использует параметры :) –

0

Ваша проблема с CMD объекта. Этот объект используется много раз и каждый раз, когда вы обновляете один и тот же объект. В таком случае вы можете добавить один и тот же параметр дважды.

Вместо того, чтобы попытаться получить команду следующим образом

Command cmd = conn.CreateCommand(); 

// Теперь использования ЦМД здесь.

Смежные вопросы