ADO.NET データ プロバイダー
Zen ADO.NET データ プロバイダー(ADO.NET データ プロバイダー)を使用すれば、.NET 対応アプリケーションやアプリケーション サーバーからデータ アクセスが可能になります。ADO.NET データ プロバイダーはインターネットまたはイントラネット経由で、主要なデータ ストアへの高パフォーマンスなポイント ツー ポイント アクセスおよび n 層アクセスを提供します。ADO.NET データ プロバイダーは .NET 環境向けに最適化されているため、これを使用することにより、.NET 技術が組み込まれ、既存のシステムの機能とパフォーマンスを向上させることができます。
この章では、Zen ADO.NET データ プロバイダーに関連する機能について説明します。以下の項目が含まれています。
メモ:ADO.NET Entity Framework でのデータ プロバイダーの使用法については、
ADO.NET Entity Framework データ プロバイダーを参照してください。
Zen ADO.NET データ プロバイダーについて
Zen ADO.NET データ プロバイダーは、Microsoft .NET Framework 2.0、3.0、3.5、3.5 SP1、4.0、4.5、4.5.1、4.5.2、4.6.1、および 4.6.2 Preview に準拠しています。データ プロバイダーは 100% マネージ コードで構築されています。つまり、完全に共通言語ランタイム(CLR)の内部で、実行およびデータベースへの接続が行えます。
クライアント ライブラリや COM コンポーネントなどネイティブ オペレーティング システムで実行するコードはアンマネージ コードと言います。マネージ コードとアンマネージ コードは 1 つのアプリケーション内に混在させることができます。ただし、アンマネージ コードは共通言語ランタイムの外部にまで影響が及ぶため、現実的には複雑になり、パフォーマンスも低下します。また、セキュリティの危険にさらすことにもなりかねません。
名前空間
ADO.NET データ プロバイダーの名前空間は、Pervasive.Data.SqlClient です。Zen データベースに接続するときに、Pervasive.Data.SqlClient 名前空間で PsqlConnection オブジェクトと PsqlCommand オブジェクトを使用します。
次のコードは、ADO.NET データ プロバイダーの名前空間をアプリケーションに組み込む方法を示しています。
C#
// Zen へアクセスします
using System.Data;
using System.Data.Common;
using Pervasive.Data.SqlClient;
Visual Basic
' Zen へアクセスします
Imports System.Data
Imports System.Data.Common
Imports Pervasive.Data.SqlClient
アセンブリ名
ADO.NET データ プロバイダー用の厳密な名前のアセンブリは、インストール時にグローバル アセンブリ キャッシュ(GAC)に配置されます。アセンブリ名は Pervasive.Data.SqlClient.dll です。
Pervasive.Data.Common アセンブリには、バルク ロードのサポートなどの機能が含まれます。
ADO.NET データ プロバイダーでの接続文字列の使用
接続の動作は、接続文字列や PsqlConnection オブジェクトのプロパティを使って定義することができます。しかし、接続文字列内の値の設定を接続プロパティによって変更することはできません。
接続文字列の基本形式は、セミコロンで区切られた一連の「キーワード/値」のペアを含んでいます。次に、ADO.NET データ プロバイダー用の単純な接続文字列のキーワードと値の例を示します。
"Server DSN=SERVERDEMO;Host=localhost"
接続文字列を指定する際のガイドラインは、
接続文字列の使用を参照してください。
サポートされる接続文字列オプションの説明については、表
28 を参照してください。
接続文字列の構築
PsqlConnectionStringBuilder プロパティの名前は、接続文字列オプションの名前と同じです。ただし、接続文字列オプションの名前は、語と語の間に必要なスペースを入れて、複数の語で構成することができます。たとえば、Min Pool Size 接続文字列オプションは MinPoolSize プロパティに相当します。表
28 では、接続文字列オプションを挙げ、各プロパティについて説明します。
接続文字列オプションは次のような形式です。
オプション名=値
接続文字列オプション値の各ペアはセミコロンで区切ります。次に、ADO.NET データ プロバイダー用の単純な接続文字列のキーワードと値の例を示します。
"Server DSN=SERVERDEMO;Host=localhost"
パフォーマンスに関する考慮点
アプリケーションのパフォーマンスは、接続文字列オプション、および、いくつかのデータ プロバイダー オブジェクトのプロパティに設定された値の影響を受けます。
パフォーマンスに影響を与える接続文字列オプション
Encrypt:データ暗号化は、データの暗号化と復号で必要となる追加オーバーヘッド(主に CPU 使用)のため、パフォーマンスに悪影響を与えることがあります。
Max Statement Cache Size:アプリケーションが使用する全プリペアド ステートメントをキャッシュすれば、最高のパフォーマンスを提供できるように思われます。しかし、この手法では、接続プールを使ってステートメント キャッシングを実装した場合、データベース サーバーのメモリに負担をかける結果になります。この場合、プールされた接続はそれぞれステートメント キャッシュを持ち、アプリケーションが使用する全プリペアド ステートメントを含むことになります。キャッシュされたプリペアド ステートメントは、すべてデータベース サーバーのメモリにも保持されます。
Pooling:データ プロバイダーが接続プールを使用できるようにしている場合、パフォーマンスに影響する以下の追加オプションを定義できます。
•Load Balance Timeout:接続をプールに保持する時間を定義できます。プール マネージャーは、接続がプールに返されたときに接続の作成時間をチェックします。作成時間を現在の時間と比較し、時間の間隔が Load Balance Timeout オプションの値を超えていたら、接続を破棄します。Min Pool Size オプションの指定によって、一部の接続でこの値を無視させることができます。
•Connection Reset:再利用される接続を初期設定に戻すと、その接続はサーバーに対して余分なコマンドを発行する必要が生じるため、パフォーマンスに悪影響を与えます。
•Max Pool Size:プールに格納できる接続数の最大値の設定が低すぎると、接続が使用可能になるまでの時間が延期されます。最大値の設定が高すぎると、リソースを無駄に消費します。
•Min Pool Size:接続プールは、一意な接続文字列を使って最初にデータベースへ接続したときに作成されます。Min Pool Size が指定されている場合、プールには最小数の接続が格納されます。接続プール内の一部の接続が Load Balance Timeout 値を超えたとしても、接続プールにはこの最小数の接続が保持されます。
Schema Options:ある種のデータベース メタデータを返すことは、パフォーマンスに影響を与えます。アプリケーションのパフォーマンスを最適化するため、データ プロバイダーは、パフォーマンスに悪影響を与えるプロシージャ定義やビュー定義などのデータベース メタデータを返さないようにします。アプリケーションがこれらのデータベース メタデータを必要とする場合は、明確にそれを返すよう要求する必要があります。
複数の種類の除外されたメタデータを返すには、名前をカンマ区切りリストで指定するか、返したい列コレクションの 16 進値の合計を指定します。たとえば、プロシージャ定義とビュー定義を返すには以下のいずれかを指定します。
•Schema Option=ShowProcedureDefinitions, ShowViewDefinitions
•Schema Options=0x60
Statement Cache Mode:ほとんどの場合、ステートメント キャッシングを有効にするとパフォーマンスが向上します。プリペアド ステートメント(コマンド インスタンス)のキャッシングを有効にするには、このオプションを Auto に設定します。アプリケーションが、暗黙的にステートメント キャッシュに含めるとマークされたプリペアド ステートメントを持つ場合は、この設定を使用します。または、暗黙的に含めるステートメントがいくつかあり、その他は明示的に含める場合、この設定を使用します。ステートメント キャッシュに Cache とマークされたプリペアド ステートメントのみを含めたい場合は、1)Command オブジェクトの StatementCacheBehavior プロパティに Cache を設定し、2)このオプションに ExplicitOnly を設定します。
パフォーマンスに影響を与えるプロパティ
StatementCacheBehavior:アプリケーションがその存続期間中にプリペアド ステートメントを複数回再使用する場合、ステートメント キャッシュを使用することによってパフォーマンスに影響を及ぼすことができます。このプロパティは、プリペアド ステートメント(Command オブジェクトのインスタンス)がステートメント キャッシング中にどのように処理されるかを決定します。
Cache に設定すると、プリペアド ステートメントはステートメント キャッシュに含められます。
Implicit に設定して Statement Cache Mode 接続文字列オプションに Auto を設定すると、プリペアド ステートメントはステートメント キャッシュに含められます。
DoNotCache に設定すると、プリペアド ステートメントはステートメント キャッシュから除外されます。
特定のステートメントをキャッシングすることによるパフォーマンスへの影響を判断するには、接続統計情報を使用できます(
接続統計情報によるパフォーマンスの分析を参照してください)。
データ型
表
5 から表
8 は、ADO.NET データ プロバイダーでサポートされるデータ型を示しています。
•表
5 は、Zen データ型と .NET Framework 型の対応表です。
•表
6 は、System.Data.DbType のみが指定されている場合にデータ プロバイダーが使用するデータ型の対応表です。
•表
7 は、プロバイダー固有のデータ型も System.Data.DbType も指定されていない場合に、データ プロバイダーがデータ型を推定するために使用するデータ型の対応表です。
•表
8 は、長いデータ パラメーターへの入力としてストリームが使用される場合にデ―タ プロバイダーが使用するデータ型の対応表です。
Zen データ型から .NET Framework データ型へのマッピング
表
5 では、ADO.NET データ プロバイダーでサポートされるデータ型と、対応する .NET Framework 型を示します。この表で、DataAdapter を使って DataSet を埋めるときに使用するデータ型を確認してください。
また、この表では DataReader オブジェクトが直接使用される場合のデータの適切なアクセサーも示します。
•[Zen データ型]列は、ネイティブな型名を示しています。
•[PsqlDbType]列は、ADO.NET データ プロバイダーのデータ型の列挙を示します。基本的には、ネイティブ データ型と PsqlDbType とは 1 対 1 で対応しています。ただし、Zen データ型 NUMBER は、Decimal または Double のどちらにも対応しているので、この限りではありません。
•[.NET Framework 型]列は .NET Framework で使用可能な基本データ型を示します。
•[.NET Framework 型指定されたアクセサー]列は、DataReader を使用する場合に、この型の列へのアクセスに使用する必要があるメソッドを示します。
表 5 Zen データ型のマッピング
Zen データ型 | PsqlDbType | .NET Framework 型 | .NET Framework 型指定されたアクセサー |
---|
AUTOTIMESTAMP | Timestamp | DateTime | GetDateTime() |
BFLOAT4 | BFloat4 | Single | GetSingle() |
BFLOAT8 | BFloat8 | Double | GetDouble() |
BIGIDENTITY | BigInt | Int64 | GetInt64() |
BIGINT | BigInt | Int64 | GetDecimal() |
BINARY | Binary | Byte[] | GetBytes() |
BIT | Bit | Byte[] | GetBytes() |
CHAR | Char | String Char[] | GetString() GetChars() |
CURRENCY | Currency | Decimal | GetDecimal() |
DATE | Date | DateTime | GetDateTime() |
DATETIME | DateTime11 | DateTime | GetDateTime() |
DECIMAL | Decimal | Decimal | GetDecimal() |
DOUBLE | Double | Double | GetDouble() |
FLOAT | Float | Double | GetDouble() |
IDENTITY | Identity | Int32 | GetInt32( ) |
INTEGER | Integer | Int32 | GetInt32( ) |
LONGVARBINARY | LongVarBinary | Byte[] | GetBytes() |
LONGVARCHAR | LongVarChar | Byte[] | GetBytes() |
MONEY | Money | Decimal | GetDecimal() |
NCHAR | NChar | String Char[] | GetString() GetChars() |
NLONGVARCHAR | NLongVarChar | String Char[] | GetString() GetChars() |
NUMERIC | Decimal | Decimal | GetDecimal() |
NUMERICSA | DecimalSA | Decimal | GetDecimal() |
NUMERICSTS | DecimalSTS | Decimal | GetDecimal() |
NVARCHAR | NVarChar | String Char[] | GetString() GetChars() |
REAL | Real | Single | GetSingle() |
SMALLIDENTITY | SmallIdentity | Int16 | GetInt16() |
SMALLINT | SmallInt | Int16 | GetInt16() |
TIME | Time | Timespan2 | GetValue() |
TIMESTAMP、TIMESTAMP2 | Timestamp | DateTime | GetDateTime() |
TINYINT | TinyInt | SByte | GetByte() |
UBIGINT | UBigInt | UInt64 | GetUInt64() |
UNIQUE_IDENTIFIER | UniqueIdentifier1 | String | GetString() |
UINTEGER | UInteger | UInt32 | GetUInt32() |
USMALLINT | USmallInt | UInt16 | GetUInt16() |
UTINYINT | UTinyInt | Byte | GetByte() |
VARCHAR | VarChar | String Char[] | GetString() GetChars() |
1 Zen 9.5 以上でサポートされます。 2 timetype 接続オプションの設定によって異なります。 |
パラメーター データ型のマッピング
パラメーターのデータ型は、データ プロバイダーごとに固有のものを使用します。ADO.NET データ プロバイダーは、サーバーへ送信する前に、パラメーター値をネイティブの形式に変換する必要があります。アプリケーションでパラメーターを記述する最もよい方法は、データ プロバイダー固有の型の列挙を使用することです。
汎用プログラミングでは、データ プロバイダー固有の型を使用できない場合があります。プロバイダー固有の DB 型が指定されていない場合は、パラメーター値の System.Data.DbType または .NET Framework 型からデータ型が推定されます。
ADO.NET データ プロバイダーは、次の順序を用いてパラメーターのデータ型を推定します。
•データ プロバイダー固有のデータ型が指定されている場合は、それを使用します。
•System.Data.DbType は指定されているけれども、データ プロバイダー固有のデータ型が指定されていない場合は、System.Data.DbType からデータ型を推定します。
•データ プロバイダー固有のデータ型も System.Data.DbType も指定されていない場合は、.NET Framework 型からデータ型を推定します。
表
6 は、System.Data.DbType のみが指定された場合に、データ プロバイダーがどのようにデータ型を推定するかを示します。
表 6 System.Data.DbTypes から PsqlDbTypes へのマッピング
System.Data.DbType | PsqlDbType |
---|
AnsiString | VarChar |
AnsiStringFixedLength | Char |
Binary | Binary |
Boolean | Integer |
Byte | Integer |
Currency | Currency |
Date | Date |
DateTime | DateTime1 |
Decimal | Decimal または Money |
Double | Double |
Float | Float |
GUID | UniqueIdentifier* |
Int16 | SmallInt |
Int32 | Integer |
Int64 | BigInt |
Int64 | BigIdentity |
Sbyte | Integer |
Single | BFloat4 |
String | NVarChar |
StringFixedLength | NChar |
Time | Time |
Uint16 | USmallInt |
Uint32 | UInteger |
Uint64 | UBigInt |
VarNumeric | Decimal |
1 PSQL 9.5 以上でサポートされます。 |
表
7 では、プロバイダー固有のデータ型も System.Data.DbType も指定されない場合に、データ プロバイダーがデータ型を推定するために使用する対応表を示します。
表 7 .NET Framework 型から PsqlDbType へのマッピング
.NET Framework 型 | PsqlDbType |
---|
Boolean | Integer |
Byte | Integer |
Byte[] | Binary |
DateTime | Timestamp |
Decimal | Decimal |
Double | Double |
Int16 | SmallInt |
Int32 | Integer |
Int64 | BigInt |
Single | BFloat4 |
String | NVarChar VarChar(PvTranslate=Nothing の場合) |
Uint16 | USmallInt |
Uint32 | UInteger |
Uint64 | UBigInt |
ストリーム オブジェクトでサポートされるデータ型
ADO.NET プロバイダーは、表
8 に挙げられているデータ型に対し、長いデータ パラメーターへの入力としてストリームを使用することをサポートしています。
表 8 サポートされるストリーム オブジェクト
プロバイダー データ型 | サポートされるストリーム型 |
---|
LONGVARBINARY | Stream |
LONGVARCHAR | TextReader |
長いデータ パラメーターへの入力としてストリームを使用する
ビデオ クリップや大量のドキュメントなど非常に大きなバイナリ値やテキスト値を表すために、不連続なメモリの使用を許可することによって、パフォーマンス、機能性、スケーラビリティが向上します。
バイナリ データの読み取りに使用されるストリーム オブジェクトは System.IO.Stream オブジェクトから派生し、Framework データ型の byte[] を使用します。
•System.IO.BufferedStream
•System.IO.FileStream
•System.IO.MemoryStream
•System.Net.Sockets.NetworkStream
•System.Security.Cryptography.CryptoStream
テキスト データを読み込むために使用するストリーム オブジェクトは System.IO.TextReader オブジェクトから派生し、Framework データ型の string を使用します。
•System.IO.StreamReader
•System.IO.StringReader
ストリームを使用できるようにするには、PsqlParameter オブジェクトの Value プロパティにストリームの特定のインスタンスを設定します(
PsqlParameter オブジェクトを参照してください)。コマンドが実行されると、データ プロバイダーはストリームから読み込んで値を抽出します。
データ プロバイダーに付属する用例には、ランダムに生成されるデータを使用して LONGVARCHAR 列と LONGVARBINARY 列にデータを挿入するコード例が含まれています。また、用例では、ストリーム オブジェクトを LONGVARCHAR 列および LONGVARBINARY 列への入力として使用する方法も示しています。
パラメーター マーカー
パラメーター マーカー(ストアド プロシージャで使用するものも含む)は、ADO.NET データ プロバイダーでは SQL ステートメントで ? 記号を使用することによって指定されます。
UPDATE emp SET job = ?, sal = ? WHERE empno = ?
パラメーターには名前が付いていないため、SQL ステートメントにあるパラメーターの順番どおりにバインドされなければなりません。つまり、PsqlParameterCollection オブジェクトの Add() メソッド(Parameter オブジェクトをコレクションに追加する)の呼び出しは、コマンド テキストに現れる "?" の順番どおりに発生する必要があるということです。
パラメーター配列
パラメーター配列のバインドは通常 INSERT ステートメントで使用され、テーブルを埋めるために必要な時間を短縮します。アプリケーションは 1 回のコマンド実行で複数のパラメーター値の行を指定することができます。それらの値を 1 回の往復(バックエンド データベース本来の能力によって異なる)でデータベース サーバーに送ることができます。
ADO.NET データ プロバイダーでは、INSERT および UPDATE ステートメントに対して入力パラメーター配列をサポートします。