【发布时间】: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)1 完成,Int32 超时,Task& 任务,布尔 asyncWrite)
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
在 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 块。除了使它看起来异常来自“抛出”之外,它没有任何作用。其次,请将您的
SqlCommand和SqlDataAdapter放入using块中,看看会发生什么。
标签: c# sql-server asp.net-web-api sqlconnection sqlclient