【问题标题】:.Net SQLCommand times out when executing Stored Procedure which returns no records.Net SQLCommand 在执行不返回记录的存储过程时超时
【发布时间】:2011-04-01 00:47:41
【问题描述】:

不知道有没有人可以帮忙?

我有一个 SqlCommand 对象的问题,当它执行一个不返回任何记录的存储过程时,会超时。

存储过程并不复杂,它只是一个简单的SELECT ColumnA, ColumnB, ... FROM TableA WHERE Id = @Id 类型的东西。如果我在 Sql Managment Studio 中运行 SP,它会立即返回。

但是,当我尝试执行命令以填充 DataAdapter 或从“即时窗口”手动执行命令时 - 一旦创建并填充了参数,它总是会超时。

我使用 SqlCommandBuilder 的 DeriveParameters() 方法来填充 SqCommand 参数,然后遍历集合并填充值。然后我将 DataAdapter.SelectCommand 设置为 SqlCommand 的引用并调用 DataAdapter 的填充方法。

该代码似乎适用于任何返回数据的 SP,但在没有返回行时会出现问题。

有没有人遇到过这种情况,请给我指出正确的方向?

提前致谢, 问候, 杜安。

【问题讨论】:

  • 向我们展示您的代码将有助于我们为您提供答案。

标签: .net stored-procedures timeout sqlcommand dataadapter


【解决方案1】:
com = new SqlCommand("insert1",con);

com.CommandType = System.Data.CommandType.StoredProcedure;

com.Parameters.Add("@eno",eno.Text);
com.Parameters.Add("@ename",ename.Text);
com.Parameters.Add("@sal",sal.Text);
Response.Write(com.ExecuteNonQuery().ToString());

【讨论】:

    【解决方案2】:

    最后发现,代码的另一部分在我们正在读取的记录上打开了一个事务。

    多连接数据库的原因是因为该项目目前使用ADO和ADO.Net(这是一个非常大的项目,目前正在从VB6转换为.Net。还有很多遗留使用 ADO 进行数据访问)。 ADO 连接使事务保持打开状态,并且新的 ADO.Net 连接在事务结束之前无法读取,这只会在 ADO.Net 命令超时并引发错误并且 ADO 事务回滚之后发生!

    哇!

    感谢所有阅读和思考解决方案的人。感谢 Beth 的建议。

    问候, 杜安。

    【讨论】:

    • 好收获。 :) 感谢您最后发布您的解决方案。我在事务中修改了 SP,而 DeriveParameters 本身就超时了。
    【解决方案3】:

    查找命令超时属性并将其值设置为零。

        Dim cmd As SqlCommand
    
        cmd = New SqlCommand
        cmd.CommandText = spName
        cmd.CommandType = CommandType.StoredProcedure
        cmd.Connection = _sqlConn
        cmd.CommandTimeout = 0
    

    【讨论】:

    • 嗨,贝丝,谢谢您的建议。在这种情况下,命令超时属性设置为 15 秒,并且在 SSMS 中运行时的查询在眨眼间运行。只有从代码运行时才会超时。
    猜你喜欢
    • 2010-12-15
    • 2019-04-20
    • 1970-01-01
    • 2017-05-06
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    相关资源
    最近更新 更多