【发布时间】:2015-04-10 13:47:13
【问题描述】:
我正在使用 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(); }
}
这给我带来了严重的问题。例如,如果我们将 L1_Name(通过给 TSAreaString 一个值)设置为“Town”,它将显示 L1_Name 为“Town”的所有内容。这很好,花花公子。需要几秒钟,因为它是一个大城镇。
但是,如果我们将 L1_Name 设置为“Town”并且将 TSS3(在本例中)设置为“County”,那么尽管检索的记录数量相同,或者有时更少,但它需要更长的时间 - 有时超过一分钟.
不幸的是,我们必须加入这个 - 我们不能只搜索“Town”,由于我们的客户强制要求,我们必须搜索“Town”和“County”。
从 - vw_Report_Latest_v3_1 运行的视图 - 运行得非常好。即使使用上述标准,也没有问题。两种方案 - Town 和 Town AND County,通过 SQL Server 2008 单独在视图上花费相同的时间。
我很确定这是某种阅读/绑定。
【问题讨论】:
-
你的代码读起来让我头疼。您应该使用
using声明而不是try/finally。您还应该将所有相关参数存储在一个对象中,并将 that 存储在 Session 中,而不是在 Session 中存储为大量单独的对象。最后,你不应该在后面的代码中做数据库工作,你应该有一个单独的层来负责。 -
如果是数据绑定问题,您可以测量执行查询的时间,以及执行数据绑定的时间……但这绝对不是数据绑定问题……一旦填充数据获取数据的查询是什么并不重要,只要它返回相同数量的数据。
-
运行SQL管理工作室生成的查询,查看执行计划。
-
必须承认我是这种 SQL 的新手。但是,我不认为 SQL 是答案 - 视图通过 SQL Management Studio 运行良好,即使有尽可能多的标准,并且通过上述代码隐藏运行正常。只是出于某种原因在 Codebehind 版本中添加了一个标准,这会减慢它的速度。
-
这可能是
AddWithValue()的问题。有时 ADO.Net 会以破坏索引使用的方式猜测错误的参数类型。
标签: c# sql asp.net data-binding sqldatareader