C#或SQL是最有效的解决方案

时间:2011-08-19 16:12:56

标签: c# sql loops

我有一个问卷;没有正确或错误的答案,只有“专家,中级,初学者”,其值为3,2,1。

问题被分成不同的组,即数学,地理等。我建立了一个“内容管理系统”,允许管理员为每个组添加组和问题,因此我有一个未知的数字问题和小组。

我尝试过编写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();
    }
}

有更有效的方法吗?这会给服务器带来什么样的压力,因为一旦推出,可能会有数百名用户同时回答数百个问题?

2 个答案:

答案 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预期中查询,但它应该只是一个数据库操作来读取和写入数据库中的数据。