c#或SQL是最有效的解决方案
本文关键字:有效 解决方案 SQL | 更新日期: 2023-09-27 18:06:13
我有一份问卷;没有正确或错误的答案,只有值为3,2,1的"专家,中级,初学者"。
问题被分成不同的组,如数学、地理等。我建立了一个"内容管理系统",允许管理员为每个组添加组和问题,因此我有未知数量的问题和组。
我试了一次又一次地编写SQL来循环输入,但没有成功。我发现这样做的唯一方法是在c#中,如下所示;
logonName = Session["user"].ToString();
foreach (GridViewRow gvr in GridView1.Rows)
{
var rb = gvr.FindControl("answerswers_list") as RadioButtonList;
var quest = rb.SelectedValue;
if (quest == "")
{
quest = "0";
}
var questId = GridView1.DataKeys[gvr.RowIndex].Values[0].ToString();
var gpId = GridView1.DataKeys[gvr.RowIndex].Values[1].ToString();
int questionId = Convert.ToInt32(questId);
int groupId = Convert.ToInt32(gpId);
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();
}
}
有更有效的方法吗?这给服务器带来了什么样的压力,因为一旦推出,可能会有数百个用户同时回答数百个问题?
当你决定在哪里放置操作时,你要考虑哪个层/进程更适合它。
例如,对于数学运算,如果人们试图在SQL/Oracle服务器上做三角函数或繁重的数学函数,我会畏缩。从上面我可以看到,你有一个巨大的问题列表,你要把它们插入数据库,一次一个。
如果你打算使用LINQ,请完全使用它,看看这个链接:http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/1a2c5ae8-8671-4863-a278-164cc51bd7d2/
使用LINQ进行多次插入,因为这将使你的代码更容易阅读,并将给你一个性能提升。
保持和你原来的相似:
logonName = Session["user"].ToString();
string strSQL = "insertResults";
var objDB01 = new dbconn();
foreach (GridViewRow gvr in GridView1.Rows)
{
RadioButtonList rb = gvr.FindControl("answerswers_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);
objDB01.objCommand.Clear();
objDB01.objCommand.Parameters.AddWithValue("@userId", logonName);
objDB01.objCommand.Parameters.AddWithValue("@groupId", groupId);
objDB01.objCommand.Parameters.AddWithValue("@questionId", questionId);
objDB01.objCommand.Parameters.AddWithValue("@answer", question);
objDB01.GetNonQuery(strSQL);
}
//CLOSE YOUR CONNECTION if dispose does not directly invoke close.
objDB01.Dispose();
编辑:如果您正在寻找性能,并且要执行100次以上的插入,请考虑使用以下方法:http://blog.sqlauthority.com/2007/06/08/sql-server-insert-multiple-records-using-one-insert-statement-use-of-union-all/
在这种情况下,与其以关系格式存储数据,不如将整个问题集存储为BLOB或XML,然后在数据库中来回序列化和反序列化数据。这种方法的缺点是不能从SQL的角度查询数据,但是从数据库读取和写入数据应该只是一个数据库操作。