多个存储过程调用或循环数组?

时间:2016-12-30 16:42:29

标签: c# performance coding-efficiency

我目前正在根据存储在表格中的值在报表网格上设置工具提示。我这样做是因为我有很多网格和大量的工具提示,这使得在不更新源代码的情况下从一个地方轻松管理它们。

我的问题。以这种方式加载工具提示或通过一次加载所有工具提示并循环遍历数组加载工具提示是否更快?

似乎所有工具提示的一个SP调用将快于10-20。这个假设是否正确?如果是这样,我可以看一个如何在数组或列表中执行此操作的示例吗?

            sqlconn.Open();
        SqlCommand com = new SqlCommand("sp_ToolTipLookup", sqlconn) { CommandType = System.Data.CommandType.StoredProcedure };
        SqlParameter pFieldName = new SqlParameter("@FieldName", "");
        for (int i = 0; i < rptgrid.Columns.Count; i++) 
        {
            pFieldName.Value = rptgrid.Columns[i].ToString();
            com.Parameters.Add(pFieldName); //adding the field name to the SP
            SqlDataReader data = com.ExecuteReader(); //Open the SP
            if (data.Read()) rptgrid.Columns[i].ToolTip = data["ToolTip"].ToString(); //If there is a resulting Tooltip, apply it to the grid
            data.Close();
            com.Parameters.Remove(pFieldName);
        }
        sqlconn.Close();

使用列表的示例更像是这样(如果这更快,我可能会在每个会话中加载一次列表并将其存储在内存中)。

sqlconn.Open();
        SqlCommand com = new SqlCommand("Select * from ToolTips", sqlconn) { CommandType = System.Data.CommandType.Text };
        SqlDataReader data = com.ExecuteReader();
        List<ToolTip> tips = new List<ToolTip>();
        while (data.Read())
        {
            tips.Add(new ToolTip { fieldname = data["FieldName"].ToString(), tooltip = data["ToolTip"].ToString() } );
        }



        for (int i = 0; i < rptgrid.Columns.Count; i++) //Changed to visible column to speed it up a bit.
        {
            for (int x = 0; x < tips.Count; x++)
            {
                if (rptgrid.Columns[i].Name == tips[x].fieldname)
                {
                    rptgrid.Columns[i].ToolTip = tips[x].tooltip;
                }
            }
        }
        data.Close();
        sqlconn.Close();

4 个答案:

答案 0 :(得分:1)

如果SP设计有效,更正一个SP调用加载所有工具提示会更快。

答案 1 :(得分:1)

由于在应用程序运行时工具提示可能不会改变,我建议您实际将工具提示作为Main或Program的公共静态属性或您的应用程序的任何根类加载到应用程序中。这将使整个应用程序可以使用工具提示,并避免应用程序的不同部分必须进行不同的数据库调用才能获得工具提示。我还在属性Get方法中放置了一个时间检查器,以便每隔几个小时刷新一次数据。

答案 2 :(得分:1)

存储过程sp_ToolTipLookup必须至少返回数据ToolTipFieldName,但您必须在where子句中删除有关工具提示名称的过滤器。

string connectionString = ... //web|app.config

using (SqlConnection sqlconn = new SqlConnection(connectionString)){
   using(SqlCommand com = new SqlCommand("sp_ToolTipLookup", sqlconn)){

       com.CommandType = System.Data.CommandType.StoredProcedure 

       sqlconn.Open();
       using (SqlDataReader data = com.ExecuteReader()){ //Call the SP

           while(data.Read()) {
               foreach(var col in rptgrid.VisibleColumns){
                   if (col.Name == data["FieldName"].ToString()){
                       rptgrid.VisibleColumns[col.Index].ToolTip = data["ToolTip"].ToString();
                   }
               }
           }
       }
   }
}

答案 3 :(得分:0)

好的总结一下: 答案是到目前为止收到的三个组合。

一个SP加载所有工具提示

执行此操作一次,然后将其提供给应用程序。

谢谢你们。我希望我能选择一个以上的正确答案。