【问题标题】:Why would using string.Format() break my sql?为什么使用 string.Format() 会破坏我的 sql?
【发布时间】:2013-04-04 17:59:47
【问题描述】:

这行得通:

dynSQL = "SELECT * FROM inventory WHERE vendor_item = '" + VendorItem + "' ";

...但这不是:

dynSQL = string.Format("SELECT * FROM inventory WHERE vendor_item = {0}", VendorItem);

后者导致“找不到表0”

这是另一个尝试美化代码的例子,让我从鞍座上跳到硬盘上。

将 where 子句 arg 包含在由外部单引号标记的双引号中真的是要走的路吗?必须有更好的方法(比我的“更好的方法”(这很好,除了它不起作用))。

【问题讨论】:

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

标签: sql sql-server-ce string-formatting string.format


【解决方案1】:

有更好的方法。无论您使用什么语言(您没有指定——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”代替“'NULL'”。

另外一个注意事项是,您的第二个代码 sn-p 没有单引号围绕令牌。但即使你让它“工作”了,你仍然容易受到 SQL 注入的影响。最佳做法是改用参数化 SQL。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多