データベース ADO.NET のアーキテクチャ 従来のデータ処理は 主に接続をベースとした 2 層モデルに基づいて居た 最近のデータ処理では 多階層アーキテクチャが多用される様に成った為 プログラマは 非接続型アプローチへと切り替えて アプリケーションに より優れたスケーラビリティを提供して居る ADO.NET のコンポーネント ADO.NET には データへのアクセスとデータの操作に使用出来るコンポーネントが 2 つ有る.NET Framework データプロバイダ.NET Framework データプロバイダは データの操作と データに対する高速 且つ 前方参照専用読込専用のアクセスを実行する事を明確な目標と仕てデザインされたコンポーネントで有る Connection オブジェクトはデータソースとの接続機能を提供する Command オブジェクトに依ってデータベースコマンドにアクセス出来る為 データの返却 データの修正 格納されたプロシージャの実行 及び パラメータ情報の送信やは取得を実行出来る DataReader は データソースからの高いパフォーマンスのデータストリームを提供する 最後に DataAdapter は DataSet オブジェクトとデータソース間のブリッジを提供する DataAdapter は Command オブジェクトを使用して DataSet とデータの両方を読み込んだデータソースに SQL コマンドを実行し DataSet 内で変更されたデータの内容をデータソースに戻す DataSet ADO.NET DataSet は 何のデータソースにも依存しないデータアクセスを明確な目的と仕てデザインされて居る 従って 複数の異なるデータソースと併用したり XML データと併用したり アプリケーションに取ってローカルなデータを管理する為に使用したり出来る DataSet には DataTable オブジェクト内のデータに関する主キー 外部キー 制約 及び リレーション情報丈でなく データの行と列で構成される複数の DataTable オブジェクトのコレクションが含まれる.NET Framework データプロバイダと DataSet のリレーションシップを次の図に示す ADO.NET のアーキテクチャ -1-
DataReader 又は DataSet の選択 アプリケーションで DataReader( DataReader に依るデータの取得 を参照 ) 又は DataSet ( ADO.NET での DataSet の使用 を参照 ) を使用する必要が有るか何うかを判断する場合は アプリケーションが必要とする機能の種類を考慮する必要が有る 以下を実行する場合は DataSet を使用する アプリケーションでデータをローカルにキャッシュすると 其のデータを操作出来る クエリの実行結果を読み取る必要が有る場合は DataReader の使用を推奨する 層間で 又は XML Web サービスからデータをリモート処理する場合 Windows フォームコントロールとの連結 又は 複数ソースに属するデータの組み合わせや関連付け等 データと動的に対話する場合 データソースとの接続を開かずにデータに対する広範な処理を実行する場合 ( 他のクライアントが使用出来る様に 接続が解放される ) DataSet に依って提供される機能が必要無い場合は DataReader を使用して前方参照専用 読取専用の方法でデータを返す事に依り アプリケーションのパフォーマンスを向上させる事が出来る DataAdapter は DataReader を使用して DataSet( DataAdapter からの DataSet の読み込み を参照 ) の内容を入力して居るが DataReader を使用するとパフォーマンスを向上させる事が出来る 此れは DataSet の内容を作成 及び 入力する為に必要な処理が不要に成る丈でなく DataSet が消費するメモリが節約される為で有る XML と ADO.NET ADO.NET は XML の機能を活用して データに対する非接続型アクセス機能を提供する ADO.NET は.NET Framework に属する XML クラスと密接に連携してデザインされて居る 此等は孰れも同じアーキテクチャに属するコンポーネントで有る.NET Framework 内の ADO.NET 及び XML クラスは DataSet オブジェクトの中に集められて居る DataSet に XML のソース ( ファイル 又は XML ストリーム ) に含まれるデータを入力出来る DataSet 内のデータソースとは関係無く DataSet を XML スキーマ定義言語 (XSD) スキーマを含めた W3C(World Wide Web Consortium) 準拠の XML と仕て書く事が出来る DataSet のネイティブのシリアル化形式は XML で有る事から 層間でデータを移動する優れた媒体と成る DataSet は XML Web サービスとの間でデータとスキーマコンテキストをリモート処理する場合に最適で有る ADO.NET プラットフォームの要件 Microsoft.NET Framework SDK(ADO.NET を含む ) は MicrosoftR Windows XP Microsoft Windows 2000 Microsoft Windows NT 4 with Service Pack 6a Microsoft Windows Millennium Edition Microsoft Windows 98 Microsoft Windows CE の各プラットフォーム上でサポートされて居る.NET Framework Data Provider for OLE DB 及び.NET Framework Data Provider for ODBC には MDAC 2.6 以降のインストールが必要で有る 亦 MDAC 2.8 Service Pack 1(SP1) をインストールする事を推奨する MDAC 2.8 SP1 は Data Access and Storage Developer Center からダウンロードする事が出来る 次のサンプルコードでは アプリケーションに名前空間 System.Data をインクルードして ADO.NET を使用する方法を示す -2-
Visual Basic Imports System.Data C# using System.Data; ADO.NET クラスは System.Data.dll に含まれて居り System.Xml.dll に含まれる XML クラスと統合される 名前空間 System.Data を使用したコードをコンパイルする場合は System.Data.dll と System.Xml.dll の両方を参照する ADO.NET アプリケーションの例に付いては ADO.NET の応用例 を参照され度い 層 及び クライアント間のリモート処理 又は マーシャリング DataSet のデザインに依って XML Web サービスを使用してクライアントにデータを Web 経由で簡単に転送したり.NET リモートサービスを使用して.NET コンポーネント間でデータをマーシャリングしたり出来る 亦 此の様に仕て 厳密に型指定された DataSet をリモート処理出来る XML Web サービスの概要に付いては XML Web サービスの概要 を参照され度い XML Web サービスから DataSet を使用する例に付いては XML Web サービスからの DataSet の使用 を参照され度い リモートサービスの概要に付いては.NET Framework リモート処理の概要 を参照され度い ADO.NET 2.0 では DataTable オブジェクトは リモート処理サービス 及び XML Web サービスを併用する事が出来る -3-
ADO.NET の応用例 データソースから結果を返し コンソールやコマンドプロンプトに出力を書き込む単純な ADO.NET の応用例を以下に示す 此の資料に有るサンプルは 下記のプロバイダを使用して データソースへ接続し データを取得する方法を示して居る 必要で有れば 総てのデータプロバイダを単一のアプリケーション内で使用する事も出来る.NET Framework Data Provider for SQL Server(System.Data.SqlClient).NET Framework Data Provider for OLE DB(System.Data.OleDb).NET Framework Data Provider for ODBC(System.Data.Odbc).NET Framework Data Provider for Oracle(System.Data.OracleClient) 次の SqlClient の例では Microsoft SQL Server 7.0 以降のサンプルのデータベース Northwind と接続し SqlDataReader を使用して Categories テーブルからレコードのリストを返す事が出来る物とする OleDb 及び Odbc の例では サンプルデータベースの Microsoft Access Northwind との接続を前提と仕て居る OracleClient の例では Oracle サーバー上の DEMO.CUSTOMER との接続を前提と仕て居る 亦 System.Data.OracleClient.dll への参照を追加する必要が有る DataReader の詳細に付いては DataReader に依るデータの取得 を参照され度い SqlClient Visual Basic Option Explicit On Option Strict On Imports System Imports System.Data Imports System.Data.SqlClient Public Class Program Public Shared Sub Main( ) Dim connectionstring As String = GetConnectionString( ) Dim querystring As String = _ "SELECT CategoryID, CategoryName FROM dbo.categories;" Using connection As New SqlConnection(connectionString) Dim command As SqlCommand = connection.createcommand( ) command.commandtext = querystring Try connection.open( ) Dim datareader As SqlDataReader = command.executereader( ) Do While datareader.read( ) Console.WriteLine(vbTab & "0" & vbtab & "1", datareader(0), datareader(1)) Loop datareader.close( ) Catch ex As Exception Console.WriteLine(ex.Message) End Try End Using End Sub -4-
Private Shared Function GetConnectionString( ) As String ' To avoid storing the connection string in your code, ' you can retrieve it from a configuration file. Return "Data Source=(local);Initial Catalog=Northwind;" & "Integrated Security=SSPI;" End Function End Class C# using System; using System.Data; using System.Data.SqlClient; class Program static void Main( ) string connectionstring = GetConnectionString( ); string querystring = "SELECT CategoryID, CategoryName FROM dbo.categories;"; using (SqlConnection connection = new SqlConnection(connectionString)) SqlCommand command = connection.createcommand( ); command.commandtext = querystring; try connection.open( ); SqlDataReader reader = command.executereader( ); while (reader.read( )) Console.WriteLine(" t0 t1", reader[0], reader[1]); reader.close( ); catch (Exception ex) Console.WriteLine(ex.Message); static private string GetConnectionString( ) // To avoid storing the connection string in your code, // you can retrieve it from a configuration file. return "Data Source=(local);Initial Catalog=Northwind; Integrated Security=SSPI"; OleDb Visual Basic Option Explicit On Option Strict On Imports System Imports System.Data -5-
Imports System.Data.OleDb Public Class Program Public Shared Sub Main( ) Dim connectionstring As String = GetConnectionString( ) Dim querystring As String = "SELECT CategoryID, CategoryName FROM Categories;" Using connection As New OleDbConnection(connectionString) Dim command As OleDbCommand = connection.createcommand( ) command.commandtext = querystring Try connection.open( ) Dim datareader As OleDbDataReader = command.executereader( ) Do While datareader.read( ) Console.WriteLine(vbTab & "0" & vbtab & "1", datareader(0), datareader(1)) Loop datareader.close( ) Catch ex As Exception Console.WriteLine(ex.Message) End Try End Using End Sub Private Shared Function GetConnectionString( ) As String ' To avoid storing the connection string in your code, ' you can retrieve it from a configuration file. ' Assumes Northwind.mdb is located in c: Data folder. Return "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _ & "c: Data Northwind.mdb;User Id=admin;Password=;" End Function End Class C# using System; using System.Data; using System.Data.OleDb; class Program static void Main( ) string connectionstring = GetConnectionString( ); string querystring = "SELECT CategoryID, CategoryName FROM Categories;"; using (OleDbConnection connection = new OleDbConnection(connectionString)) OleDbCommand command = connection.createcommand( ); command.commandtext = querystring; try connection.open( ); OleDbDataReader reader = command.executereader( ); while (reader.read( )) Console.WriteLine(" t0 t1", reader[0], reader[1]); -6-
reader.close( ); catch (Exception ex) Console.WriteLine(ex.Message); static private string GetConnectionString( ) // To avoid storing the connection string in your code, // you can retrieve it from a configuration file. // Assumes Northwind.mdb is located in the c: Data folder. return "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + "c: Data Northwind.mdb;User Id=admin;Password=;"; Odbc Visual Basic Option Explicit On Option Strict On Imports System Imports System.Data Imports System.Data.Odbc Public Class Program Public Shared Sub Main( ) Dim connectionstring As String = GetConnectionString( ) Dim querystring As String = "SELECT CategoryID, CategoryName FROM Categories;" Using connection As New OdbcConnection(connectionString) Dim command As OdbcCommand = connection.createcommand( ) command.commandtext = querystring Try connection.open( ) Dim datareader As OdbcDataReader = command.executereader( ) Do While datareader.read( ) Console.WriteLine(vbTab & "0" & vbtab & "1", datareader(0), datareader(1)) Loop datareader.close( ) Catch ex As Exception Console.WriteLine(ex.Message) End Try End Using End Sub Private Shared Function GetConnectionString( ) As String ' To avoid storing the connection string in your code, ' you can retrieve it from a configuration file. ' Assumes Northwind.mdb is located in c: Data folder. -7-
Return "Driver=Microsoft Access Driver (*.mdb);" _ & "Dbq=c: Data Northwind.mdb;Uid=Admin;Pwd=;" End Function End Class C# using System; using System.Data; using System.Data.Odbc; class Program static void Main( ) string connectionstring = GetConnectionString( ); string querystring = "SELECT CategoryID, CategoryName FROM Categories;"; using (OdbcConnection connection = new OdbcConnection(connectionString)) OdbcCommand command = connection.createcommand( ); command.commandtext = querystring; try connection.open( ); OdbcDataReader reader = command.executereader( ); while (reader.read( )) Console.WriteLine(" t0 t1", reader[0], reader[1]); reader.close( ); catch (Exception ex) Console.WriteLine(ex.Message); static private string GetConnectionString( ) // To avoid storing the connection string in your code, // you can retrieve it from a configuration file. // Assumes Northwind.mdb is located in the c: Data folder. return "Driver=Microsoft Access Driver (*.mdb);" + "Dbq=c: Data Northwind.mdb;Uid=Admin;Pwd=;"; OracleClient Visual Basic Option Explicit On Option Strict On Imports System Imports System.Data Imports System.Data.OracleClient -8-
Public Class Program Public Shared Sub Main( ) Dim connectionstring As String = GetConnectionString( ) Dim querystring As String = "SELECT CUSTOMER_ID, NAME FROM DEMO.CUSTOMER" Using connection As New OracleConnection(connectionString) Dim command As OracleCommand = connection.createcommand( ) command.commandtext = querystring Try connection.open( ) Dim datareader As OracleDataReader = command.executereader( ) Do While datareader.read( ) Console.WriteLine(vbTab & "0" & vbtab & "1", datareader(0), datareader(1)) Loop datareader.close( ) Catch ex As Exception Console.WriteLine(ex.Message) End Try End Using End Sub Private Shared Function GetConnectionString( ) As String ' To avoid storing the connection string in your code, ' you can retrieve it from a configuration file. Return "Data Source=ThisOracleServer;Integrated Security=yes;" End Function End Class C# using System; using System.Data; using System.Data.OracleClient; class Program static void Main( ) string connectionstring = GetConnectionString( ); string querystring = "SELECT CUSTOMER_ID, NAME FROM DEMO.CUSTOMER"; using (OracleConnection connection = new OracleConnection(connectionString)) OracleCommand command = connection.createcommand( ); command.commandtext = querystring; try connection.open( ); OracleDataReader reader = command.executereader( ); while (reader.read( )) Console.WriteLine(" t0 t1", reader[0], reader[1]); reader.close( ); catch (Exception ex) -9-
Console.WriteLine(ex.Message); static private string GetConnectionString( ) // To avoid storing the connection string in your code, // you can retrieve it from a configuration file. // Assumes Northwind.mdb is located in the c: Data folder. return "Data Source=ThisOracleServer;Integrated Security=yes;"; -10-