为什么使用string.Format()会破坏我的sql?

为什么使用string.Format()会破坏我的sql?,sql,sql-server-ce,string-formatting,string.format,Sql,Sql Server Ce,String Formatting,String.format,这项工作: dynSQL = "SELECT * FROM inventory WHERE vendor_item = '" + VendorItem + "' "; …但这并不是: dynSQL = string.Format("SELECT * FROM inventory WHERE vendor_item = {0}", VendorItem); 后者导致“找不到表0” 这是另一个试图美化代码的例子,它把我从马鞍上撞到了硬锅上 将where子句arg封装在由外部单引号标记的双引号中真

这项工作:

dynSQL = "SELECT * FROM inventory WHERE vendor_item = '" + VendorItem + "' ";
…但这并不是:

dynSQL = string.Format("SELECT * FROM inventory WHERE vendor_item = {0}", VendorItem);
后者导致“找不到表0”

这是另一个试图美化代码的例子,它把我从马鞍上撞到了硬锅上


将where子句arg封装在由外部单引号标记的双引号中真的是一种方法吗?必须有一个更好的方法(比我的“更好的方法”(这很好,只是它不起作用)更好。

有一个更好的方法。无论您使用何种语言(您没有指定--
string.Format
部分),都无疑支持参数化SQL执行。停止连接,而是使用参数

例如,您可以执行以下操作:

string esqlQuery = @"SELECT * FROM inventory WHERE vendor_item = @vendoritem";

using (EntityCommand cmd = new EntityCommand(esqlQuery, conn)) {
   EntityParameter vendoritem = new EntityParameter();
   vendoritem.ParameterName = "vendoritem";
   vendoritem.Value = VendorItem;

   cmd.Parameters.Add(vendoritem);
   // go on to execute it as shown in the above link
}
通过创建一个命令并执行它,一切都可以为您完成:参数放置和格式化,包括将字符串用单引号括起来并转义单引号,或者使用“NULL”代替“NULL”


另一个注意事项是,您的第二个代码段在标记周围没有单引号。但即使您让它“工作”,您仍然容易受到SQL注入的影响。最佳实践是使用参数化SQL。

有更好的方法。无论您使用何种语言(您没有指定--
string.Format
部分),都无疑支持参数化SQL执行。停止连接,而是使用参数

例如,您可以执行以下操作:

string esqlQuery = @"SELECT * FROM inventory WHERE vendor_item = @vendoritem";

using (EntityCommand cmd = new EntityCommand(esqlQuery, conn)) {
   EntityParameter vendoritem = new EntityParameter();
   vendoritem.ParameterName = "vendoritem";
   vendoritem.Value = VendorItem;

   cmd.Parameters.Add(vendoritem);
   // go on to execute it as shown in the above link
}
通过创建一个命令并执行它,一切都可以为您完成:参数放置和格式化,包括将字符串用单引号括起来并转义单引号,或者使用“NULL”代替“NULL”


另一个注意事项是,您的第二个代码段在标记周围没有单引号。但即使您让它“工作”,您仍然容易受到SQL注入的影响。最佳做法是使用参数化SQL。

第二个示例不包括{0}周围的单引号。故意的?我认为不需要他们;如果是的话,那就是问题所在。你为什么不认为需要它们呢?为什么不发布从字符串创建的SQL?让我们看看第二种情况下的
dynSQL
是什么样子,而不是仅仅给出错误消息,我们将看看它是否有意义,嗯?@ErikE:我想我是在期待,因为string.Format()通常“正常工作”,瞧,你不必告诉它:这是一个字符串,这是一个int,等等。它足够聪明,可以为你进行这些转换。我看我错了。
string.Format
转换成字符串很好。问题是,它对SQL一无所知,也不知道需要将结果字符串用单引号括起来。为什么会这样?如果每次都这样做,您将得到奇怪的输出。想象一下
string.Format(“您选择的数字是{0}.”,“9”)
--您是否希望
您选择的数字是“9”。
作为结果?您的第二个示例不包括{0}周围的单引号。故意的?我认为不需要他们;如果是的话,那就是问题所在。你为什么不认为需要它们呢?为什么不发布从字符串创建的SQL?让我们看看第二种情况下的
dynSQL
是什么样子,而不是仅仅给出错误消息,我们将看看它是否有意义,嗯?@ErikE:我想我是在期待,因为string.Format()通常“正常工作”,瞧,你不必告诉它:这是一个字符串,这是一个int,等等。它足够聪明,可以为你进行这些转换。我看我错了。
string.Format
转换成字符串很好。问题是,它对SQL一无所知,也不知道需要将结果字符串用单引号括起来。为什么会这样?如果每次都这样做,您将得到奇怪的输出。想象一下
string.Format(“您选择的数字是{0}.”,“9”)
——您希望
您选择的数字是“9”吗?