【问题标题】:SqlConnection Time out error through ASP.NET WEB API通过 ASP.NET WEB API 的 SqlConnection 超时错误
【发布时间】:2015-02-25 23:37:39
【问题描述】:

我正在尝试从 ASP Web API 执行存储过程(查询)。我开发了它(命令超时为 300 秒)。

一开始,从Web API调用存储过程非常快,但是几天后调用同一个WEB API时,它给我超时错误(如下所示)。

同时,如果我尝试直接从 SQL Server Management Studio 同时使用相同的参数执行相同的存储过程,它会在几秒钟内执行。

代码:

public List<ScheduledTitles> GetScheduledTitles(CriteriaFields _criteria)
{
        try
        {
            System.Data.DataSet ds = new DataSet();
            SqlDataAdapter da = new SqlDataAdapter();

            using (SqlConnection con = new SqlConnection(_strDBConnection))
            {
                con.Open();
                SqlCommand comm = new SqlCommand();
                comm.Connection = con;
                comm.CommandText = "spQuery_1";
                comm.Parameters.Add(new SqlParameter() { ParameterName = "Product_Line_ID", SqlDbType = SqlDbType.Int, Value = _criteria.ProductLineID == null ? (object)System.DBNull.Value : _criteria.ProductLineID });

                comm.CommandType = CommandType.StoredProcedure;
                da.SelectCommand = comm;
                comm.CommandTimeout = 300;
                da.Fill(ds);
            }
            .
            .
            . 

            return scheduledTitlesS.ToList<ScheduledTitles>();
       }
       catch (Exception exc)
       { 
            throw exc;
       }
    }

错误信息:

在操作完成之前超时时间已过或服务器没有响应。
在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔 breakConnection,Action1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource
1 完成,Int32 超时,Task& 任务,布尔 asyncWrite)
在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔 returnStream,字符串方法)
在 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior 行为,字符串方法)
在 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior 行为,字符串方法)
在 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior 行为)
在 System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior 行为)
在 System.Data.Common.DbDataAdapter.FillInternal(DataSet 数据集,DataTable[] 数据表,Int32 startRecord,Int32 maxRecords,String srcTable,IDbCommand 命令,CommandBehavior 行为)
在 System.Data.Common.DbDataAdapter.Fill(DataSet 数据集,Int32 startRecord,Int32 maxRecords,String srcTable,IDbCommand 命令,CommandBehavior 行为)
在 System.Data.Common.DbDataAdapter.Fill(DataSet 数据集)
在 C:\Users\nah\Documents\Visual Studio 2010\Projects\HERS_SchedulerSearch\HERS_SearchQuery.Data\DataAccess\SQLServer 中的 HERS_SearchQuery.Data.DataAccess.SQLServer.HERSScheduleRepository.GetScheduledTitles(CriteriaFields _criteria)

【问题讨论】:

  • 有没有试过在填充dataadapter后关闭连接?
  • 就像蒂姆提到的,您的连接似乎没有关闭;这意味着连接数可能会占用您的 SQL 调用。在 Try Catch 语句中使用 con.Close() 和 finally
  • 请展示 _strDBConnection 的样子。确保“上下文连接 = false”
  • @Tim:我觉得不需要显式关闭连接,因为using (SqlConnection con = new SqlConnection(_strDBConnection)) 块将被转换为正常的 try.. finally 块由编译器在 finally 中调用 IDisposable 对象。
  • 首先,摆脱那个 try/catch 块。除了使它看起来异常来自“抛出”之外,它没有任何作用。其次,请将您的SqlCommandSqlDataAdapter 放入using 块中,看看会发生什么。

标签: c# sql-server asp.net-web-api sqlconnection sqlclient


【解决方案1】:

几年前我遇到过类似的问题,我通过使用选项解决了它

重新编译

在存储过程中。碰巧 SQL SERVER 正在缓存一个对所有参数都没有效率的执行计划。

当然我不知道这是否能解决你的问题,但我认为值得一试。

【讨论】:

    猜你喜欢
    • 2022-01-12
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 2017-12-04
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多