【问题标题】:An exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dllSystem.Data.dll 中出现“System.Data.SqlClient.SqlException”类型的异常
【发布时间】:2013-12-01 07:37:43
【问题描述】:

当我执行下面的代码时,会出现此错误消息:

“'System.Data.SqlClient.SqlException' 类型的异常发生在 System.Data.dll 但未在用户代码中处理

附加信息:“=”附近的语法不正确。 "

这是代码:

string position;

SqlConnection con = new SqlConnection("server=free-pc\\FATMAH; Integrated Security=True; database=Workflow; ");
con.Open();
SqlCommand cmd = new SqlCommand("SELECT EmpName FROM Employee WHERE EmpID=" + id.Text, con);

SqlDataReader Read = cmd.ExecuteReader();

if (Read.Read()==true)
{
    position = Read[0].ToString();
    Response.Write("User Registration successful");
}
else
{
    Console.WriteLine("No Employee found.");
}

Read.Close(); 

这是什么原因造成的,我该如何解决?

【问题讨论】:

  • idTextBox提供的文字是什么?
  • 不要将输入连接到 SQL 中非常重要。使用参数。否则,它要么只是偶尔失败(希望你的公司没有O'Neil),要么会充当安全漏洞(参见:“bobby tables”)

标签: c# .net sql sql-server visual-studio-2013


【解决方案1】:

试试这个

SqlCommand cmd = new SqlCommand("SELECT EmpName FROM Employee WHERE EmpID=@id", con);
cmd.Parameters.AddWithValue("id", id.Text);

【讨论】:

    【解决方案2】:

    我认为您的EmpID 列是字符串,而您忘记在值中使用' '

    因为当你写EmpID=" + id.Text 时,你的命令看起来像EmpID = 12345 而不是EmpID = '12345'

    将您的 SqlCommand 更改为

    SqlCommand cmd = new SqlCommand("SELECT EmpName FROM Employee WHERE EmpID='" + id.Text +"'", con);
    

    或者作为一种更好的方式,您可以(并且应该)始终使用parameterized queries。这种字符串连接对SQL Injection 攻击开放。

    SqlCommand cmd = new SqlCommand("SELECT EmpName FROM Employee WHERE EmpID = @id", con);
    cmd.Parameters.AddWithValue("@id", id.Text);
    

    我认为您的 EmpID 列保留了您的员工 ID,因此它的类型应该是数字类型而不是字符。

    【讨论】:

      【解决方案3】:

      您的代码存在一些问题。首先,我建议使用参数化查询,以避免 SQL 注入攻击,并且参数类型也被框架发现:

      var cmd = new SqlCommand("SELECT EmpName FROM Employee WHERE EmpID = @id", con);
      cmd.Parameters.AddWithValue("@id", id.Text);
      

      其次,由于您只对查询返回的一个值感兴趣,因此最好使用ExecuteScalar

      var name = cmd.ExecuteScalar();
      
      if (name != null)
      {
         position = name.ToString();
         Response.Write("User Registration successful");
      }
      else
      {
          Console.WriteLine("No Employee found.");
      }
      

      最后一件事是将SqlConnectionSqlCommand 包装成using,这样它们使用的任何资源都将被处理掉:

      string position;
      
      using (SqlConnection con = new SqlConnection("server=free-pc\\FATMAH; Integrated Security=True; database=Workflow; "))
      {
        con.Open();
      
        using (var cmd = new SqlCommand("SELECT EmpName FROM Employee WHERE EmpID = @id", con))
        {
          cmd.Parameters.AddWithValue("@id", id.Text);
        
          var name = cmd.ExecuteScalar();
        
          if (name != null)
          {
             position = name.ToString();
             Response.Write("User Registration successful");
          }
          else
          {
              Console.WriteLine("No Employee found.");
          }
        }
      }
      

      【讨论】:

        【解决方案4】:

        System.Data.dll 中出现“System.Data.SqlClient.SqlException”类型的未处理异常

            private const string strconneciton = "Data Source=.;Initial Catalog=Employees;Integrated Security=True";
            SqlConnection con = new SqlConnection(strconneciton);
        
            private void button1_Click(object sender, EventArgs e)
            {
        
                con.Open();
                SqlCommand cmd = new SqlCommand("insert into EmployeeData (Name,S/O,Address,Phone,CellNo,CNICNO,LicenseNo,LicenseDistrict,LicenseValidPhoto,ReferenceName,ReferenceContactNo) values ( '" + textName.Text + "','" + textSO.Text + "','" + textAddress.Text + "','" + textPhone.Text + "','" + textCell.Text + "','" + textCNIC.Text + "','" + textLicenseNo.Text + "','" + textLicenseDistrict.Text + "','" + textLicensePhoto.Text + "','" + textReferenceName.Text + "','" + textContact.Text + "' )", con);
                cmd.ExecuteNonQuery();
                con.Close();
            }
        

        【讨论】:

          【解决方案5】:
          using (var cmd = new SqlCommand("SELECT EmpName FROM [Employee] WHERE EmpID = @id", con))
          

          在表名周围加上[] ;)

          【讨论】:

            【解决方案6】:

            使用 try-catch 来查看发生在你身上的真正错误

             try
            {
              //Your insert code here
            }
            catch (System.Data.SqlClient.SqlException sqlException)
            {
              System.Windows.Forms.MessageBox.Show(sqlException.Message);
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多