根据数据库版本选择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。效果很好。
我正在尝试根据异步函数中的数据库版本(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。效果很好。