问题被分成不同的组,即数学,地理等。我建立了一个“内容管理系统”,允许管理员为每个组添加组和问题,因此我有一个未知的数字问题和小组。
我尝试过编写SQL来循环输入,但没有成功。我发现这样做的唯一方法是在C#中如下;
logonName = Session["user"].ToString();
foreach (GridViewRow gvr in GridView1.Rows)
{
var rb = gvr.FindControl("answers_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();
}
}
有更有效的方法吗?这会给服务器带来什么样的压力,因为一旦推出,可能会有数百名用户同时回答数百个问题?
答案 0 :(得分:0)
每当您决定将操作放在何处时,您都希望考虑哪个层/流程更适合它。
示例,对于数学运算,如果人们尝试在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("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);
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/
答案 1 :(得分:0)
不是以关系格式存储数据,在这种情况下,最好将整个问题集存储为BLOB或XML,然后从数据库中来回序列化和反序列化数据。这种方法的缺点是数据无法从SQL预期中查询,但它应该只是一个数据库操作来读取和写入数据库中的数据。