Jesper Petersen
Jesper Petersen

Reputation: 11

Runtime Error after Button click

this is how when I need to create user into my database you will see it with a runtime error, and it only appears when I click the button.

problems are just the only appears when I click the button on the page.

Here we have c # code from 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;
   }
}

here we have html from opretbruger.aspx

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

The problem is it appears here typing this:

Server Error in '/' Application.

Runtime Error

Description: An application error occurred on the server. The current custom error settings for this application prevent the details of the application error from being viewed remotely (for security reasons). It could, however, be viewed by browsers running on the local server machine.

Details: To enable the details of this specific error message to be viewable on remote machines, please create a tag within a "web.config" configuration file located in the root directory of the current web application. This tag should then have its "mode" attribute set to "Off".

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

Notes: The current error page you are seeing can be replaced by a custom error page by modifying the "defaultRedirect" attribute of the application's configuration tag to point to a custom error page URL.

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

in my web.config looks like this:

<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;
   }
}

Error are: The variable name '@brugernavn' has already been declared. Variable names must be unique within a query batch or stored procedure. Must declare the scalar variable "@adgangskode".

Upvotes: 0

Views: 545

Answers (2)

Patrick Hofman
Patrick Hofman

Reputation: 156978

You are reusing the same command (variable named cmd) twice. That is the cause of your error since your previous code interferes with your later code.

Split the cmd variable in two. One for the first statement, one for the second.


This should be the full code:

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;
   }
}

Upvotes: 3

dotnetstep
dotnetstep

Reputation: 17485

Your problem is with cmd object. That object is used many time and each time you have updated same object. In such case it may possible that you might add same parameter twice.

Instead of that try to get command following way

Command cmd = conn.CreateCommand();

//Now use your cmd over here.

Upvotes: 0

Related Questions