SQL select参数包含撇号

时间:2014-11-07 21:47:17

标签: c# sql sql-server parameters

我遇到包含字符串productName的{​​{1}}参数问题,在这种情况下,我只需检查db中是否存在productname和SKU。

我收到错误

  

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

我尝试了一些逃避字符的东西,也使用了类似但没有效果的作品。

这是我的代码:

Acreditors buye's something

这只是我感到SQL注意的样本

非常感谢你帮助我: 这是实际上工作良好的代码:

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();

3 个答案:

答案 0 :(得分:5)

您应该使用查询参数,然后您不需要转义特殊字符,如:

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 (可能来自用户输入),您应该使用SqlCommandBuilder.QuoteIdentifier,因为您无法传递表名参数/列名等。

还有一件事是对那些实现using接口的对象使用IDisposable语句。对于SqlConnection,将语句括在using中将确保在范围结束时关闭连接。在上述情况下,即使发生异常,连接也会在执行命令后关闭。

用于创建SQL查询的字符串连接对SQL注入是开放的。详细了解SQL Injection,请参阅SQL Injection attack prevention: where do I start

答案 1 :(得分:3)

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

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

然而受到SQL注入攻击。而是使用参数(作为奖励,你不需要逃避撇号):

string sql = "SELECT * FROM " + toDB + ".dbo.Products WHERE Name like @product and SKU= @sku";
SqlConnection connection = new SqlConnection(/* connection info */);
SqlCommand command = new SqlCommand(sql, connection);

command.Parameters.AddWithValue("@product",productName);
command.Parameters.AddWithValue("@sku",newSKU);

答案 2 :(得分:-1)

感谢所有人,这是工作代码:

    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;
        }