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 クラスが追加されたことにより、汎用的にデータベースへの接続が行えるようになりました。