【问题标题】:String field with single quotation mark is causing an error when inserting record in table在表中插入记录时,带单引号的字符串字段导致错误
【发布时间】:2013-10-11 20:19:16
【问题描述】:

我有以下代码:

query = "insert into tblB2B_OrderStatusTopStillInRB (LSRNbr, ShipName, Units, DroppedInRB, EPT, Status, OnTimeStatus, ShipVia, DroppedInRB_Order, RealEPT) ";
query += "values ('"
                    + ListOrdStatusTopInRB[i].LSRNbr + "','"
                    + ListOrdStatusTopInRB[i].ShipName + "',"
                    + ListOrdStatusTopInRB[i].Units + ",'"
                    + ListOrdStatusTopInRB[i].DroppedInRB + "','"
                    + ListOrdStatusTopInRB[i].EPT + "','"
                    + ListOrdStatusTopInRB[i].Status + "','"
                    + ListOrdStatusTopInRB[i].OnTimeStatus + "','"
                    + ListOrdStatusTopInRB[i].ShipVia + "','"
                    + ListOrdStatusTopInRB[i].DroppedInRB_Order + "','"
                    + ListOrdStatusTopInRB[i].RealEPT + "')";

cmd.CommandText = query;
cmd.ExecuteNonQuery();

我刚刚意识到,当ShipName 有一个带单引号的值时,会导致插入语句出错,例如:int'l Transp.

有什么方法可以解决这个问题,而不需要从字符串中删除单引号?

我尝试使用以下方法,但没有成功:

cmd.CommandText = @query
+ @ListOrdStatusTopInRB[i].ShipName + "',"

有什么想法吗?

【问题讨论】:

    标签: c# sql


    【解决方案1】:

    有什么方法可以解决这个问题,而不需要从字符串中删除单引号?

    是 - 改用参数化 SQL。您应该从不像这样直接在 SQL 中使用变量值。它可以允许SQL injection attacks,导致转换异常,并且通常会使 SQL 更容易阅读。

    有关参数化 SQL 的示例,请参阅 the documentation for SqlCommand.Parameters

    基本上,这个想法是您的 SQL 包含对参数的引用,例如

    INSERT INTO SomeTable(Foo, Bar) VALUES (@Foo, @Bar)
    

    然后您分别指定@Foo@Bar 的值。这些值不是 SQL 本身的一部分,因此它们是否包含在 SQL 中具有特殊含义的字符并不重要。

    【讨论】:

    • 请注意,例如,当您在 SSMS 中手动测试 insert 语句时,您可以使用两个连续的单引号指定一个单引号。但对于您所做的不仅仅是手动操作,参数是您应该采用的方法。
    猜你喜欢
    • 1970-01-01
    • 2012-06-24
    • 2013-06-05
    • 1970-01-01
    • 2015-02-15
    • 2013-01-17
    • 2011-07-04
    • 2017-06-16
    • 1970-01-01
    相关资源
    最近更新 更多