2016-08-08 20 views
1

SQL ServerデータベースまたはMS Accessデータベースのいずれかを使用するプログラムがあります。MS AccessまたはSQL Serverのコード

私は同じコードでどちらかのデータベースを使用する方法を見つけようとしています。

SQL Serverの:

Using cmd As SqlCommand = New SqlCommand(SQLQuery, Connection) 
    Using rs As SqlDataReader = cmd.ExecuteReader 
     Do While rs.Read 
      ' Do something 
     Loop 
    End Using 
End Using 

MSアクセス:例として、あなたは、あなたが使っているものをDBに応じて、folowingを行うだろう私の場合は

Using cmd As OleDbCommand= New OleDbCommand(SQLQuery, Connection) 
    Using rs As OleDbDataReader= cmd.ExecuteReader 
     Do While rs.Read 
      ' Do something 
     Loop 
    End Using 
End Using 

を、私のような何かを実装することができこの:

Dim rs As New Object 
Dim con As Object 
Dim cmd As Object 
If SQL-Server Then 
    con = TryCast(conSQL-Server, SqlConnection) 
    cmd = New SqlCommand 
    rs = TryCast(rs, SqlDataReader) 
Else 
    con = TryCast(conMS-Access, OleDb.OleDbConnection) 
    cmd = New OleDb.OleDbCommand 
    rs = TryCast(rs, OleDb.OleDbDataReader) 
End If 
Try 
    With cmd 
     .Connection = con 
     .CommandText = SQLQuery 
     rs = .ExecuteReader 
    End With 
    Do While rs.Read 
     ' Do something 
    Loop 
Catch ex As Exception 
    ' Handle Error   
Finally 
    If Not rs Is Nothing Then 
     If Not rs.IsClosed Then rs.Close() 
     rs.Dispose() 
    End If 
    cmd.Dispose() 
End Try 

しかし、それは面倒です。

If SQL-Server Then 
    DBCommand = SqlCommand 
    DBReader = SqlDataReader 
Else 
    DBCommand = OleDbCommand 
    DBReader = OleDbDataReader 
End 
Using cmd As DBCommand = New DBCommand(SQLQuery, connection) 
    Using rs As DBReader = cmd.ExecuteReader 
     Do While rs.Read 
      ' Do something 
     Loop 
    End Using 
End Using 

任意のアイデアをお持ちの場合は、カスタムタイプを作成できます。

+0

インターフェイスとして扱った場合(たとえば、IDbCommand')、共通のインターフェイスを共有する必要があります。それは、特別なセットアップコードがある第2のシナリオと似ていますが、残りの部分を同じオブジェクトであるかのように扱います。データリーダーにはIDataReaderなどがあります。 – ps2goat

+0

その例がありますか?私はそれを調べましたが、本当に何も見つかりませんでした。 –

+0

ここには単純な例があります。https://msdn.microsoft.com/en-us/library/system.data.idbconnection(v=vs.110).aspxこれは、さまざまな種類のコマンドを'IDbCommand'。このアプローチは、あなたが望むアプローチを満たすためにスケールアウトすることができます。 – ps2goat

答えて

0

私は答えを発見:

Dim con As IDbConnection 
If SQL-Server Then 
    con = conSQL-Server 
Else 
    con = conMS-Access 
End If 
Using cmd As IDbCommand = con.CreateCommand() 
    cmd.CommandText = SQLQuery 
    Using rs As IDataReader = cmd.ExecuteReader 
     Do While rs.Read() 
      ' Do something 
     Loop  
    End Using 
End Using 

それはあまりにも悪いCreateCommandは、パラメータを取らないのです。

+0

キャストは必要ありません。もしあなたがしたら、実際の型ではなく 'IDbConnection'にキャストします。 – ps2goat

+0

あなたが正しいです、キャストは必要ありません。 –

関連する問題