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

时间:2013-04-04 17:59:48

标签: 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包装真的要走了吗?必须有一个更好的方法(比我的“更好的方式”更好(除非它不起作用,这很好))。

1 个答案:

答案 0 :(得分:3)

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

例如,in C# Entity Framework你会做这样的事情:

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”表示n​​ull而不是“'NULL'”。

另外需要注意的是,您的第二个代码段在令牌周围没有单引号。但即使你让它“正常工作”,你仍然容易受到SQL注入的影响。最佳做法是使用参数化SQL。