我目前有这个功能(见下文),它将答案和相关内容(例如笔记)添加到50个左右的问题中。我试图通过将数据库更改为存储过程来使数据库安全,这样我就可以删除用户的写入权限。这是正确的做法吗?
我应该使用表值参数吗?或者我应该调用存储过程50次?前者感觉它是正确的,但后者在代码中看起来更好,尽管我认为效率低下?
或者......有更好的方法/方法吗?
int AddAnswersToTable()
{
var Cmd = Db.NewCommand();
var Str = new StringBuilder("INSERT INTO answers (qu_id,answer,notes) VALUES");
int i = 1;
string Join = string.Empty;
foreach (var Qu in Page)
{
Str.Append(Join);
Str.Append("(");
Str.Append((Name = "@qu_id" + i) + ",");
Cmd.Parameters.AddWithValue(Name, Qu.QuId);
Str.Append((Name = "@ans" + i) + ",");
Cmd.Parameters.AddWithValue(Name, Qu.Answer.Truncate(499));
Str.Append((Name = "@notes" + i) + ",");
Cmd.Parameters.AddWithValue(Name, Qu.Notes.Truncate(499));
Str.Append(")");
Join = ",";
i++;
}
return Cmd.ExecuteNonQuery(Str.ToString());
}
提前致谢。
答案 0 :(得分:1)
存储过程是否是正确的方法是宗教问题。我相信它是,FWIW。
调用程序50次更简单,但这两种方法都不是错误的。
答案 1 :(得分:1)
我没有使用表值参数,所以我不能说这是否可行。但另一种选择是使用SqlDataAdapter进行批量更新。 通过设置“UpdateBatchSize”属性,您可以一次发送多个值/行。
您可以在MSDN上阅读相关内容:http://msdn.microsoft.com/en-us/library/aadf8fk2%28v=vs.100%29.aspx
这是一篇使用存储过程的文章:http://www.dotnetspider.com/resources/4467-Multiple-Inserts-Single-Round-trip-using-ADO-NE.aspx