我一直在为这个问题烦恼太久,但由于我没有得到任何确定的答案,我会以更清晰的方式再次说明情况。
我有一个问卷调查,它允许管理员为每个类别添加不同的类别和不同的问题,因此对于每个类别的插入,我不能硬编码参数,因为我不知道用户将回答多少问题。
现在我有一个插入(或更新)一行的SP;
CREATE PROCEDURE [dbo].[insertResults]
@userId nvarchar(10),
@groupId INT ,
@questionId INT,
@answer INT
AS
BEGIN
SELECT * FROM answers
WHERE userId = @userId AND questionId = @questionId
IF @@ROWCOUNT=0
INSERT INTO answers
( userId,
groupId,
questionId,
answer
)
VALUES (
@userId,
@groupId ,
@questionId,
@answer
)
ELSE
UPDATE answers
SET answer = @answer
WHERE userId = @userId AND questionId = @questionId
END
然后在C#中循环遍历所有问题;
foreach (GridViewRow gvr in GridView1.Rows)
{
var rb = gvr.FindControl("answers_list") as RadioButtonList;
var quest = rb.SelectedValue;
if (quest == "")
{
quest = "0";
}
int questionId = Convert.ToInt32(GridView1.DataKeys[gvr.RowIndex].Values[0].ToString());
int groupId = Convert.ToInt32(GridView1.DataKeys[gvr.RowIndex].Values[1].ToString());
int question = Convert.ToInt32(quest);
var objDB01 = new dbconn();
const string strSQL = "insertResults";
objDB01.objCommand.Parameters.AddWithValue("@userId", logonName);
objDB01.objCommand.Parameters.AddWithValue("@groupId", groupId);
objDB01.objCommand.Parameters.AddWithValue("@questionId", questionId);
objDB01.objCommand.Parameters.AddWithValue("@answer", question);
try
{
objDB01.GetNonQuery(strSQL);
}
finally
{
objDB01.Dispose();
}
}
我问过我自己的服务器团队是否打开和关闭数据库这么多次编码不好(有时可能有100多人同时回答100多个问题)但我无法得到答案。我在这里问过是否有更有效的解决方案,或者在这种情况下使用LINQ可以提高性能 - 但我无法得到答案。
我可能没有这方面的知识,但我正在努力学习优雅的程序,并且非常感谢您的帮助!
答案 0 :(得分:2)
我假设该应用程序是基于Web的asp.net。
在这种情况下,asp.net将使用连接池,因此当你可能在代码中打开和关闭许多连接时,实际上,.NET只使用一定数量的连接,并重新使用它们你需要它们。
如果目标是减少SQL服务器上的负载,我建议像Web服务那样收集响应,然后将它们批处理到SQL服务器,而不是直接发布每个单独的服务器。网站本身。
答案 1 :(得分:0)
答案取决于它。
如果在一个操作中插入/更新多个问题(使用linq或使用存储过程),速度会更快。但是,您可能需要针对每个问题更新它,因此如果用户断开连接,他们就不会丢失工作。
答案 2 :(得分:0)
您实际上不需要在foreach循环中重新创建连接对象,您可以为所有行重用现有连接。
至于重新连接的影响实际上没有,因为ADO.Net使用连接池,这意味着当您从DB断开连接时,ADO子系统会保持连接打开,以便将来重用另一个可能的连接对象。
对于LINQ,它用于查询可查询对象,而不是像在用例中一样进行更新。
答案 3 :(得分:0)
如果你说的是100人(而不是拥有数百万用户的网站),我认为你很好。除非您看到SQL Server实例受到影响,否则不要进行过早优化。
正如@Jroc所说,SQL Server重用了相同的连接池,因此您不必担心打开和关闭连接。 SQL Server旨在实现这一目标,实际上最好在完成连接后关闭连接,而不是冒险在某处打开连接。
至于LINQ,它在这种情况下没有给你任何性能优势(实际上,对于插入和更新,LINQ to SQL往往完全按照你正在做的那样做,并且每行发出一次插入/更新)
关于存储过程的最后一件事:如果您使用的是SQL 2008,您可能需要查看MERGE command,它将您的逻辑组合起来“检查行是否存在,如果是,则更新,如果不要在一个命令中插入may improve performance(和可读性)