Visual COBOL では、OpenESQL プリプロセッサによって ADO.NET のデータプロバイダ経由でデータソースにアクセスできます。 OpenESQL プリプロセッサと ODBC ドライバを使用する方法については、『データベースアクセス』フォルダの『OpenESQL』を参照してください。
この章は、次の各項で構成されています。
ADO.NET を利用するには、あらかじめ次の作業を行う必要があります。
詳細は、『OpenESQL アシスタント』の章を参照してください。
OpenESQL は ADO.NET データプロバイダをサポートしています。 OpenESQL で ADO.NET データプロバイダを使用するには、次のコンパイラ指令を使用する必要があります。
dbman=ado
このコンパイラ指令を指定すると、EXEC SQL 文が CONNECT 文で指定された ADO.NET データプロバイダと通信できるようになります。
OpenESQL では、EXEC ADO 文を使用して ADO.NET オブジェクトを作成および操作することもできます。 詳細については、後述する『埋め込み EXEC ADO 文の使用方法』を参照してください。
EXEC SQL 文で dbman=ado を使用するときには、次の OpenESQL 機能が現在はサポートされていないことに留意してください。
ストアドプロシージャの呼び出しは可能ですが、 呼び出しの際には次の各項目が現在はサポートされていないことに留意してください。
注:
プログラムのコンパイル時には、SQL コンパイラ指令と適切なオプションを指定する必要があります。これらを指定すれば、埋め込み SQL 文がプリプロセッサによって対応するデータソースの関数呼び出しに変換されます。プログラムから呼び出す ADO.NET データプロバイダの種類は、アクセスするデータソースによって異なります。
SQL コンパイラ指令のオプションを指定するには、プログラム内で $SET 文を使用します。次に使用例を示します。
$set sql(dbman=ado)
ODBC と ADO.NET データソースの双方に共通の SQL コンパイラ指令のオプションを次に一覧します。
オプション | 説明 |
---|---|
[NO]ANSI92ENTRY | OpenESQL を SQL ANSI 92 エントリレベル規格に準拠させます。 |
[NO]AUTOCOMMIT | 各 SQL 文を個別のトランザクションとして処理し、実行後ただちにコミットします。このオプションを設定せずに、トランザクションに対応した ODBC ドライバを使用する場合は、文をトランザクションの一部として明示的にコミット (またはロールバック) する必要があります。 |
CHECKDUPCURSOR | プログラムを NOANSI92ENtrY 指令でコンパイルするときに、すでにカーソルが開いている場合、OpenESQL が SQLCODE -19516 を返します。NOANSI92ENtrY 指令でのコンパイルのデフォルト動作では、開いているカーソルがいったん閉じられ、自動的に開かれます。 |
CHECKSINGLETON | 実行時にシングルトンの SELECT が複数行を返すかどうか OpenESQL でチェックします。複数行が返される場合、OpenESQL は SQLCODE を -811 に設定します。 |
DBMAN=preprocessor | 使用するプリプロセッサを指定します。ODBC ドライバの場合、この値は常に odbc に設定します (dbman=odbc)。 ADO.NET データプロバイダの場合、この値は常に ado に設定します (dbman=ado)。 OpenESQL を使用するプログラムのコンパイルでは、デフォルトで dbman=odbc が設定されるため、このオプションを指定する必要はありません。 |
[NO]ESQLVERSION | OpenESQL の構文レベルを設定します。 |
[NO]NIST | OpenESQL の動作を NIST による SQL ANSI 92 エントリレベル規格に準拠させます。 |
[NO]TARGEtdB=[MSQLSERVER | ORACLEOCI | ORACLE | INFORMIX | SYBASE | DB2 | ORACLE7] | 特定のデータソース用にパフォーマンスを最適化する場合や、アプリケーションで ODBC を呼び出すかわりに ORACLE OCI を使用してデータベース呼び出しを生成する場合に、この指令を設定します。 |
SQL コンパイラ指令の ODBC 専用オプションについては、『データベースアクセス』フォルダの『OpenESQL』を参照してください。
プログラムからデータベース内のデータにアクセスするには、事前にデータベースへの接続を確立する必要があります。
プログラムからデータベースへの接続には、必ず次の方法を使用してください。
CONNECT 文による接続。CONNECT 文は通常、いくつかの異なるデータ ソースにアクセスするプログラム (コンパイル時にデータソース名を特定できない) や、複数のデータベースにアクセスするプログラムで使用します。
注:ADO.NET データプロバイダに対する暗黙的な接続と切断、およびロールバックは、現在サポートされていません。
Visual COBOL には、ADO.NET のさまざまなサンプルプロジェクトが付属しています。サンプルプロジェクトは、Visual COBOL のベースインストールディレクトリ内の Examples¥Visual Studio Integration ディレクトリにあります。
サンプルプロジェクトを使用するには、サンプル用のデータソースをセットアップする必要があります。 このセットアップには、OpenESQL Assistant Connection Editor を使用します。詳細は、『OpenESQL アシスタント』の章を参照してください。
OpenESQL の各サンプルプロジェクトは、処理の進行状況 (およびクエリー結果) を示すコンソールログを生成します。また、エラーが発生した場合は、エラーメッセージを表示して終了します。
ConnectedDemo プロジェクトでは、SQL Server の Northwind データベースが使用されます。そのため、このプロジェクトを実行するには、Northwind データベースへの接続をセットアップする必要があります。
ConnectedDemo.cbl プログラムが、データソースから取り込んだ値を DataSet に格納し、DataSet の内容に変更を加えて、その変更をデータソースに反映します。DataSet の変更内容は、出力ウィンドウに表示されます。
ConnectedDemo は、サーバで生成された主キーを、行の追加後に DataSet に格納し、変更する方法を示すサンプルです。文バッチ、個別の TO REFRESH 文、および出力パラメータ付きのストアドプロシージャという 3 通りの方法が示されます。 また、DataSet に加えた変更を、メインの DataSet や、変更された行だけを含む別の DataSet を使用して、データ ソースに反映する方法も示されます。 後者の方法は、分散アプリケーションでネットワーク トラフィックを抑制する手段として活用できます。
ConnectedDemo プロジェクトを実行するには、SQL Server の Northwind データベースへの接続をセットアップする必要があります。 CursorDemo プロジェクトは OpenESQL と、ADO.NET への直接呼び出しを組み合わせて使用する方法を示すサンプルです。
TestADO.cs プログラムは、C# で記述されたカーソル取り込み用のループを実行します。 NoFetch.cbl プログラムは、EXEC SQL を使用してカーソルを開き、EXEC ADO を使用して結果を取り込みます。 TestCursor.cbl プログラムは、EXEC SQL FETCH を実行し、 CursorDemo.cbl プログラムによってデータが DataTable に格納されます。
DisconnectedDemo.cbl プログラムが、DataSet 内のオフラインデータを操作します。 データ操作の結果は、出力ウィンドウに表示されます。
DisconnectedDemo は、他のプロジェクトで生成された XSD ファイルから DataSet を宣言する方法と、他のアプリケーションで生成された XML ファイルから DataSet をロードする方法を示すサンプルです。
OrderStatusDemo は、複数の言語で開発されたプログラムが混在するプロジェクトで ADO.NET を使用する方法を示すサンプルです。このプロジェクトには、COBOL と C# のプログラムが含まれています。
netorderstatus.cbl プログラムが DataSet 宣言から XSD ファイルを生成し、生成された XSD ファイルが C# のフォームにインポートされます。 この結果、XSD ファイルから生成された厳密な型の DataSet によるデータバインドが可能になり、ユーザインターフェイスの作成が容易になります。
このサンプルでは、DBMS へのアクセスに直接関係しないレガシー資産の再利用で、ADO.NET を利用する方法も示されます。 このプロジェクトでは、データソースとして既存の COBOL サブルーチンが使用されます。
このサンプルで使用されている手法は、CICS ECI トランザクションに応用できます。
使用するデータ型は、『データベースアクセスガイド』の『データ型』の章に記載されている SQL データ型に限定することをお奨めします。
注:ADO.NET を使用して日時データを COBOL PIC X フィールドとして扱う場合は、上記を守ることが特に重要になります。
XML サポートの実装は、ADO.NET データプロバイダごとに異なります。 詳細については、後述する『埋め込み EXEC ADO 文の使用方法』を参照してください。
OpenESQL で EXEC ADO 文を使用すれば、より多くの ADO.NET データプロバイダに対応できます。 EXEC ADO 文は EXEC SQL 文と同じく、COBOL プログラム内に埋め込むことができます。 埋め込み EXEC ADO 文によって、次の操作が可能になります。
EXEC ADO 文には、次の 4 つの種類があります。
個々の文の詳細については、Visual Studio オンラインヘルプの『
非接続モデル文を使用すれば、COBOL プログラム内で ADO.NET オブジェクトを定義、作成、および操作できます。 主な用途は次のとおりです。
具体的な非接続モデル文は次のとおりです。
この文は、データベースに変更をコミットするわけではありません。 データベースへの変更をコミットするには、接続モデル文を使用して DataSet とデータベースを同期し、さらに EXEC SQL COMMIT 文を使用する必要があります。
この文は、データベースへの変更をロールバックするわけではありません。 データベースへの変更をロールバックするには、接続モデル文を使用して DataSet とデータベースを同期し、さらに EXEC SQL ROLLBACK 文を使用する必要があります。
接続モデル文は、データソースの操作に使用します。FILL コマンドでデータソースからデータを取り込み、DataSet 内の DataTable に格納します。UPDATE コマンドは、DML (Data Manipulation Language; データ操作言語)、つまり INSERT や UPDATE、DELETE による変更を、データ ソースに確実に反映させます。
具体的な接続モデル文は次のとおりです。
ADO.NET カーソル文は、ADO.NET の DataRows カーソルの定義、作成、および操作に使用します。 ADO.NET カーソル文は SQL カーソル文に似ていますが、ADO.NET DataRows カーソルではデータソース内のテーブルではなく、DataSet 内の DataTable が選択基準になります。
具体的な ADO.NET カーソル文は次のとおりです。
ADO.NET オブジェクト共有文は、COBOL プログラムと他の .NET アプリケーション間で、ADO.NET オブジェクト (Connection、DataSet、DataReader) を共有するために使用します。 一連の GET 文は、(dbman=ado の場合に) OpenESQL が EXEC SQL コマンド用に生成したオブジェクトを取り込みます。 BIND 文は COBOL プログラムから他の .NET アプリケーションで生成された ADO.NET オブジェクトにアクセスするとき、UNBIND 文は BIND 文でアクセスしたオブジェクトと COBOL プログラムとの関連付けを解除するときに、それぞれ使用します。
具体的な ADO.NET オブジェクト共有文は次のとおりです。