執筆者: インフォシェア株式会社 小高 太郎

動作確認環境: .NET Framework 2.0 以上、Visual Studio 2005 以上


ADO.NET を用いてデータベース アクセスを記述する際、個々のデータ プロバイダーに依存したコードを避けるために、汎用的なクラス (基本クラス) を使用する事が可能です。

基本クラスとは、System.Data.Common 名前空間に追加された DbConnection、DbCommand、DbDataReader、DbParameter などのクラスです。ADO.NET のデータ プロバイダーは、全て基本クラスを継承するように設計されているため、これらのクラスを用いれば、データ ソースに依存しないコードを書くことが可能になります。

基本クラスを実態化するには外からインスタンスを与える必要があります。これにはファクトリの仕組み (DbProviderFactory クラス) を使用します。

以下のような app.config を例として考えてみます。接続文字列の名前、サーバー名、データベース名のみが定義されています。

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

    <configSections>

    </configSections>

    <connectionStrings>

        <add name="Sample.Properties.Settings.NorthwindConnectionString"

            connectionString="Data Source=.\sqlexpress;Initial Catalog=Northwind" />

    </connectionStrings>

</configuration>

コードは以下のようになります。(参照設定を行い、System.Configuration を追加しておきます。)

Visual Basic
Imports System.Configuration 
Imports System.Data.Common 
Imports System.Data 
 
    Sub Main() 
        Dim settings As ConnectionStringSettings = ConfigurationManager.ConnectionStrings("Sample.Properties.Settings.NorthwindConnectionString") 
        Dim fact As DbProviderFactory = DbProviderFactories.GetFactory("System.Data.SqlClient") 
        Dim csbuilder As DbConnectionStringBuilder = fact.CreateConnectionStringBuilder() 
        csbuilder.ConnectionString = settings.ConnectionString 
 
        Console.WriteLine("ユーザーIDを入力してください") 
        csbuilder("User ID") = Console.ReadLine() 
 
        Console.WriteLine("パスワードを入力してください") 
        csbuilder("Password") = Console.ReadLine() 
 
        Using cn As DbConnection = fact.CreateConnection() 
            cn.ConnectionString = csbuilder.ConnectionString 
            cn.Open() 
 
            Dim cm As DbCommand = fact.CreateCommand() 
            cm.CommandText = "SELECT * FROM Categories" 
            cm.Connection = cn 
 
            Dim dr As DbDataReader = cm.ExecuteReader() 
            While (dr.Read()) 
                Console.WriteLine(dr("CategoryName")) 
            End While 
        End Using 
    End Sub 
 

SqlConnection などのデータ ソースに依存したクラスを排除した汎用的なコードになっている事が分かります。データ プロバイダーを変更する場合は、DbProviderFactories.GetFactory に適切な引数を与る事で実現できます。例えば、Oracle に接続する場合、Oracle 社が提供するデータ プロバイダーを使用するならば、Oracle.DataAccess.Client、Microsoft 社が提供するデータ プロバイダーを使用する場合は、System.Data.OracleClient を文字列として引数に与えます。(ただし、System.Data.OracleClient は今後廃止される予定なので、サード パーティの Oracle プロバイダーを使用することをお勧めします。) 当然ながら、ユーザー名、パスワード、データベース名、実際の SQL 自体の考慮は必要になります。

以下の表は SQL Server で使用するクラスと、汎用的な基本クラスの対応を示したものです。

SqlClient クラス

基本クラス

SqlConnection

DbConnection

SqlCommand

DbCommand

SqlDataReader

DbDataReader

SqlTransaction

DbTransaction

SqlParameter

DbParameter

SqlParameterCollection

DbParameterCollection

SqlDataAdapter

DbDataAdapter

SqlCommandBuilder

DbCommandBuilder

SqlConnectionStringBuilder

DbConnectionStringBuilder

SqlPermission

DBDataPermission

参考リンク


Code Recipe

ページのトップへ