Adapter.Fill需要很长时间

时间:2014-08-07 15:27:10

标签: c# asp.net

我已经以编程方式创建了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;
}

1 个答案:

答案 0 :(得分:2)

为什么要为ExportTimeStamp参数使用字符串?使用 DateTime如果它是datedatetime列。

我还会将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;
}