我将使用一个SQLDataReader来填充一个asp.net页面上的GridView (GridView1)。SQLDataReader在C# Codebehind中进行设置,如下所示:
string MySQLString;
MySQLString = "SELECT * FROM [vw_Report_Latest_v3_1] WHERE [FKID_Contract]=@Contract";
if ((string)Session["TSAreaString"] != "") { MySQLString = MySQLString + " AND [L1_Name]=@PA1"; }
if ((string)Session["TSSiteString"] != "") { MySQLString = MySQLString + " AND [L2_Name]=@PA2"; }
if ((string)Session["TSFeatureString"] != "") { MySQLString = MySQLString + " AND [L3_Name]=@PA3"; }
if ((string)Session["TSS1"] != "") { MySQLString = MySQLString + " AND [Spare1]=@S1"; }
if ((string)Session["TSS2"] != "") { MySQLString = MySQLString + " AND [Spare2]=@S2"; }
if ((string)Session["TSS3"] != "") { MySQLString = MySQLString + " AND [Spare3]=@S3"; }
if ((string)Session["TSS4"] != "") { MySQLString = MySQLString + " AND [Spare4]=@S4"; }
if ((string)Session["TSS5"] != "") { MySQLString = MySQLString + " AND [Spare5]=@S5"; }
if ((string)Session["TSTaskString"] != "") { MySQLString = MySQLString + " AND [Operation_Name]=@PA4"; }
if ((string)Session["TSTeamString"] != "") { MySQLString = MySQLString + " AND [Team_Name]=@Team"; }
//finish
MySQLString = MySQLString + " ORDER BY [OperationOrder], [L1_Name], [L2_Name], [L3_Name], [Operation_Name], [Team_Name]";
try
{
Conn.Open();
SqlCommand Cmd = new SqlCommand(MySQLString, Conn);
Cmd.Parameters.AddWithValue("@Contract", Convert.ToInt32(invCID.Text));
if ((string)Session["TSAreaString"] != "") { Cmd.Parameters.AddWithValue("@PA1", (string)Session["TSAreaString"]); }
if ((string)Session["TSSiteString"] != "") { Cmd.Parameters.AddWithValue("@PA2", (string)Session["TSSiteString"]); }
if ((string)Session["TSFeatureString"] != "") { Cmd.Parameters.AddWithValue("@PA3", (string)Session["TSFeatureString"]); }
if ((string)Session["TSS1"] != "") { Cmd.Parameters.AddWithValue("@S1", (string)Session["TSS1"]); }
if ((string)Session["TSS2"] != "") { Cmd.Parameters.AddWithValue("@S2", (string)Session["TSS2"]); }
if ((string)Session["TSS3"] != "") { Cmd.Parameters.AddWithValue("@S3", (string)Session["TSS3"]); }
if ((string)Session["TSS4"] != "") { Cmd.Parameters.AddWithValue("@S4", (string)Session["TSS4"]); }
if ((string)Session["TSS5"] != "") { Cmd.Parameters.AddWithValue("@S5", (string)Session["TSS5"]); }
if ((string)Session["TSTaskString"] != "") { Cmd.Parameters.AddWithValue("@PA4", (string)Session["TSTaskString"]); }
if ((string)Session["TSTeamString"] != "") { Cmd.Parameters.AddWithValue("@Team", (string)Session["TSTeamString"]); }
Cmd.Connection = Conn;
SqlDataReader reader = Cmd.ExecuteReader(CommandBehavior.CloseConnection);
GridView1.DataSource = reader;
GridView1.DataBind();
}
finally
{
if (Conn != null) { Conn.Close(); }
}
这给我带来了严重的问题。例如,如果我们通过给 TSAreaString 赋值来设置 L1_Name 为 "Town",它将显示所有 L1_Name 为 "Town" 的内容。这很好。因为 Town 很大,所以需要几秒钟的时间。
然而,如果我们把 L1_Name 设置为 "Town" 并且在此示例中将 TSS3 设置为 "County",那么它就需要更长的时间 - 有时甚至要超过一分钟 - 尽管它检索相同数量的记录或者有时是更少。
不幸的是,由于客户的规定,我们必须这样做 - 我们不能只搜索 "Town",我们必须搜索 "Town" 和 "County"。
这个视图 vw_Report_Latest_v3_1 运行得非常好。即使使用上述条件也没有任何问题。在 SQL Server 2008 中,仅通过视图的两种情况 - Town 和 Town AND County - 所需的时间相同。
我很确定这与读取/绑定有关。
using
语句而不是try/finally
。你还应该将所有相关参数存储在一个对象中,然后将该对象存储在Session中,而不是将大量单独的对象存储在Session中。最后,你不应该在代码后台进行数据库工作,你应该有一个单独的层来负责这个任务。 - masonAddWithValue()
的问题。有时候ADO.Net会猜测错误的参数类型,导致索引使用出现问题。 - Joel Coehoorn