多个存储过程调用或遍历数组?

Posted

技术标签:

【中文标题】多个存储过程调用或遍历数组?【英文标题】:Multiple stored procedure calls or loop through an array? 【发布时间】:2016-12-30 16:42:29 【问题描述】:

我目前正在根据存储在表格中的值在报表网格上设置工具提示。我这样做是因为我有很多网格和很多工具提示,这样可以轻松地从一个地方管理它们,而无需更新源代码。

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

似乎对所有工具提示的一次 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();

【问题讨论】:

这与您的问题无关,但don't prefix stored procedures with sp_ 为什么不在你的 SQL 中创建一个 SP 这样你就不必调用多个?! 女武神:我不知道这是什么意思? Thomas:谢谢,这实际上是另一个程序员留下的。标记字段“txtFieldofText”的人的山姆类型 【参考方案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();
                   
               
           
       
   

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

好的,总结一下: 答案是迄今为止收到的三个的组合。

一个 SP 加载所有工具提示

执行一次,然后将它们提供给应用程序。

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

【讨论】:

以上是关于多个存储过程调用或遍历数组?的主要内容,如果未能解决你的问题,请参考以下文章

js:数组(创建遍历函数)

如何遍历数组中的多个字符串

遍历数组元素的方法

关于js中伪数组

JS-数组与伪数组

关于oracle 存储过程 如何切割一个字符串 转化为字符数组,然后遍历该数组: 类似ab,12;cd,55;k,7