多个存储过程调用或遍历数组?
Multiple stored procedure calls or loop through an array?
我目前正在根据存储在 table 中的值在报表网格上设置工具提示。我这样做是因为我有很多网格和很多工具提示,这使得在不更新源代码的情况下从一个地方管理它们变得很容易。
我的问题。以这种方式加载工具提示还是通过一次加载所有工具提示并循环遍历数组来加载它们更快?
似乎所有工具提示的一次 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();
更正一个 SP 调用,加载所有工具提示会更快,前提是 SP 设计得高效。
由于在应用程序处于 运行 时工具提示可能不会更改,因此我建议您将工具提示作为 Main 的 public 静态 属性 实际加载到您的应用程序中或程序或任何你的根 class 适用于你的应用程序。这将使工具提示对整个应用程序可用,并避免应用程序的不同部分必须调用不同的数据库来获取它们的工具提示。我还会在 属性 Get 方法中放置一个时间检查器,以便每隔几个小时刷新一次数据。
存储过程sp_ToolTipLookup
必须return至少数据ToolTip
和FieldName
,但你必须删除关于工具提示名称的过滤器在哪里条款..
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();
}
}
}
}
}
}
好吧,总结一下:
答案是目前收到的三个答案的组合。
一个 SP 加载所有工具提示
执行一次并使它们对应用程序可用。
谢谢大家。我希望我能 select 多个正确答案。
我目前正在根据存储在 table 中的值在报表网格上设置工具提示。我这样做是因为我有很多网格和很多工具提示,这使得在不更新源代码的情况下从一个地方管理它们变得很容易。
我的问题。以这种方式加载工具提示还是通过一次加载所有工具提示并循环遍历数组来加载它们更快?
似乎所有工具提示的一次 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();
更正一个 SP 调用,加载所有工具提示会更快,前提是 SP 设计得高效。
由于在应用程序处于 运行 时工具提示可能不会更改,因此我建议您将工具提示作为 Main 的 public 静态 属性 实际加载到您的应用程序中或程序或任何你的根 class 适用于你的应用程序。这将使工具提示对整个应用程序可用,并避免应用程序的不同部分必须调用不同的数据库来获取它们的工具提示。我还会在 属性 Get 方法中放置一个时间检查器,以便每隔几个小时刷新一次数据。
存储过程sp_ToolTipLookup
必须return至少数据ToolTip
和FieldName
,但你必须删除关于工具提示名称的过滤器在哪里条款..
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();
}
}
}
}
}
}
好吧,总结一下: 答案是目前收到的三个答案的组合。
一个 SP 加载所有工具提示
执行一次并使它们对应用程序可用。
谢谢大家。我希望我能 select 多个正确答案。