Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 应用程序中的Sql超时,但不在Sql Server Mgmt Studio中_C#_Sql Server_Ado.net_Timeout - Fatal编程技术网

C# 应用程序中的Sql超时,但不在Sql Server Mgmt Studio中

C# 应用程序中的Sql超时,但不在Sql Server Mgmt Studio中,c#,sql-server,ado.net,timeout,C#,Sql Server,Ado.net,Timeout,我有一个执行数据库搜索的相对复杂的存储过程。它有400行长,但是当我在SQLServerManagementStudio中使用一个搜索参数执行它时,它不会返回任何命中结果,大约需要1到3秒才能完成。执行返回几百行的搜索几乎需要相同的时间 但是,当我从调用此存储过程的web应用程序运行它时,使用完全相同的搜索参数,它基本上不会返回结果。我已经将连接和命令超时时间增加到5分钟,但仍然没有回来。事实上,在它抛出超时异常之前,需要花费我允许的5分钟时间 此超时发生在web服务器和我的工作站上,与生产数据

我有一个执行数据库搜索的相对复杂的存储过程。它有400行长,但是当我在SQLServerManagementStudio中使用一个搜索参数执行它时,它不会返回任何命中结果,大约需要1到3秒才能完成。执行返回几百行的搜索几乎需要相同的时间

但是,当我从调用此存储过程的web应用程序运行它时,使用完全相同的搜索参数,它基本上不会返回结果。我已经将连接和命令超时时间增加到5分钟,但仍然没有回来。事实上,在它抛出超时异常之前,需要花费我允许的5分钟时间

此超时发生在web服务器和我的工作站上,与生产数据库相反

对我可能遇到的问题有什么想法吗?代码是C#,我运行了Microsoft.Practices.EnterpriseLibrary代码以及直接的SqlClient代码,在using子句中运行,没有using子句。共有19个PARM,以下是我最新尝试的简化版本:

IList<QueryResultsItem> resultsItem = new List<QueryResultsItem>();

string connString = 
  "server=[servername];database=[dbname];uid=[userid];pwd=[psw];Connection Timeout=300";

SqlConnection conn = new SqlConnection(connString);
conn.Open();

SqlCommand cmd = new SqlCommand();
cmd.CommandTimeout = 300;
cmd.Connection = conn;
cmd.CommandText = "ap_tems_get_batch_history_list";
cmd.CommandType = CommandType.StoredProcedure;

SqlParameter parm = new SqlParameter();
parm.ParameterName = "@parm";
parm.Value = [value];
parm.Size = 3;
parm.SqlDbType = SqlDbType.Char;
cmd.Parameters.Add(parm);
...

SqlDataReader reader = cmd.ExecuteReader();
IList resultsItem=new List();
字符串connString=
“服务器=[servername];数据库=[dbname];uid=[userid];pwd=[psw];连接超时=300”;
SqlConnection conn=新的SqlConnection(connString);
conn.Open();
SqlCommand cmd=新的SqlCommand();
cmd.CommandTimeout=300;
cmd.Connection=conn;
cmd.CommandText=“ap\u tems\u get\u batch\u history\u list”;
cmd.CommandType=CommandType.storedProcess;
SqlParameter parm=新的SqlParameter();
parm.ParameterName=“@parm”;
参数值=[值];
标准尺寸=3;
parm.SqlDbType=SqlDbType.Char;
cmd.Parameters.Add(parm);
...
SqlDataReader=cmd.ExecuteReader();

我在web应用程序中遇到了很多此类超时问题。以下是我的发现

  • SSMS通过sql提供程序直接连接到数据库并对其执行
  • Web应用程序从IIS、业务层……到sql提供程序再到数据库,贯穿整个Microsoft堆栈。这是一个原因
  • 这是主要原因。您的C#代码构建参数,并通过数据库模式/元数据/信息检查过程与数据库对话,这需要相当长的时间。如果在SqlDataReader周围设置调试器断点,您将发现从数据库返回的大量元数据
  • 我的经验是,如果在SSMS中完成sql语句需要1秒以上,那么在web应用程序的默认设置中可能会出现超时问题。与插入或更新相比,它在选择中发生的频率更高

    我的解决方案:

  • 增加web.config中的超时值
  • 使用执行计划优化存储过程的性能
  • 避免使用SqlDataReader。使用SqlCommand进行插入和更新
  • 如果必须使用SqlDataReader,则返回前100条记录,而不是所有记录

  • 我接受你的答案是因为它包含了好的和有价值的建议——尽管我的问题一夜之间就消失了,事情开始按预期的方式进行。我花了整整八个小时在这件事上扭动,试图找出一个可能的原因,现在我确信网络上发生了一些事情。我要求用户密切关注天气情况,如果问题再次发生,请尽快通知我。那时候我会下楼,把我们的网络服务人员的头打个正着。像这样的废话是不会发生的。或者不应该。再次感谢@网络药剂师很高兴听到你的问题消失了。