插入命令字符串构建

时间:2014-01-01 20:05:10

标签: c#

我在下面的insert命令字符串中找不到错误。如果你注意到,请告诉我。构建这种类型的命令字符串的最佳方法是什么。如果整个字符串显示为红色,则很难找到错误。 我用pm选择了每个数据值。手动避免任何机会或错误。

cmd = new OleDbCommand("insert into ProjectMaster (ProjectCode, TransactionType, Description, Justification, RequesterName, RquesterID) values ('" +
    pm.ProjectCode + "','" + pm.TransactionType + "','" +
    pm.Description + "','" + pm.Justification + "','" +
    pm.RequesterName + "','" + pm.RequesterID  + "')", con);

    cmd.ExecuteNonQuery();

3 个答案:

答案 0 :(得分:4)

  

构建此类命令字符串的最佳方法是什么。

您使用参数化SQL。 将要使用的值连接到SQL中。它为您打开SQL注入攻击,转换错误以及通常凌乱的代码。

您使用以下代码:

// Obviously fill in the "..." with the rest of the fields you need to use
string sql = "INSERT INTO ProjectMaster (ProjectCode, TransactionType, ...) "
           + "VALUES (@ProjectCode, @TransactionType, ...)";
using (var connection = new SqlConnection(...))
{
    connection.Open();
    using (var command = new SqlCommand(sql, connection))
    {
        // Check the parameter types! We don't know what they're meant to be
        command.Parameters.Add("@ProjectCode", SqlType.NVarChar).Value = ...;
        command.Parameters.Add("@TransactionType", SqlType.NVarChar).Value = ...;
        ...
        command.ExecuteNonQuery();
    }
}

另外,请考虑使用ORM而不是原始SQL。

答案 1 :(得分:2)

我认为您的错误可能就在这里

pm.ResourceCount + "','" + pm.IssueFlag) + "')"

应该是

pm.ResourceCount + "','" + pm.IssueFlag + "')")

基本上,在添加结束括号之前,您似乎正在关闭命令字符串。正如其他人所建议的那样,使用参数化SQL或其他数据访问技术而不是巨大的SQL字符串。

答案 2 :(得分:0)

如果您遇到必须编写在运行时构建字段列表的“通用代码”的情况。你仍然不应该按照你的方式编写代码(由于SQL注入等)。

这个previous answer有一些有用的建议,Linq版本实际上非常简单实用