根据数据库版本选择DataReader类型

Selecting DataReader type based on database version

我正在尝试根据异步函数中的数据库版本(Oracle 或 SQL)动态设置我的 DbDataReader。函数 GetReaderAsync 应该 return 是 DataReader 的类型,这样我就可以在我的其余操作中使用泛型 reader。这就是我的目的,所以不要觉得有义务修复这段可能基于错误想法的代码,但请提供示例代码来完成要求。 目前我遇到编译错误 ReadAsync is not a member of System.Threading.Tasks.Task(Of System.Data.Common.DbDataReader) 我相信我做错了什么,也许是在 GetReaderAsync 函数中。

 Using reader As Task(Of Common.DbDataReader) = ConnectionController.GetReaderAsync(command) ' CType(Await command.ExecuteReaderAsync(CommandBehavior.SequentialAccess), Oracle.DataAccess.Client.OracleDataReader)
                    While Await reader.ReadAsync() '<-- Compilation Error
                        If reader.HasRows Then
                        End If
                   End While
End Using



Public Shared Async Function GetReaderAsync(command As DbCommand) As Threading.Tasks.Task(Of DbDataReader)
        'Depending on the XML value provided in the [Provider], then select the appropriate connection from 
        'the object oSettings of the SettingsController. The SettingsController provides a structure called Provider to choose from
        If SettingsController.oSettings.Connection.provider.ToLower = SettingsController.Provider.Oracle Then
            Using reader As Oracle.DataAccess.Client.OracleDataReader = CType(Await command.ExecuteReaderAsync(CommandBehavior.SequentialAccess), Oracle.DataAccess.Client.OracleDataReader)
                command.ExecuteReader()
                Return reader
            End Using
        Else
            Using reader As SqlClient.SqlDataReader = CType(Await command.ExecuteReaderAsync(CommandBehavior.SequentialAccess), SqlClient.SqlDataReader)
                command.ExecuteReader()
                Return reader
            End Using
        End If
    End Function

像这样工作:

使用 reader 作为 Common.DbDataReader = 等待 command.ExecuteReaderAsync(CommandBehavior.SequentialAccess)

您可以使用界面 "System.Data.IDataReader"。我将它用于 MySql、MSSql 和 Sqlite。效果很好。