C# 是否有必要在使用String.Format()的DML语句中显式指定单引号?

C# 是否有必要在使用String.Format()的DML语句中显式指定单引号?,c#,sql,string,.net-1.1,dml,C#,Sql,String,.net 1.1,Dml,我想重构一些代码,如下所示: dSQL = "INSERT INTO inventory ( id, pksize, Description, supplier_id, UnitCost, UnitList," + " Qty, UPC, dept, subdept, upc_pack_size, supplier_item, bqu_id)" + " VALUES" + "('" + id +"'" + ", " + pksize + ",'" + des

我想重构一些代码,如下所示:

dSQL = "INSERT INTO inventory ( id, pksize, Description, supplier_id, UnitCost, UnitList," +
      " Qty, UPC, dept, subdept, upc_pack_size, supplier_item, bqu_id)" +
      " VALUES" + "('" + id +"'" + ", " + 
      pksize + ",'" + desc +"'" + 
      ",'" + supplierID +"'" + ", " + cost + ", " 
      + list + ", " + qty + 
      ",'" + UPC +"'" + ", " + dept + ", " + 
      subdept + ", " + UPCpkSize + 
      ",'" + supplierItem +"','" + redemption + "')";
……为此:

dSQL = string.Format(
      "INSERT INTO inventory ( id, pksize, Description, supplier_id, UnitCost, UnitList," +
      " Qty, UPC, dept, subdept, upc_pack_size, supplier_item, bqu_id)" +
      " VALUES {0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}, {11}, {12}",
      id, pksize, desc, supplierID, cost, list, qty, UPC, dept, subdept, UPCpkSize, supplierItem, redemption);
这种方法是否足够,或者我必须用单引号将格式值括起来

更新 我刚刚注意到,关于此代码,我添加了“很久以前”的注释:

// This works as a string.Format() assignment without param "?"s or single quotes because dSQL is not executed, it is simply passed to DBCommand for conditional display (if there is an exception)

如果所有值都是数字类型,如
int
decimal
bigint
等,则不需要将它们括在单引号中。 这段代码有效(我刚刚测试过)


代码中缺少起始大括号和结束大括号。

如果所有值都是数字类型,如
int
decimal
bigint
等,则不需要将它们括在单引号中。 这段代码有效(我刚刚测试过)


代码中缺少起始大括号和结束大括号。

如果它们是文本(char、nvarchar、varchar、nchar),则需要添加单引号,例如数字不是。测试它:)


不过,我建议您使用sql参数:)

如果它们是文本(char、nvarchar、varchar、nchar),则需要添加单引号,例如数字。测试它:)


但是我建议您使用sql参数:)

我建议使用参数

SqlParameter paramId  = new SqlParameter();
    paramId.ParameterName = "@id";
    paramId.Value         = 12345;
cmd.Parameters.Add(paramId);
这个

  • 将您从是否使用单引号的问题中解放出来
  • 保护您免受SQL注入攻击等
看看这篇文章,例如: 这将描述你如何做到这一点

使用参数化查询有三个步骤:

Construct the SqlCommand command string with parameters.
Declare a SqlParameter object, assigning values as appropriate.
Assign the SqlParameter object to the SqlCommand object's Parameters property.
在您的情况下,您的代码可能如下所示

第1步:

SqlCommand cmd = new SqlCommand(
                 "INSERT INTO inventory ( id, pksize, Description, supplier_id, UnitCost, UnitList, Qty, UPC, dept, subdept, upc_pack_size, supplier_item, bqu_id) " +
                 "VALUES" + "(@id, @pksize, [ ... AND YOU OTHER PARAMETERS ... ])";", conn);
第二步:

SqlCommand cmd = new SqlCommand(
                 "INSERT INTO inventory ( id, pksize, Description, supplier_id, UnitCost, UnitList, Qty, UPC, dept, subdept, upc_pack_size, supplier_item, bqu_id) " +
                 "VALUES" + "(@id, @pksize, [ ... AND YOU OTHER PARAMETERS ... ])";", conn);
对所有参数重复此操作

SqlParameter paramId  = new SqlParameter();
    paramId.ParameterName = "@id";
    paramId.Value         = 12345;
cmd.Parameters.Add(paramId);
第三步:

SqlCommand cmd = new SqlCommand(
                 "INSERT INTO inventory ( id, pksize, Description, supplier_id, UnitCost, UnitList, Qty, UPC, dept, subdept, upc_pack_size, supplier_item, bqu_id) " +
                 "VALUES" + "(@id, @pksize, [ ... AND YOU OTHER PARAMETERS ... ])";", conn);
对所有参数重复此操作

SqlParameter paramId  = new SqlParameter();
    paramId.ParameterName = "@id";
    paramId.Value         = 12345;
cmd.Parameters.Add(paramId);

我建议使用参数

SqlParameter paramId  = new SqlParameter();
    paramId.ParameterName = "@id";
    paramId.Value         = 12345;
cmd.Parameters.Add(paramId);
这个

  • 将您从是否使用单引号的问题中解放出来
  • 保护您免受SQL注入攻击等
看看这篇文章,例如: 这将描述你如何做到这一点

使用参数化查询有三个步骤:

Construct the SqlCommand command string with parameters.
Declare a SqlParameter object, assigning values as appropriate.
Assign the SqlParameter object to the SqlCommand object's Parameters property.
在您的情况下,您的代码可能如下所示

第1步:

SqlCommand cmd = new SqlCommand(
                 "INSERT INTO inventory ( id, pksize, Description, supplier_id, UnitCost, UnitList, Qty, UPC, dept, subdept, upc_pack_size, supplier_item, bqu_id) " +
                 "VALUES" + "(@id, @pksize, [ ... AND YOU OTHER PARAMETERS ... ])";", conn);
第二步:

SqlCommand cmd = new SqlCommand(
                 "INSERT INTO inventory ( id, pksize, Description, supplier_id, UnitCost, UnitList, Qty, UPC, dept, subdept, upc_pack_size, supplier_item, bqu_id) " +
                 "VALUES" + "(@id, @pksize, [ ... AND YOU OTHER PARAMETERS ... ])";", conn);
对所有参数重复此操作

SqlParameter paramId  = new SqlParameter();
    paramId.ParameterName = "@id";
    paramId.Value         = 12345;
cmd.Parameters.Add(paramId);
第三步:

SqlCommand cmd = new SqlCommand(
                 "INSERT INTO inventory ( id, pksize, Description, supplier_id, UnitCost, UnitList, Qty, UPC, dept, subdept, upc_pack_size, supplier_item, bqu_id) " +
                 "VALUES" + "(@id, @pksize, [ ... AND YOU OTHER PARAMETERS ... ])";", conn);
对所有参数重复此操作

SqlParameter paramId  = new SqlParameter();
    paramId.ParameterName = "@id";
    paramId.Value         = 12345;
cmd.Parameters.Add(paramId);

为什么会有什么不同?这两种方法都会产生一个字符串。问题背后的答案是:参数。同时使用
逐字字符串文字(
@
符号)将有助于可读性。为什么会有任何不同?这两种方法都会生成一个字符串。问题背后的问题的答案是:参数。此外,使用
逐字字符串文字(
@
符号)将有助于提高可读性。谢谢;见我的更新上面。谢谢;见我的更新上面。