C# SQL select参数包含撇号

C# SQL select参数包含撇号,c#,sql,sql-server,parameters,C#,Sql,Sql Server,Parameters,我对productName参数有问题,该参数包含字符串AcrBuye's something,在本例中,我只需要检查数据库中是否存在productName和SKU 我犯了一个错误 “s”附近的语法不正确。 字符串“”后的未闭合引号 我尝试了一些转义字符的东西,也使用了like,但没有效果 这是我的代码: String query = "SELECT * FROM " + toDB + ".dbo.Products WHERE Name like '" + productName.Replace(

我对
productName
参数有问题,该参数包含字符串
AcrBuye's something
,在本例中,我只需要检查数据库中是否存在productName和SKU

我犯了一个错误

“s”附近的语法不正确。
字符串“”后的未闭合引号

我尝试了一些转义字符的东西,也使用了like,但没有效果

这是我的代码:

String query = "SELECT * FROM " + toDB + ".dbo.Products WHERE Name like '" + productName.Replace("'","\'") + "' and SKU='" + newSKU+"'";

SqlConnection c = new SqlConnection(cs);
SqlCommand command = new SqlCommand(query, c);
c.Open();
object o = (object)command.ExecuteScalar();
c.Close();
这是我知道的唯一一个SQL注入示例,谢谢

非常感谢您对我的帮助: 这是实际运行良好的代码:

        string commandText = "SELECT * FROM " + toDB + ".dbo.Product WHERE Name= @prodName and SKU=@sku;";

        using (SqlConnection c = new SqlConnection(cs))
        {
            SqlCommand command = new SqlCommand(commandText, c);
            command.Parameters.Add("@prodName", SqlDbType.VarChar);
            command.Parameters["@prodName"].Value = productName;

            command.Parameters.Add("@sku", SqlDbType.VarChar);
            command.Parameters["@sku"].Value = newsku;

            c.Open();
            object o = (object)command.ExecuteScalar();
            c.Close();
            if (o != null)
                result = true;
        } 

对于SQL,您需要使用双引号

String query = "SELECT * FROM " + toDB + ".dbo.Products WHERE Name like '" + productName.Replace("'","''") + "' and SKU='" + newSKU+"'";
但是,这会受到SQL注入攻击。请改为使用参数(作为奖励,您不需要跳过撇号):


您应该在查询中使用参数,这样就不需要转义特殊字符,如:

using (SqlCommandBuilder sqlCommandBuilder = new SqlCommandBuilder())
{
    toDB = sqlCommandBuilder.QuoteIdentifier(toDB);
}


string query = "SELECT * FROM " + toDB + ".dbo.Products WHERE Name like @productName and SKU = @SKU";

using (SqlConnection c = new SqlConnection(cs))
using (SqlCommand command = new SqlCommand(query, c))
{
    c.Open();
    command.Parameters.Add(new SqlParameter("@productName", SqlDbType.VarChar) { Value = productName });
    command.Parameters.Add(new SqlParameter("@SKU", SqlDbType.VarChar) { Value = SKU });
    //or command.Parameters.AddWithValue("@productName", productName);

    object o = (object)command.ExecuteScalar();
}
由于您使用的是
toDB
(可能来自用户输入),因此应使用转义,因为您无法传递表名/列名等参数

还有一件事是将
using
语句与那些实现
IDisposable
接口的对象一起使用。在
SqlConnection
的情况下,将语句封装在
using
中将确保连接在作用域结束时关闭。在上述情况下,连接将在执行命令后关闭d、 即使是在例外情况下


创建SQL查询的字符串连接对SQL注入是开放的。请阅读更多信息并查看再次感谢所有人,这是工作代码:

    string commandText = "SELECT * FROM " + toDB + ".dbo.Product WHERE Name= @prodName and SKU=@sku;";

        using (SqlConnection c = new SqlConnection(cs))
        {
            SqlCommand command = new SqlCommand(commandText, c);
            command.Parameters.Add("@prodName", SqlDbType.VarChar);
            command.Parameters["@prodName"].Value = productName;

            command.Parameters.Add("@sku", SqlDbType.VarChar);
            command.Parameters["@sku"].Value = newsku;

            c.Open();
            object o = (object)command.ExecuteScalar();
            c.Close();
            if (o != null)
                result = true;
        } 

-您不应该将SQL语句连接在一起-使用参数化查询来避免SQL注入,而不是试图转义它,只需将撇号设置为双撇号“”…SQL将其视为单个。您知道SQL注入,但不知道避免SQL注入的相同模式也会删除您的pr撇号的问题使用SELECT*检查记录是否存在并不是一个好的做法。我会尝试在查询中使用IF EXISTS。您应该展示一个带有sql参数的示例,因为这不仅可以隐式修复此问题,而且还可以修复提到的sql注入漏洞。有很多示例可用我认为不应该扩大这个问题的范围。如果没有显示正确的方式,你就无意中助长了这个坏习惯,从而打击OP和未来的读者。
产品
sku
不确定是谁给了
+2
投票权。但是Sql Server中的参数期望
@
你应该在下面阅读wing@DJKRAZE,您实际上不需要SQLParameter的
@
前缀(当然,您在查询中需要它)。这很混乱,而且没有文档记录,但我最近不得不维护一些代码,这些代码始终没有使用@prefix,而且运行良好。
    string commandText = "SELECT * FROM " + toDB + ".dbo.Product WHERE Name= @prodName and SKU=@sku;";

        using (SqlConnection c = new SqlConnection(cs))
        {
            SqlCommand command = new SqlCommand(commandText, c);
            command.Parameters.Add("@prodName", SqlDbType.VarChar);
            command.Parameters["@prodName"].Value = productName;

            command.Parameters.Add("@sku", SqlDbType.VarChar);
            command.Parameters["@sku"].Value = newsku;

            c.Open();
            object o = (object)command.ExecuteScalar();
            c.Close();
            if (o != null)
                result = true;
        }