从代码运行时存储过程超时,但不从查询工具运行

Bla*_*lls 6 c# sql-server stored-procedures

我试图弄清楚为什么存储过程调用在SQL Server express查询窗口中需要几秒钟,但是当我运行时,在代码中调用存储过程查询TIMES OUT.我们正在使用sql server 2008.我知道很难在没有看到存储过程的情况下确切地说明发生了什么.我只是希望这是一个已知的问题.任何指导都非常感谢.

在SQL Server express查询窗口中调用"STORED_PROCEDURE_X"并在2秒内运行的SQL查询:

EXEC STORED_PROCEDURE_X '07/01/2010', '07/31/2010', 0, '', 'true','', 'Top 20'
Run Code Online (Sandbox Code Playgroud)

调用"STORED_PROCEDURE_X"和TIMES OUT的代码:

SqlConnection connSQL = null;
SqlCommand sqlCmd = null;
SqlDataAdapter sqlDataAdpater = null;
DataTable returnData = null;

try
{
    returnData = new DataTable();
    connSQL = new SqlConnection(sqlConnection);
    sqlCmd = new SqlCommand("STORED_PROC_X", connSQL);
    if (connSQL.State == ConnectionState.Closed)
    {
        connSQL.Open();
    }
    sqlCmd.CommandType = CommandType.StoredProcedure;
    sqlCmd.CommandTimeout = 600;
    sqlCmd.Parameters.Add("@StartDate", SqlDbType.NVarChar).Value = "07/01/2010";
    sqlCmd.Parameters.Add("@EndDate", SqlDbType.NVarChar).Value = "07/31/2010";

    sqlCmd.Parameters.Add("@AuditType", SqlDbType.Int).Value = "0";

    sqlCmd.Parameters.Add("@SortBy", SqlDbType.NVarChar).Value = "";

    sqlCmd.Parameters.Add("@IsClaimDepartment", SqlDbType.NVarChar).Value = "true";
    sqlCmd.Parameters.Add("@IdsList", SqlDbType.NVarChar).Value = "";
    sqlCmd.Parameters.Add("@ReportType", SqlDbType.NVarChar).Value = "Top 20";
    sqlDataAdpater = new SqlDataAdapter(sqlCmd);
    sqlDataAdpater.Fill(returnData);
    if (connSQL.State == ConnectionState.Open)
    {
        connSQL.Close();
    }
    return returnData;
}
catch (Exception ex)
{
    LogErrorMessages("ExecuteStoredProcedure", ex.Message);
    throw ex;
}
Run Code Online (Sandbox Code Playgroud)

收到的例外情况:

System.Data.SqlClient.SqlException: Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
Run Code Online (Sandbox Code Playgroud)

小智 10

因此,运行一个返回30条记录的存储过程在管理控制台中花了我00:00秒,但是当它加载到.net时花了我大约40秒,超过默认的30秒TimeOut.

我只是修改存储过程并重新运行ALTER PROCEDURE代码而不改变任何东西,问题立即得到解决.我没有关于此错误来源的更多详细信息,但至少它是一个非常快速的解决方案


小智 7

总是对我有很大帮助的是将“ with recompile ”选项添加到程序中。

http://technet.microsoft.com/en-us/library/ms190439.aspx

  • @GibralterTop 是的,除了“重新编译”可以防止参数嗅探,这样您就不必每次遇到问题时都删除并重新创建 (2认同)

Psy*_*der 1

您在存储过程中使用任何事务吗?未提交的事务将导致此确切的错误消息。