我已经以编程方式创建了RadGrid
并使用NeedDataSource
绑定了它 - > GetDataTable
。
在GetDataTable
内,我正在调用我的connstring并使用适配器填充网格(请参阅下面的代码)。问题是,在我的SQL Server中,查询需要0秒才能运行,但是在ASP.NET调试模式下,它需要大约3~5秒,在我的情况下,页面上有很多RadGrids,这导致我的页面加载缓慢。
adapter.Fill
的处理速度是一般性问题还是我对设置做错了? (即conn.open/close或其他任何订单)?
public DataTable GetDataTable(int Year, int month, string datatype)
{
String ConnString = ConfigurationManager.ConnectionStrings["IHG_MSTConnectionString"].ConnectionString;
SqlConnection conn = new SqlConnection(ConnString);
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = new SqlCommand("[Yield_Planner_With_Strategy]", conn);
adapter.SelectCommand.CommandType = System.Data.CommandType.StoredProcedure;
adapter.SelectCommand.Parameters.AddWithValue("@Holidex_Code", RadComboBox_Hotels.SelectedValue);
adapter.SelectCommand.Parameters.AddWithValue("@Event_Year", Year);
adapter.SelectCommand.Parameters.AddWithValue("@Event_Month", month);
adapter.SelectCommand.Parameters.AddWithValue("@DataType", datatype);
adapter.SelectCommand.Parameters.AddWithValue("@MktSeg", Fruitful.Get_Checked_Values_As_CSV(RadComboBox_MktSeg));
string exportdate = DateTime.Now.ToString("yyyy/MM/dd");
if (RadComboBox_ExportTimeStamp.Text != "" && RadComboBox_ExportTimeStamp.Text != "Create New Strategy")
{ exportdate = Convert.ToDateTime(RadComboBox_ExportTimeStamp.Text).ToString("yyyy/MM/dd"); }
adapter.SelectCommand.Parameters.AddWithValue("@ExportTimeStamp", exportdate);
DataTable myDataTable = new DataTable();
conn.Open();
try
{
adapter.Fill(myDataTable);
}
finally
{
conn.Close();
}
return myDataTable;
}
答案 0 :(得分:2)
为什么要为ExportTimeStamp
参数使用字符串?使用
DateTime
如果它是date
或datetime
列。
我还会将AddWithValue
的所有来电替换为Add
。当你致电AddWithValue
时,它必须猜测参数的类型是什么。如果它猜错了,优化器就无法选择正确的索引并回退到表扫描,这就说明了数据库性能的核心。
AddWithVaue
可能会导致多个查询计划。由于.NET不知道数据库列的大小是什么,因此它将使用变量的大小。因此,如果您有一个参数化查询并传入两个字符串,其中一个长度为10,另一个长度为20,则您将获得两个计划:@text nvarchar(10)
和@text nvarchar(20)
。它还会假设您的字段为nvarchar
时可能是varchar
,您将获得隐式转化。
因此,始终将正确的类型传递给AddWithValue
或(更好)使用具有正确类型和大小的SqlParameterCollection.Add
。它还会在将发送到数据库之前验证参数。
相关:
此外,使用using
- 语句可确保在您完成连接后立即关闭连接 - 即使出现错误。
以下是一个例子:
public DataTable GetDataTable(int Year, int month, string datatype)
{
DataTable myDataTable = new DataTable();
String ConnString = ConfigurationManager.ConnectionStrings["IHG_MSTConnectionString"].ConnectionString;
using(SqlConnection conn = new SqlConnection(ConnString))
using (SqlDataAdapter adapter = new SqlDataAdapter())
{
var cmd = new SqlCommand("[Yield_Planner_With_Strategy]", conn);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.Add("@Holidex_Code", SqlDbType.Int).Value = int.Parse(RadComboBox_Hotels.SelectedValue);
cmd.Parameters.Add("@Event_Year", SqlDbType.Int).Value = Year;
cmd.Parameters.Add("@Event_Month", SqlDbType.Int).Value = month;
cmd.Parameters.Add("@DataType", SqlDbType.VarChar).Value = datatype;
cmd.Parameters.Add("@MktSeg", SqlDbType.NVarChar).Value = Fruitful.Get_Checked_Values_As_CSV(RadComboBox_MktSeg);
DateTime exportdate = DateTime.Now;
if (RadComboBox_ExportTimeStamp.Text != "" && RadComboBox_ExportTimeStamp.Text != "Create New Strategy")
{
exportdate = DateTime.Parse(RadComboBox_ExportTimeStamp.Text);
}
cmd.Parameters.Add("@ExportTimeStamp", SqlDbType.DateTime).Value = exportdate;
adapter.SelectCommand = cmd;
// you don't need to open it with Fill
adapter.Fill(myDataTable);
}
return myDataTable;
}