我在下面的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();
答案 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版本实际上非常简单实用