【问题标题】:DataAdapter.fill(dataset) timeout exception on a specific database特定数据库上的 DataAdapter.fill(dataset) 超时异常
【发布时间】:2012-12-16 15:28:41
【问题描述】:

在 VB.NET 应用程序 (VS2005) 中,我通过 SQLDataAdapter 调用存储过程。 在我的本地数据库上一切正常。如果我在另一个数据库上执行此操作,则会出现超时异常。 这是代码:

  Public Overloads Shared Function ExecuteDataset( _
                                                    ByVal connection As SqlConnection, _
                                                    ByVal commandType As CommandType, _
                                                    ByVal commandText As String, _
                                                    ByVal ParamArray commandParameters() As SqlParameter) As DataSet
        If (connection Is Nothing) Then Throw New ArgumentNullException("connection")
        ' Create a command and prepare it for execution
        Dim cmd As New SqlCommand
        Dim ds As New DataSet
        Dim dataAdatpter As SqlDataAdapter
        Dim mustCloseConnection As Boolean = False

        dataAdatpter = Nothing

        PrepareCommand(cmd, connection, CType(Nothing, SqlTransaction), commandType, commandText, commandParameters, mustCloseConnection)
        cmd.CommandTimeout = 0 'I get a timeout exception if I leave this out
        Try
            ' Create the DataAdapter & DataSet
            dataAdatpter = New SqlDataAdapter(cmd)

            ' Fill the DataSet using default values for DataTable names, etc
            dataAdatpter.Fill(ds)

            ' Detach the SqlParameters from the command object, so they can be used again
            cmd.Parameters.Clear()
        Finally
            If (Not dataAdatpter Is Nothing) Then dataAdatpter.Dispose()
        End Try
        If (mustCloseConnection) Then connection.Close()

        ' Return the dataset
        Return ds
    End Function ' ExecuteDataset

我已经直接在数据库上执行了存储过程,并且运行良好且快速。 我还尝试将 cmd 的 CommandTimeout 属性设置为 0。 当我这样做时,存储过程会被执行,但这需要很长时间。 同样,如果我在本地数据库上工作,则没有问题。

这里是超时异常的stacktrace

at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
   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)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)
   at KlantenApplicatie.BL.DAL.SQLHelper.ExecuteDataset(SqlConnection connection, CommandType commandType, String commandText, SqlParameter[] commandParameters) in C:\BitProjects\teamsystem\gerher\KlantenApplicatie.BL.DAL\sqlHelper\SQLHelper.vb:line 545

有什么想法可能是造成这种情况的原因吗?

【问题讨论】:

  • 你能通过sql server连接那个数据库吗?
  • 是的,我什至用相同的参数在 sql server 中执行了存储过程,这工作正常。不过,应用程序中的连接字符串是加密的。但是所有其他功能都运行良好且快速,因此加密的连接字符串可以正常工作
  • 你能分享完整的代码来填充数据集吗?
  • 从你的代码中是不可能看到当你调用Fill时连接是否已经打开。可能连接已关闭,并且某些东西阻止它打开。如果您在 Try/Finally 中添加 catch 子句,您可以看到确切的错误消息并报告它。
  • 我的建议是......你只需在这里声明 SqlConnection 和 SqlCommand 手动设置连接字符串(解密)并测试它

标签: sql-server vb.net stored-procedures timeout


【解决方案1】:

我找到了解决办法。

原来是查询优化的参数嗅探问题。 我需要将 OPTION(RECOMPILE) 添加到创建存储过程的 sql 中。

这里解释了这个问题:

http://www.sqlmag.com/article/sql-server/-using-the-recompile-query-hint-to-solve-parameter-sniffing-problems-94369

这里:

http://social.technet.microsoft.com/Forums/en-US/sqldatabaseengine/thread/74a85e26-be9b-4830-9638-6aa30fd9e3e7

【讨论】:

    猜你喜欢
    • 2016-09-11
    • 2011-03-10
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多