【问题标题】:Escape Character for SQL in C#C#中SQL的转义字符
【发布时间】:2014-04-29 21:10:32
【问题描述】:

我想在我的 C# 代码中添加一个简单的选择语句。示例如下所示。 fname 中的 y 等值来自一个参数。 //从 myTable 中选择 lname 其中 fname = 'y'

这就是我正在做的事情。我显然得到了 Sql 异常。我该如何纠正?谢谢。

string strOrdersOrigSQL = "SELECT LastName FROM Employees";
// Concatenate the default SQL statement with the "Where" clause and add an OrderBy clause
       strOrdersSQL = strOrdersOrigSQL + "where FirstName ="+ 'strFname';

【问题讨论】:

  • 在 sqlcommand 中使用 sql 参数

标签: c# .net


【解决方案1】:

您不应该手动连接 sql 命令。使用类SqlCommand并添加参数

using (var cmd = new SqlCommand("SELECT LastName FROM Employees where FirstName = @firstName", conn))
{
   cmd.Parameters.AddWithValue("@firstName", strFname);
   var reader = cmd.ExecuteReader();
}

【讨论】:

  • 我觉得应该是 ExecuteScalar 或者 ExecuteReader
  • 人们仍然这样做,这让我感到震惊。
【解决方案2】:

从 C# 传递时不必担心 Sql 中的字符转义

Sql 帮你搞定

所有你需要做的事情:

string strOrdersOrigSQL = "SELECT LastName FROM Employees Where  FirstName = @FirstName" 

您可以通过 SqlParameter 传递 @FirstName 的值,这将保护您的查询免受 Sql 注入

【讨论】:

    【解决方案3】:

    您的查询的其他一些问题是您缺少空格并且引号位于字符串文字中:

    strOrdersSQL = strOrdersOrigSQL + " where FirstName = '"+ strFname + "'";
    //                                 ^                  ^               ^
    

    但如果变量包含引号字符或反斜杠,这仍然不起作用。

    您应该使用参数化查询,而不是试图转义字符串。

    【讨论】:

      【解决方案4】:

      但是可以这样做

      string strOrdersOrigSQL = "SELECT LastName FROM Employees";
      // Concatenate the default SQL statement with the "Where" clause and add an OrderBy clause
             strOrdersSQL = strOrdersOrigSQL + " where FirstName ='"+ strFname + "'";
      

      这不是正确的做法,因为它可能会受到 SQL 注入的影响。请改用参数化查询。

      【讨论】:

        【解决方案5】:

        首先,使用SqlCommand。但是如果选择直接写SQL,只要对输入进行转义就可以了。你应该非常小心,并且知道你在做什么。否则,您的代码会显示SQL Injection。这是正确的代码:

        string strOrdersOrigSQL = "SELECT LastName FROM Employees ";
        // Concatenate the default SQL statement with the "Where" clause and add an OrderBy clause
        strOrdersSQL = strOrdersOrigSQL + "where FirstName = '" + strFname.Replace("'", "''") + "'";
        

        假设 strFname 是一个变量。

        【讨论】:

        • 是的,作为用户,我要做的第一件事就是将我的名字写成“';从员工中删除;” :)
        • 我会使用 "; TRUNCATE TABLE EMPLOYEES;" :P 无日志记录且速度快
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-05
        • 2016-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多