次の方法で共有


MS Access と SQL Server への接続方法の違いについて

サンプル コードのダウンロード (vbmigtips_SQLvsAccessConnect.msi, 1.07 MB)

※ このサンプルをインストールするには Visual Studio 2005 が必要です。

Visual Basic 2005 では、MS Access と SQL Server を同様の実装で接続できるようになりました。そこで今回は、Visual Basic .NET と Visual Basic 2005 でのデータベースへの接続方法の違いについて紹介します。

以前の Visual Basic .NET で SQL Server データベースへの接続を行う場合、System.Data.SqlClient を使用し、Access などで作成したデータベースへの接続を行う場合は、System.Data.OleDb を使用します。そのため、図1 のように SQL Server データベースと Access データベースへの接続を切り替え、データを取得する場合、データベースごとに異なる実装を行う必要があります。


 図 1

SQL Server データベースへの接続およびデータの読み込みを行う場合、SQL Server データベースがアタッチされている必要があります。実装コードは以下のとおりです。

Imports System.Data.SqlClient
Imports System.Data.OleDb
Private Sub RadioButton1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged, RadioButton2.CheckedChanged
    If CType(sender, RadioButton).Checked = True Then
        If CType(sender, RadioButton).Text = "SQL Server" Then
            Dim sConn As SqlConnection
            Dim sda As SqlDataAdapter
            Dim ds As New DataSet
			
            sConn = New SqlConnection("Data Source=.\SQLEXPRESS;Database=IndividualList;Integrated Security=SSPI")
            sda = New SqlDataAdapter("SELECT * FROM Information", sConn)
            sConn.Open()
            sda.Fill(ds)
            DataGrid1.DataSource = ds.Tables(0)
            sConn.Close()
        Else
            Dim oConn As OleDbConnection
            Dim oda As OleDbDataAdapter
            Dim ds As New DataSet
			
            oConn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=...\Databases\IndividualList.mdb")
            oda = New OleDbDataAdapter("SELECT * FROM Information", oConn)
            oConn.Open()
            oda.Fill(ds)
            DataGrid1.DataSource = ds.Tables(0)
            oConn.Close()
        End If
    End If
End Sub

リスト 1

上記(リスト1)の「sConn = New SqlConnection("Data Source=.\SQLEXPRESS;Database=IndividualList;Integrated Security=SSPI")」では、SQL Server データベースへの接続を行い、「sConn.Open()」でデータベース接続を開きます。「sda.Fill(ds)」で、DataSet にデータを読み込み、「DataGrid1.DataSource = ds.Tables(0)」で、DataSet に格納されたテーブルデータを DataGrid に書き込みます。最後に、「sConn.Close()」で SQL Server データベースから接続を切断します。

「oConn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=...\Databases\IndividualList.mdb")」では、データベースへの接続を行い、「oConn.Open()」でデータベース接続を開きます。「oda.Fill(ds)」で DataSet にデータを読み込み、「DataGrid1.DataSource = ds.Tables(0)」で、DataSet に格納されたテーブルデータを DataGrid に書き込みます。最後に、「oConn.Close()」でデータベースへの接続を閉じます。

リスト1 を実装し、[SQL Server]を選択します。すると、図1 のように、SQL Server データベース(IndividualList)に接続し、データを読み込みます。さらに、図1 の状態で[MS Access]を選択すると、Access データベース(IndividualList.mdb)に接続し、データを読み込みます(図2)。


 図 2

このように、以前の Visual Basic .NET では、SQL Server データベースと MS Access データベースへの接続は、データベースごとに異なる実装をしなければなりませんでした。

しかし、Visual Basic 2005 では、DbProviderFactory クラスが新たに追加されたことにより、個々の固有のプロバイダ ファクトリを作成することで、同一のクラスやメソッドを使用して、データベースへの接続およびデータの読み込みができるようになりました。そこで続いては、Visual Basic 2005 でのデータベースへの接続および、データの読み込みの実装方法を紹介します。

まず、データベース接続によって開く SQL Server データベース(IndividualList.mdf)と Access データベース(IndividualList.mdb)をプロジェクトに追加します。そして、以下のコードを実装します。

Imports System.Configuration
Imports System.Data.Common
Private Sub RadioButton1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged, RadioButton2.CheckedChanged
    If CType(sender, RadioButton).Checked = True Then
        Dim strProviderName As String
        Dim strConnectionString As String
        If CType(sender, RadioButton).Text = "SQL Server" Then
            strProviderName = "System.Data.SqlClient"
            strConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\DB\IndividualList.mdf;Integrated Security=True;User Instance=True"
        Else
            strProviderName = "System.Data.OleDb"
            strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\DB\IndividualList.mdb;Persist Security Info=True"
        End If
        DataGridView1.DataSource = MyDataSet(strProviderName, strConnectionString).Tables(0)
    End If
End Sub
Private Function MyDataSet(ByVal providername As String, ByVal connectionString As String) As DataSet
    Dim myProvider As DbProviderFactory = DbProviderFactories.GetFactory(providername)
    Dim myConnection As DbConnection = myProvider.CreateConnection()
    myConnection.ConnectionString = connectionString
    myConnection.Open()
    Dim myAdapter As DbDataAdapter = myProvider.CreateDataAdapter()
    Dim myCommand As DbCommand = myProvider.CreateCommand()
    Dim myQuery As String = "SELECT * FROM Information"
    Dim dataSet As DataSet = New DataSet()
    myCommand.Connection = myConnection
    myCommand.CommandText = myQuery
    myAdapter.SelectCommand = myCommand
    myAdapter.Fill(dataSet)
    Return dataSet
End Function

リスト2

上記(リスト2)の「DataGridView1.DataSource = MyDataSet(strProviderName, strConnectionString).Tables(0)」では、MyDataSet メソッドによって取得したデータセットに格納されたテーブルのデータを DataGridView に書き込みます。

MyDataSet メソッドでは、DataSet にデータを格納し、それを返します。「Dim myProvider As DbProviderFactory = DbProviderFactories.GetFactory(providername)」で、プロパイダ クラスを作成します。「myConnection.ConnectionString = connectionString」で、データベースへの接続を開くために使用する接続文字列を指定し、「myConnection.Open()」で、データベース接続を開きます。「Dim myAdapter As DbDataAdapter = myProvider.CreateDataAdapter()」では DbDataAdapter クラス、「Dim myCommand As DbCommand = myProvider.CreateCommand()」では DbCommand クラスを実装しているプロバイダのクラスの新しいインスタンスをそれぞれ返します。そして、「myCommand.Connection = myConnection」で、DbCommand で使用される DbConnection を設定します。「myCommand.CommandText = myQuery」では、実行するテキスト コマンドを設定し、「myAdapter.SelectCommand = myCommand」で、データソース内のレコードを選択するコマンドを取得します。最後に、取得したコマンドを「myAdapter.Fill(dataSet)」で、DataSet に読み込みます。

リスト2 を実装し、[SQL Server]を選択すると、図3 のように、SQL Server データベース(IndividualList)に接続し、データを読み込みます。


 図 3

さらに、[MS Access]を選択すると、Access データベース(IndividualList.mdb)に接続し、データを読み込みます(図4)。


 図 4

このように、Visual Basic 2005 では、新たに DbProviderFactory クラスが追加されたことにより、汎用的にデータベースへの接続が行えるようになりました。