我遇到包含字符串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();
答案 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;
}