Oracle8i Databaseリリース3(8.1.7)以上において、Oracle Data Provider for .NET 10.2.0.2以上では、Microsoft ADO.NET 2.0 APIおよびインタフェースがサポートされています。
この項の内容は次のとおりです。
ADO.NET 2.0は、プロバイダの非依存性、コンポーネントの再利用率促進およびアプリケーションの変換性を実現するために連携するよう設計されたデータ・アクセス機能を提供する、Microsoft社の仕様です。その他の機能により、アプリケーションでは、データソース、スキーマおよびプロバイダに関する情報を動的に検出することが容易になります。
|
注意: ODP.NETをMicrosoft ADO.NET 2.0と併用するには、ADO.NET 2.0準拠のODP.NETが必要です。 |
|
参照: MSDNライブラリのADO.NETに関する説明 |
プロバイダに依存しない汎用データ・アクセス・コードを作成する場合、ADO.NET 1.xではインタフェースが使用されます。同様の目的で、ADO.NET 2.0は継承ベースの方法を提供しながらも、下位互換性を持たせるためADO.NET 1.xからのインタフェースを保持し続けます。
ODP.NET for ADO.NET 2.0では、ADO.NET 1.x APIを使用できるように下位互換性がサポートされています。
このマニュアルでは、ADO.NET 2.0およびADO.NET 1.xの両方の宣言を適宜示しています。
ADO.NET 2.0では、データ・クラスはSystem.Data.Commonネームスペースで定義されたベース・クラスから導出されます。開発者は、プロバイダ・ファクトリ・クラスを使用して、これらのベース・クラスのプロバイダ固有インスタンスを作成できます。
プロバイダ・ファクトリ・クラスにより、汎用データ・アクセス・コードは、最小限のデータソース固有コードを使用した複数のデータソースにアクセスできます。これによって、複数のデータソースにアクセスするアプリケーションで現在使用されている、条件付きロジックの大部分が削減されます。
Oracle Data Provider for .NETを使用すると、OracleClientFactoryクラスを戻したりインスタンス化できます。これにより、アプリケーションがベース・クラスから継承した次のODP.NETクラスのインスタンスを作成できます。
表3-2 ADO.NET 2.0ベース・クラスから継承するODP.NETクラス
| ODP.NETクラス | 継承元のADO.NET 2.0ベース・クラス |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
一般に、アプリケーションは依然としてOracle固有の接続文字列、SQLまたはストアド・プロシージャ・コールを必要とし、Oracle.DataAccess.Clientのファクトリが使用されることを宣言します。
OracleConnectionStringBuilderクラスは、接続文字列の作成を、エラーが発生しにくく管理しやすいものにします。
このクラスを使用することで、開発者は構成ファイルを使用し、接続文字列を提供したり、キーおよび値のペアによって値を動的に設定できます(あるいはその両方)。構成ファイル・エントリの一例を次に示します。
<configuration>
<connectionStrings>
<add name="Publications" providerName="Oracle.DataAccess.Client"
connectionString="User Id=scott;Password=tiger;Data Source=inst1" />
</connectionStrings>
</configuration>
接続文字列情報は、接続文字列名、この例ではPublicationsを指定することで取得できます。続いて、providerNameに基づき、そのプロバイダに適したファクトリを取得できます。これによって、接続文字列の管理および変更が容易になります。さらに、これによって、接続文字列への文字列の挿入に対するセキュリティが強化されます。
ADO.NET 2.0は、OracleConnection.GetSchema APIにより5つのタイプのメタデータ・コレクションを公開します。これにより、アプリケーション開発者は任意のOracleデータソースについて、個々のアプリケーションごとにメタデータの取得をカスタマイズできます。したがって、開発者は複数のデータソースのメタデータを管理するための汎用コード・セットを作成できます。
次のタイプのメタデータが公開されます。
MetaDataCollections
表、列、索引およびストアド・プロシージャなどのデータソースから取得できるメタデータ・コレクションのリスト
Restrictions
要求されたスキーマ情報の範囲を制限する、各メタデータ・コレクションに適用される制限
DataSourceInformation
製品名およびバージョンなど、現在使用中のデータベースのインスタンスに関する情報
DataTypes
データベースがサポートする各データ型に関する情報一式
ReservedWords
Oracle問合せ言語の予約語
ODP.NETは、総合的なデータベース・スキーマ情報一式を提供します。開発者は、個々のアプリケーションごとに、GetSchemaメソッドにより戻されたメタデータを拡張またはカスタマイズできます。
それには、開発者は次の方法により、カスタマイズされたメタデータ・ファイルを作成し、アプリケーションにファイル名を指定する必要があります。
カスタマイズされたメタデータ・ファイルを作成し、.NETフレームワークがインストールされているCONFIGサブディレクトリにこのファイルを格納します。これは、machine.configおよびセキュリティ構成設定が含まれるディレクトリです。
このファイルには、変更点だけでなく、スキーマ構成情報全体が含まれる必要があります。開発者は、スキーマ取得の動作をユーザー固有の要件にあわせて変更する変更点を指定します。たとえば、開発者は内部データベース表をフィルタで除外し、ユーザー固有の表のみを取得できます。
アプリケーションのapp.configファイルに次のようなエントリを追加し、名前/値ペアの形式でメタデータ・ファイル名を指定します。
<oracle.dataaccess.client>
<settings>
<add name="MetaDataXml" value="CustomMetaData.xml" />
</settings>
</oracle.dataaccess.client>
GetSchemaメソッドがコールされると、ODP.NETはapp.configファイルで、カスタマイズされたメタデータXMLファイルの名前の有無をチェックします。GetSchemaメソッドはまず、プロバイダにちなんで名付けられた要素を持つエントリをこのファイル内で検索します。この例ではoracle.dataaccess.clientです。このXML要素では、MetaDataXmlという名前に対応する値が、カスタマイズされたXMLファイルの名前です。この例ではCustomMetaData.xmlです。
メタデータ・ファイルが正しいディレクトリにない場合、アプリケーションはODP.NETに含まれるデフォルトのメタデータXMLファイルをロードします。
ODP.NET for .NET Framework 2.0では、System.Transactionsがサポートされています。 System.Transactionsが使用される場合は、ローカル・トランザクションが指定されないかぎり、トランザクションはただちに分散トランザクション(デフォルト)となります。
アプリケーションがSystem.Transactionsを使用する場合、"enlist"接続文字列属性が"true"(デフォルト)または"dynamic"のいずれかに設定されている必要があります。
ODP.NETでは、分散トランザクションを使用するアプリケーション向けに、次のSystem.Transactionsプログラミング・モデルがサポートされています。
TransactionScopeクラスが提供するトランザクション・アプリケーションに書き込むためのメカニズムでは、アプリケーションは分散トランザクションに明示的に登録される必要はありません。このために、アプリケーションはTransactionScopeオブジェクトを使用してトランザクション・コードを定義します。このトランザクションの範囲内で作成された接続は、分散トランザクションに登録されます。アプリケーションはCompleteオブジェクトでTransactionScopeメソッドをコールし、変更をコミットする必要がある点に注意してください。コミットしない場合、デフォルトでトランザクションが中断されます。
// C#
using System;
using Oracle.DataAccess.Client;
using System.Data;
using System.Data.Common;
using System.Transactions;
class psfTxnScope
{
static void Main()
{
int retVal = 0;
string providerName = "Oracle.DataAccess.Client";
string constr =
@"User Id=scott;Password=tiger;Data Source=oracle;enlist=true";
// Get the provider factory.
DbProviderFactory factory = DbProviderFactories.GetFactory(providerName);
try
{
// Create a TransactionScope object, (It will start an ambient
// transaction automatically).
using (TransactionScope scope = new TransactionScope())
{
// Create first connection object.
using (DbConnection conn1 = factory.CreateConnection())
{
// Set connection string and open the connection. this connection
// will be automatically enlisted in a distributed transaction.
conn1.ConnectionString = constr;
conn1.Open();
// Create a command to execute the sql statement.
DbCommand cmd1 = factory.CreateCommand();
cmd1.Connection = conn1;
cmd1.CommandText = @"insert into emp (empno, ename, job) values
(1234, 'emp1', 'dev1')";
// Execute the SQL statement to insert one row in DB.
retVal = cmd1.ExecuteNonQuery();
Console.WriteLine("Rows to be affected by cmd1: {0}", retVal);
// Close the connection and dispose the command object.
conn1.Close();
conn1.Dispose();
cmd1.Dispose();
}
// The Complete method commits the transaction. If an exception has
// been thrown or Complete is not called then the transaction is
// rolled back.
scope.Complete();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
}
}
}
CommittableTransactionオブジェクトおよびEnlistTransactionメソッドをインスタンス化すると、分散トランザクションの作成および登録が明示的になります。アプリケーションはCommittableTransactionオブジェクトでCommitまたはRollbackをコールする必要がある点に注意してください。
// C#
using System;
using Oracle.DataAccess.Client;
using System.Data;
using System.Data.Common;
using System.Transactions;
class psfEnlistTransaction
{
static void Main()
{
int retVal = 0;
string providerName = "Oracle.DataAccess.Client";
string constr =
@"User Id=scott;Password=tiger;Data Source=oracle;enlist=dynamic";
// Get the provider factory.
DbProviderFactory factory = DbProviderFactories.GetFactory(providerName);
try
{
// Create a committable transaction object.
CommittableTransaction cmtTx = new CommittableTransaction();
// Open a connection to the DB.
DbConnection conn1 = factory.CreateConnection();
conn1.ConnectionString = constr;
conn1.Open();
// enlist the connection with the commitable transaction.
conn1.EnlistTransaction(cmtTx);
// Create a command to execute the sql statement.
DbCommand cmd1 = factory.CreateCommand();
cmd1.Connection = conn1;
cmd1.CommandText = @"insert into emp (empno, ename, job) values
(1234, 'emp1', 'dev1')";
// Execute the SQL statement to insert one row in DB.
retVal = cmd1.ExecuteNonQuery();
Console.WriteLine("Rows to be affected by cmd1: {0}", retVal);
// commit/rollback the transaction.
cmtTx.Commit(); // commits the txn.
//cmtTx.Rollback(); // rolls back the txn.
// close and dispose the connection
conn1.Close();
conn1.Dispose();
cmd1.Dispose();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
}
}
}
Oracle Data Provider for .NETリリース10.2.0.3以降では、System.Transactionsを使用したローカル・トランザクションをアプリケーションで使用できます。 以前のバージョンのODP.NETでは、System.Transactionsを使用した分散トランザクションのみがサポートされていました。
ローカル・トランザクションを使用するには、PromotableTransactionレジストリ・エントリを作成して"local"に設定するか、"Promotable Transaction"接続文字列属性を"local"に設定する必要があります。
"local"が指定されている場合は、TransactionScopeで最初にオープンされる接続でローカル・トランザクションが使用されます。 同じTransactionScope内で後続の接続がオープンされると、例外がスローされます。 すでにオープンされている接続がTransactionScopeにある場合に、"Promotable Transaction=local"を指定したOracleConnectionで、同じTransactionScope内に接続をオープンしようとすると、例外がスローされます。
"promotable"が指定されている場合は、同じTransactionScope内に最初にオープンされる接続およびその後オープンされるすべての接続が、同じ分散トランザクションに登録されます。
レジストリと接続文字列属性の両方が使用されていて、設定されている値が異なる場合は、接続文字列属性によって、レジストリ・エントリの値が上書きされます。 両方とも設定されていない場合は、"promotable"が使用されます。 この値はデフォルトで、分散トランザクションのみがサポートされていた以前のバージョンのODP.NETの場合と同じになります。
特定のバージョンのODP.NETのレジストリ・エントリは、そのバージョンのODP.NETを使用するすべてのアプリケーションに適用されます。
OracleDataAdapter UpdateBatchSizeプロパティは、OracleDataAdapter.Updateメソッドがコールされた場合にバッチ処理を可能にします。 UpdateBatchSizeは、ラウンドトリップごとにOracle Databaseを更新するDataSetの行数を示す、数値プロパティです。
これにより、開発者はデータベースへのラウンドトリップ数を減らすことができます。
ADO.NET 2.0専用のクラスの他に、System.Data.Commonネームスペースから継承した他のODP.NETクラスには、ADO.NET 2.0を必要とするメソッドおよびプロパティが含まれます。
次のクラスはADO.NET 2.0専用です。
次のクラス・メンバーはADO.NET 2.0専用です。
OracleCommandBuilderクラス・メンバー
CatalogLocationプロパティ(未サポート)
CatalogSeparatorプロパティ(未サポート)
ConflictOptionプロパティ(未サポート)
QuotePrefixプロパティ
QuoteSuffixプロパティ
SchemaSeparatorプロパティ
QuoteIdentifierメソッド
OracleConnectionクラス・メンバー
GetSchemaメソッド
OracleDataAdapterクラス・メンバー
UpdateBatchSizeプロパティ
OracleDataReaderクラス・メンバー
OracleParameterクラス・メンバー
ResetDbTypeメソッド
OracleParameterCollectionクラス・メンバー
AddRangeメソッド