You are hereデータベースに依存しない.NETプログラム

データベースに依存しない.NETプログラム


By Mel - Posted on 14 3月 2010

以前、私が働いていた会社には、データベースとしてMSAccessを使ったADO.NET 1.0アプリケーションがありました。それをSQLServerに移行する必要があったので、ソースを修正することになりました。それで私たちが行った対応として、データ・プロバイダによってSystem.Data.SqlClient名前空間(SQL Server用)、System.Data.OleDb名前空間(MSAccess用)を、それぞれ使い分けて、別々のコードを書きました。動いてはしましたが、あまりエレガントなソリューションではなかったです。

  1. If strDBMS = "MS SQL Server" Then
  2. Dim sqlCmd As SqlClient.SqlCommand
  3. sqlCmd = sqlCn.CreateCommand()
  4. sqlCmd.CommandText = pSQL
  5. Dim dr As SqlClient.SqlDataReader = sqlCmd.ExecuteReader()
  6. Else
  7. Dim oleDbCmd As OleDb.OleDbCommand
  8. oleDbCmd = oleCn.CreateCommand()
  9. oleDbCmd.CommandText = pSQL
  10. Dim dr As OleDb.OleDbDataReader = oleDbCmd.ExecuteReader()
  11. End If

今働いている会社でも、アプリケーションを1つのDBシステムから他のDBシステムへ移行する必要になりました。今回はSQL ServerからOracleへ。幸いにも、今はプロバイダ・ファクトリ利用することによってADO.NET2.0でデータプロバイダ依存しないコードの書き方が簡単になりました。

プロバイダ・ファクトリ・モデルの概要

プロバイダ・ファクトリは、接続、コマンド、データリーダーなど様々なDB関連オブジェクトのための汎用名前空間として考えられます。System.Data.SqlClientSystem.Data.OleDbなどのようなプロバイダ専用の名前空間に含むデータ型でオブジェクト定義する代わりに、System.Data.Common名前空間に含むベース・クラスを使用します。

しかし、System.Data.Commonに含むクラスはアブストラクト(抽象的)で新しいオブジェクトの作成ができません。コンクリート(具象)のオブジェクトを提供するファクトリを作る必要があります。System.Data.Commonに含むDbProviderFactoriesクラスは、これらのオブジェクトを作成する静的メッソードを提供しています。

サンプル・コード

プロバイダ・ファクトリ・モデルを使った、単純なSelect文を実行するためのサンプル・コードをここに添付します。実際のアプリケーションでは、プロバイダ名と接続文字列をINIファイルや設定ファイルから取得して指定することになります。

サンプルのコードを実行するには、Visual StudioでWindowsフォームアプリケーションを作って、フォームにボタンを追加し、以下のコードを関連づけます。文字列も適当な値にする必要があります。

コードに対するコメントを書き入れましたが、何か質問などがありましたら、このポストに対するコメントを書いて下さい。

  1. Imports System.Data
  2. Imports System.Data.Common
  3. Imports System.Collections.Generic
  4.  
  5. Public Class Form1
  6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  7.  
  8. 'Oracle用プロバイダ名
  9. Dim myDataProviderName As String = "System.Data.OracleClient"
  10. '接続文字列
  11. Dim myConnectionString As String = "Data Source=testdb;User Id=testuser;Password=testpassword;"
  12.  
  13. Try
  14. 'DBファクトリの作成
  15. Dim gDBFactory As DbProviderFactory = DbProviderFactories.GetFactory(myDataProviderName)
  16.  
  17. 'ファクトリから接続オブジェクトを取得
  18. Dim sqlCn As DbConnection = gDBFactory.CreateConnection
  19.  
  20. 'DB接続を開く
  21. sqlCn.ConnectionString = myConnectionString
  22. sqlCn.Open()
  23.  
  24. 'テーブルの一行を取得
  25. Dim sqlCmd As DbCommand = sqlCn.CreateCommand()
  26. sqlCmd.CommandText = "SELECT field1 FROM table1 where field2 = 'abc'"
  27. Dim dr As DbDataReader = sqlCmd.ExecuteReader()
  28. dr.Read()
  29.  
  30. 'フィールドの値を表示
  31. MessageBox.Show(dr.Item("field1"))
  32.  
  33. 'DB接続を閉じる
  34. sqlCn.Close()
  35. sqlCn.Dispose()
  36.  
  37. Catch ex As Exception ' エラーをキャッチ
  38. MessageBox.Show(ex.Message.ToString())
  39. Finally
  40. '実際のアプリケーションでは、ここクリンアップコードを書く
  41. End Try
  42. End Sub
  43. End Class
タグ

新しいコメントの投稿

このフィールドの内容は非公開にされ、公表されることはありません。
Image CAPTCHA
Enter the characters shown in the image.