当我运行一个C#参数化查询来处理单引号时,它仍然会在单引号上抛出一个异常错误。我怎样才能做到这一点?

当我运行一个C#参数化查询来处理单引号时,它仍然会在单引号上抛出一个异常错误。我怎样才能做到这一点?,c#,sql-server,parameterized,C#,Sql Server,Parameterized,这是我的密码。。。对于没有单引号的输入数据,它工作得很好,但当我输入单引号并试图发布时,它崩溃了。我已经尝试了许多代码示例,这应该是可行的。任何帮助都将不胜感激 string SQLcommand = "UPDATE FirearmTracking SET LastName='" + @custData[2] + // lastName "', CitationNum='" + custData[1] + // citation "', FirstName='" + custData[3] +

这是我的密码。。。对于没有单引号的输入数据,它工作得很好,但当我输入单引号并试图发布时,它崩溃了。我已经尝试了许多代码示例,这应该是可行的。任何帮助都将不胜感激

string SQLcommand = "UPDATE FirearmTracking SET LastName='"
+ @custData[2] + // lastName
"', CitationNum='" + custData[1] + // citation
"', FirstName='" + custData[3] + // firstname
"', MiddleInitial='" + custData[4] + // mi
"' WHERE EventNum = '" + @custData[0] +  // eventNum
            "' ";
        // Create a new table
        DataTable FirearmTracking = new DataTable();

        // Grab the Connection String
        SqlConnection conn = Connections.GetDataFromDB();

        // Create a SqlCommand object
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = conn;
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = SQLcommand;

        cmd.Parameters.AddWithValue("@LastName", custData[2]);

        try 
        {
            conn.Open();
            cmd.ExecuteNonQuery();
        }
        catch (Exception)
        {
            throw new Exception("Data Layer - Customer Error...");
        }
        finally
        {
            conn.Close();
        }
        return null;  

你有这个问题,因为你需要通过加倍来避免单报价

请参阅此线程:


但无论如何,直接从用户输入执行查询、使用参数或存储过程是一种不好的做法。

您正在设置一个参数,但查询没有使用它

在查询中输入参数名称,而不是在值中串联:

string SQLcommand =
  "UPDATE FirearmTracking SET " +
  "LastName = @LastName, " +
  "CitationNum = @CitationNum, " +
  "FirstName = @FirstName, " +
  "MiddleInitial = @MiddleInitial " +
  "WHERE EventNum = @EventNum";
现在为它们添加参数:

cmd.Parameters.AddWithValue("@LastName", custData[2]);
cmd.Parameters.AddWithValue("@CitationNum", custData[1]);
cmd.Parameters.AddWithValue("@FirstName", custData[3]);
cmd.Parameters.AddWithValue("@MiddleInitial", custData[4]);
cmd.Parameters.AddWithValue("@EventNum", custData[0]);

仅使用参数。不是字符串连接。要么使用参数,要么将其转换为存储过程。它的当前状态非常混乱,并且易于SQL注入。因此,这不是一个“C#参数化查询”。它可能是一个“SQL Server参数化查询”,但查询本身与C#无关。用任何语言来说,你这样做都是个坏主意。就是这样!非常感谢。我看到的所有其他示例都是在Update命令的值字段前面放置@。。。今天我花了大约六个小时在这上面,我觉得我快疯了。再次感谢你。感谢你的快速回复,很高兴知道