2

我想在我的 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';
4

5 回答 5

15

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

using (var cmd = new SqlCommand("SELECT LastName FROM Employees where FirstName = @firstName", conn))
{
   cmd.Parameters.AddWithValue("@firstName", strFname);
   var reader = cmd.ExecuteReader();
}
于 2012-07-17T17:56:26.307 回答
3

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

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

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

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

于 2012-07-17T17:59:32.880 回答
3

从 C# 传递时,您无需担心在 Sql 中转义字符

Sql 为你做

所有你需要做的就是:

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

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

于 2012-07-17T18:01:07.143 回答
1

但它可以这样做

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 注入的影响。请改用参数化查询。

于 2012-07-17T17:59:05.963 回答
0

首先,使用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 是一个变量。

于 2012-07-17T17:59:02.437 回答