2011-08-19 60 views
3

我有问题解答;没有正确或错误的答案,只是“专家,中级,初学者”,其值为3,2,1。用于最有效解决方案的C#或SQL

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

我试过编写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

没有看到您的SQL查询和使用的表,有点难以推测。也许你可以添加更多的细节,然后标记重新打开。 – Kev

+0

如何重新打开问题?我只是问,是否循环遍历上面的代码几十次,每次打开和关闭数据库连接都是糟糕的编程。我对LINQ的评论很感兴趣,因为我没有使用过它,在一个没有LINQ的好处的.Net2直接运行到.Net4的环境中工作。 – Alex

+0

问题是1.你没有告诉我们足够的数据(告诉我们你的表)2.你不告诉我们SQL查询是什么样的3.你不告诉我们有多少行返回和在那个循环中被处理。这就是你需要在任何人有机会回答之前展开的,而不必猜测你所做的事情是否值得优化。当谈到在这里提出问题时,魔鬼会详细介绍。 – Kev

回答

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/

+3

[引用需要]放在你的第一段 –

+1

这可能是他们的家居风格;但它并没有被普遍认为是一件坏事。我们始终使用var,因为我们知道类型是什么,它被认为更容易阅读,然后复制类型名称。 var itemList = GroupListProvider.GetItems();更好,那么IList itemList = GroupListProvider.GetItems(); –

+1

挂起,你说var变差,然后多个linq插入更快?哇... –

0

不是以关系格式存储数据,在这种情况下,最好将整个问题集存储为BLOB或XML,然后将数据序列化并反序列化e数据库。这种方法的缺点是数据无法从SQL预期查询,但它应该只是一个数据库操作来读取和写入数据库中的数据。

+0

考虑到这里的所有评论 - 主要是关于主题......我会重新提出我的问题。 – Alex

相关问题