如何延长 SQL 查询的超时时间

Posted

技术标签:

【中文标题】如何延长 SQL 查询的超时时间【英文标题】:How to extend the timeout of a SQL query 【发布时间】:2010-11-09 20:32:57 【问题描述】:

这不是连接超时,因为与数据库的连接正常。问题是我调用的存储过程花费的时间超过 30 秒并导致超时。

函数的代码如下所示:

SqlDatabase db = new SqlDatabase(connectionManager.SqlConnection.ConnectionString);
return db.ExecuteScalar(Enum.GetName(typeof(StoredProcs), storedProc), parameterValues);

ExecuteScalar 调用超时。如何延长此功能的超时时间?

对于快速存储过程,它可以正常工作。但是,其中一个功能需要一段时间并且调用失败。当以这种方式调用 ExecuteScalar 函数时,我似乎找不到任何方法来延长超时时间。

【问题讨论】:

好的,否决我的问题只是粗鲁。我的问题已经明确定义并且(希望)有答案。 【参考方案1】:

如果您正在使用 EnterpriseLibrary(看起来您正在使用),请尝试以下操作:

 Microsoft.Practices.EnterpriseLibrary.Data.Database db = Microsoft.Practices.EnterpriseLibrary.Data.DatabaseFactory.CreateDatabase("ConnectionString");
 System.Data.Common.DbCommand cmd = db.GetStoredProcCommand("StoredProcedureName");
 cmd.CommandTimeout = 600;
 db.AddInParameter(cmd, "ParameterName", DbType.String, "Value");

 // Added to handle paramValues array conversion
 foreach (System.Data.SqlClient.SqlParameter param in parameterValues) 
 
     db.AddInParameter(cmd, param.ParameterName, param.SqlDbType, param.Value);
 

 return cmd.ExecuteScalar();

编辑为直接基于 cmets 处理 paramValues 数组。我还包括了您的 ConnectionString 值:

Microsoft.Practices.EnterpriseLibrary.Data.Database db = Microsoft.Practices.EnterpriseLibrary.Data.DatabaseFactory.CreateDatabase(connectionManager.SqlConnection.ConnectionString);
System.Data.Common.DbCommand cmd = db.GetStoredProcCommand("StoredProcedureName", parameterValues);
cmd.CommandTimeout = 600;
return cmd.ExecuteScalar();

【讨论】:

嗯...我无权访问 ParameterNames。我的示例代码中的 parameterValues 变量被定义为“object[] parameterValues”。在不知道名称的情况下,我仍然可以添加参数吗? 我添加了将 paramValues 数组转换为 DbCommand 预期参数的代码。 不需要。您只需将其添加到 GetStoredProcCommand 命令即可。 不错的发现,已编辑以显示“正确”的解决方案。这解决了您的问题吗? 我还不确定。我刚刚进行了更改以进行测试,但它不起作用。我还在修修补补,解决后会报告。【参考方案2】:

您可以通过设置 SqlCommand.CommandTimeout 属性来做到这一点

【讨论】:

如果我使用 SqlCommand 会很好用……但是,我不是。 是的,你是。 SqlDatabase 不是标准数据提供者的一部分;这是一个有人写的包装类,内部会使用一个SqlCommand对象。 “某人”可能是微软——这是来自 Microsoft.Practices.EnterpriseLibrary 的 SQLDatabase 类吗? @Joel,该函数是在一个名为 Microsoft.Practices.EnterpriseLibrary.Data.dll 的文件中定义的,嗯……不确定我是否有源代码。正在搜索... 重写它以使用 db.CreateConnection();您将有 4-5 行额外的代码,但可以轻松访问 SqlCommand 对象。【参考方案3】:

我认为这可能是一种更好的方法(从 Enterprise Library 6.0 开始):

SqlDatabase db = new SqlDatabase(connectionManager.SqlConnection.ConnectionString);
System.Data.Common.DbCommand cmd = db.GetStoredProcCommand(storedProc, parameterValues);
cmd.CommandTimeout = 600;
return db.ExecuteScalar(cmd);

【讨论】:

谢谢哥们,这节省了我很多时间。非常感谢【参考方案4】:

试试这个

SqlConnectionStringBuilder connectionStringBuilder = new SqlConnectionStringBuilder(connection.ConnectionString);
connectionStringBuilder.ConnectTimeout = 180;
connection.ConnectionString = connectionStringBuilder.ConnectionString;

connection.Open();
SqlCommand command = new SqlCommand("sp_ProcedureName", connection);
command.CommandType = CommandType.StoredProcedure;
command.CommandTimeout = connection.ConnectionTimeout;
command.ExecuteNonQuery();
connection.Close();

【讨论】:

【参考方案5】:

Mladen 是对的,但如果你必须这样做,你可能会对 proc 本身有更大的问题。在负载下,它可能需要比您的新超时时间更长的时间。可能值得花一些时间在 proc 上进行优化。

【讨论】:

感谢您告诉我去优化我的应用程序。叹。从长远来看,这可能会发生,但今天我只需要让这件事运行起来。 我当然没有冒犯的意思。只是如果 SQL 超时,您不太可能找到适用于所有情况的超时 #。在许多情况下,您希望 SQL 超时,而默认值仍然很长。【参考方案6】:

由于 Microsoft 问题,可能会发生超时。我的 Windows 8 系统上似乎仍然存在。

http://support.microsoft.com/kb/2605597?wa=wsignin1.0

【讨论】:

以上是关于如何延长 SQL 查询的超时时间的主要内容,如果未能解决你的问题,请参考以下文章

如何在opencart中延长会话超时[重复]

如何在过期前延长asp.net中的会话超时

通过 .htaccess 在 PHP 中延长会话超时

通过 .htaccess 在 PHP 中延长会话超时

如何延长Azure自定义脚本扩展的默认超时时间?

无法延长 AWS 中 beanstalk 的超时时间