【问题标题】:Runtime Error after Button click单击按钮后的运行时错误
【发布时间】:2015-01-10 14:51:23
【问题描述】:

这就是当我需要在我的数据库中创建用户时,你会看到它出现运行时错误,并且它仅在我单击按钮时出现。

只有当我点击页面上的按钮时才会出现问题。

这里有来自 opretbruger.aspx.cs 的 c# 代码

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

这里有来自 opretbruger.aspx 的 html

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

问题是它出现在这里输入这个:

“/”应用程序中的服务器错误。

运行时错误

描述:服务器上出现应用程序错误。目前的 此应用程序的自定义错误设置阻止了 远程查看应用程序错误(出于安全原因)。 但是,它可以被本地服务器上运行的浏览器查看 机器。

详细信息:启用此特定错误消息的详细信息 可在远程机器上查看,请在其中创建标签 位于根目录下的“web.config”配置文件 当前的网络应用程序。这个标签应该有它的 “mode”属性设置为“Off”。

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

注意:您看到的当前错误页面可以替换为 通过修改“defaultRedirect”属性来自定义错误页面 应用程序的配置标签指向一个自定义 错误页面网址。

<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 更新

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”。

【问题讨论】:

  • 从服务器控制台获取页面,或设置mode=Off 以获取完整的错误消息。把它放在这里,我们会看到。
  • @PatrickHofman 我在哪里添加它??我应该把它写到 web.config 中吗?我是 Asp.net 和 C# 的新手
  • 请。在错误消息中添加 XML 配置部分。
  • 错误是 变量名“@brugernavn”已经被声明。变量名称在查询批处理或存储过程中必须是唯一的。必须声明标量变量“@adgangskode”。
  • @PatrickHofman I 表示服务器上或以后没有 XML 文件。

标签: c# html asp.net


【解决方案1】:

您正在重复使用同一命令(名为 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;
   }
}

【讨论】:

  • ...并开始为 IDisposables 使用 using 块。
  • 停止使用AddWithValue :)
  • 确实如此。我认为 OP 几乎违反了所有规则。至少他确实使用参数:)
  • 您确定将两者分开吗?错误是否完全相同,在同一位置?
  • @JesperPetersen:抱歉,我想把它留在现场。您可以发布您当前的代码吗? (请更新您的答案)
【解决方案2】:

您的问题与 cmd 对象有关。该对象被多次使用,并且每次您更新相同的对象时。在这种情况下,您可能会添加两次相同的参数。

尝试按照以下方式获取命令

Command cmd = conn.CreateCommand();

//现在在这里使用你的cmd。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 2022-01-05
    相关资源
    最近更新 更多