带有单引号的字符串字段在表中插入记录时会导致错误

Som*_*ody 0 c# sql

我有下面的代码:

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();
Run Code Online (Sandbox Code Playgroud)

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

有没有办法解决这个问题,而不从字符串中删除单引号?

我尝试使用以下但没有工作:

cmd.CommandText = @query
+ @ListOrdStatusTopInRB[i].ShipName + "',"
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Jon*_*eet 12

有没有办法解决这个问题,而不从字符串中删除单引号?

是 - 改为使用参数化SQL.你应该永远不会直接在这样的SQL使用变量值.它可以允许SQL注入攻击,导致转换奇怪,并且通常使SQL更难以阅读.

有关参数化SQL的示例,请参阅文档SqlCommand.Parameters.

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

INSERT INTO SomeTable(Foo, Bar) VALUES (@Foo, @Bar)
Run Code Online (Sandbox Code Playgroud)

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