使用配置更改默认的SqlCommand CommandTimeout而不是重新编译?

时间:2009-06-16 14:06:45

标签: asp.net sql-server-2005 .net-3.5 iis-6 windows-server-2003

我支持ASP.Net 3.5 Web应用程序,用户在尝试运行报告30秒后遇到超时错误。看看网络似乎很容易改变代码中的超时,遗憾的是我无法访问代码并重新编译。有没有为web应用程序,工作进程,IIS或整个机器配置默认值?

这是堆栈跟踪,直到它在System.Data中的位置,以防我错过了其他一些问题:

[SqlException (0x80131904): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.]
  System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +1948826
  System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +4844747
  System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) +194
  System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2392
  System.Data.SqlClient.SqlDataReader.ConsumeMetaData() +33
  System.Data.SqlClient.SqlDataReader.get_MetaData() +83
  System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +297
  System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +954
  System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +162
  System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32
  System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +141
  System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +12
  System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) +10
  System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +130
  System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior) +162
  System.Data.Common.DbDataAdapter.Fill(DataTable dataTable) +115

- 编辑

代码本身之外必须有一些东西 - 我已经下载了数据库并在测试服务器上安装的同一个网站上运行它,它运行时间超过30秒并返回报告。我在live和test上比较了.Net目录下的machine.config和web.config文件它们看起来是一样的,比较两个IIS设置,还看了一下SQL Server的配置,唯一的区别就是live服务器集群在64位W2K3上,而测试服务器则在32位上。

4 个答案:

答案 0 :(得分:14)

不幸的是,我过去读过的所有内容都说不,不能通过配置来控制。这是一个无赖。

答案 1 :(得分:3)

您不能从连接字符串或某些外部设置设置命令超时,抱歉。

有时驱动程序会将连接字符串中的'timeout'参数解释为连接超时和命令超时时间,但这在技术上是一个“错误”。一定要喜欢标准。

答案 2 :(得分:2)

我所知道的最好的是你可以在连接字符串中设置一个连接超时,它控制ADO在尝试连接到SQL Server时等待的时间,并且不会影响命令超时。

我个人认为应该有办法改变这个设置。假设这个组件并不强大,那么最好的选择可能是对代码进行反向工程,修改源代码并使用新名称重新部署程序集。

答案 3 :(得分:0)

虽然卷起自己并不太难?只需在AppSettings下创建自定义SqlCommandTimeout设置即可。如果您已经使用某种SqlCommandFactory来创建SqlCommand或者具有某种SqlCommand基类,那么您可以轻松地进行更改。如果没有,那么你可能不太关心你的代码,无论如何都想把它放在配置文件中。

此致 詹姆斯