ADO レコードセットまたはレコードによる DataSet への充填
ADO.NET から ADO レコードセット オブジェクトやレコード オブジェクトへのアクセスを提供するために、.NET Framework Data Provider for OLE DB は OleDbDataAdapter の Fill メソッドをオーバーロードして、ADO レコードセット オブジェクトまたはレコード オブジェクトを受け入れます。DataSet への ADO オブジェクトの内容の設定は、一方向だけの操作です。つまり、ADO のレコードセットまたはレコードからデータを DataSet へインポートできますが、そのデータの更新は明示的に処理する必要があります。しかし、ADO オブジェクトから DataSet にデータを読み込んだ後、DataAdapter を使用して、変更を元のデータ ソースに反映させることができます。また、データを XML 形式で書き込むこともできます。
主キー情報が利用できない場合、Fill 操作は、DataSet の既存の DataTable オブジェクトに行を追加します。DataTable に対して主キー情報が利用できる場合、Fill 操作は主キーが一致する行を更新します。データ ソースから主キー情報を取得する方法の詳細については、「DataSet への既存の制約の追加」を参照してください。また、「テーブルの主キーの定義」で説明するように、主キー情報をプログラムで設定することもできます。
.NET COM 相互運用サービスおよび ADO.NET を使用して ADO レコードセット オブジェクトまたはレコード オブジェクトを返すコンポーネント オブジェクト モデル (COM) コンポーネントを使用するには、まず、タイプ ライブラリ インポータ (Tlbimp.exe) を使用して COM コンポーネントおよび ADO についてのタイプ ライブラリ情報をインポートする必要があります。.NET Framework から COM オブジェクトへのアクセスの詳細については、「.NET Framework への COM コンポーネントの公開」を参照してください。
**メモ **Visual Studio .NET では、"Program Files\Microsoft.NET\Primary Interop Assemblies" ディレクトリの adodb.dll ファイルに、ADO のプライマリ相互運用機能アセンブリ (PIA) が用意されています。Visual Studio .NET のコピーがインストールされている場合は、独自のアセンブリをタイプ ライブラリ インポータ (tlbimp.exe) を使用してインポートするのではなく、このファイル (adodb.dll) を利用することをお勧めします。プライマリ相互運用機能アセンブリの詳細については、「プライマリ相互運用機能アセンブリ」を参照してください。
たとえば、ADOComponent.DataClass という ProgId を持つ既存の COM コンポーネントは、ADOComponent.dll にコンパイルされます。ADOComponent.dll は、ADODB.Recordset 型のオブジェクトを返すメソッドを持っています。.NET からこのオブジェクトを使用するには、ADOComponent.dll と、ADODB.Recordset オブジェクトおよび ADODB.Record オブジェクトが格納されている msado15.dll の両方をインポートします。COM のタイプ ライブラリを .NET にインポートするには、次のコマンドを実行します。
TlbImp "C:\Program Files\Common Files\System\Ado\msado15.dll" /out:ADODB.dll
TlbImp ADOComponent.dll /out:ADOCOM.dll
これらのコマンドを実行すると、実行結果の .NET ライブラリ ADODB.dll および ADOCOM.dll を .NET プログラムのコンパイル時にライブラリ参照として渡すことができます。vbc.exe を使用して Visual Basic .NET プログラムをコンパイルし、インポートした COM ライブラリを供給する方法を次のコードに示します。
vbc MyVB.vb /r:system.dll /r:system.data.dll /r:system.xml.dll /r:ADODB.dll /r:ADOCOM.dll
csc.exe を使用して C# のプログラムをコンパイルし、インポートされた COM ライブラリを供給する方法を、次のコードに示します。
csc MyCS.cs /r:system.dll /r:system.data.dll /r:system.xml.dll /r:ADODB.dll /r:ADOCOM.dll
ADOComponent.DataClass オブジェクトが ADODB.Recordset を返す GetData というメソッドを持っている場合に .NET で記述できるコード例を次に示します。
Dim adoComponent As ADOCOM.DataClass = New ADOCOM.DataClass
Dim adoRS As ADODB._Recordset = adoComponent.GetData()
[C#]
ADOCOM.DataClass adoComponent = new ADOCOM.DataClass();
ADODB._Recordset adoRS = adoComponent.GetData();
ADODB.Recordset オブジェクトを使用して DataSet の Fill 操作を実行する方法を次のコード例に示します。
Dim myDA As OleDbDataAdapter = New OleDbDataAdapter
Dim myDS As DataSet = New DataSet
myDA.Fill(myDS, adoRS, "MyTable")
[C#]
OleDbDataAdapter myDA = new OleDbDataAdapter();
DataSet myDS = New DataSet();
myDA.Fill(myDS, adoRS, "MyTable");
**注意 **ADO レコードセットまたは ADO レコード オブジェクトを .NET Framework アプリケーションと共に使用する場合、終了時には必ず Close を呼び出してください。これにより、データ ソースへの元になる接続が適切な時点で解放されます。また、既存の参照がまだあるにもかかわらず、ガベージ コレクションがアンマネージ ADO オブジェクトをクリアしてしまうために、アクセス違反が起こる場合がありますが、これも防止できます。
DataSet および ADO オブジェクトをとる OleDbDataAdapter.Fill オーバーロードは、Fill 操作の完了時に ADO オブジェクトの Close を暗黙に呼び出すので注意してください。DataTable をとる OleDbDataAdapter.Fill オーバーロードを呼び出した後には、ADO レコードセット オブジェクトやレコード オブジェクトを明示的に終了する必要があります。
参照
ADO.NET から ADO レコードセットまたはレコードへのアクセス | タイプ ライブラリ インポータ (Tlbimp.exe) | .NET Framework への COM コンポーネントの公開