SQL Server Native Client OLE DB Provider では、コンシューマーがテーブル値パラメーター行のデータを指定するための 2 つのモデル (プッシュ モデルとプル モデル) がサポートされています。 プル モデルを示すサンプルを使用できます。 SQL Server データ プログラミングのサンプルを参照してください。
注
テーブル値パラメーター列には、すべての行に既定値以外の値、またはすべての行の既定値を指定する必要があります。 一部の行には既定値を含めず、それ以外の行には既定値を設定することはできません。 そのため、テーブル値パラメーター バインドでは、テーブル値パラメーター行セット列データに許可される唯一の状態値はDBSTATUS_S_ISNULLされ、DBSTATUS_S_OK。 DBSTATUS_S_DEFAULTエラーが発生し、バインドされた状態の値がDBSTATUS_E_BADSTATUSに設定されます。
プッシュ モデル (すべての Table-Valued パラメーター データをメモリに読み込む)
プッシュ モデルは、パラメーター セット (つまり、ICommand::Execute の DBPARAMS パラメーター) の使用に似ています。 プッシュ モデルは、テーブル値パラメーター行セット オブジェクトが IRowset インターフェイスのカスタマイズされた実装なしで使用される場合にのみ使用されます。 プッシュ モデルは、テーブル値パラメーター行セット内の行数が少なく、アプリケーションに過剰なメモリ負荷が発生しないことが予想される場合に推奨されます。 これは、一般的な OLE DB アプリケーションで現在一般的な機能よりもコンシューマー アプリケーションの機能を必要としないため、プル モデルよりも簡単です。
コンシューマーは、コマンドを実行する前に、テーブル値パラメーター データをすべてプロバイダーに提供する必要があります。 データを提供するために、コンシューマーはテーブル値パラメーターの行セット オブジェクトをテーブル値パラメーターごとに設定します。 テーブル値パラメーター行セット オブジェクトは、行セットの挿入、設定、および削除操作を公開します。この操作は、コンシューマーがテーブル値パラメーター データの操作に使用します。 プロバイダーは、実行時にこのテーブル値パラメーター行セット オブジェクトからデータをフェッチします。
テーブル値パラメーター行セット オブジェクトがコンシューマーに提供されると、コンシューマーはそれを行セット オブジェクトとして処理できます。 コンシューマーは、IColumnsInfo::GetColumnInfo または IColumnsRowset::GetColumnsRowset インターフェイス メソッドを使用して、各列の型情報 (型、最大長、有効桁数、および小数点以下桁数) を取得できます。 その後、コンシューマーは、データのバインドを指定するアクセサーを作成します。 次の手順では、テーブル値パラメーター行セットにデータ行を挿入します。 これは、IRowsetChange::InsertRow を使用して行うことができます。 データを操作する必要がある場合は、テーブル値パラメーター行セット オブジェクトで IRowsetChange::SetData または IRowsetChange::D eleteRows を使用することもできます。 テーブル値パラメーター行セット オブジェクトは、ストリーム オブジェクトと同様に参照カウントされます。
IColumnsRowset::GetColumnsRowset が使用されている場合、結果の列の行セット オブジェクトに対して IRowset::GetNextRows、IRowset::GetData、および IRowset::ReleaseRows メソッドへの後続の呼び出しが行われます。
SQL Server Native Client OLE DB Provider がコマンドの実行を開始すると、テーブル値パラメーター値がこのテーブル値パラメーター行セット オブジェクトからフェッチされ、サーバーに送信されます。
プッシュ モデルでは、コンシューマーによる最小限の作業が必要ですが、実行時にすべてのテーブル値パラメーター データがメモリ内に存在する必要があるため、プル モデルよりも多くのメモリを使用します。
プル モデル (コンシューマーからの Table-Valued パラメーター データのオンデマンド取得)
プル モデルは、次の 2 つのシナリオで役立ちます。
行をストリーム配信する。
別のプロバイダーの行セットがテーブル値パラメーター値として使用されている場合。
プル モデルでは、コンシューマーはプロバイダーにオンデマンドでデータを提供します。 アプリケーションに多数のデータ挿入があり、テーブル値パラメーターの行セット データがメモリ内に過剰なメモリ アクセスを引き起こす場合は、この方法を使用します。 複数の OLE DB プロバイダーが使用されている場合、コンシューマー プル モデルを使用すると、コンシューマーはテーブル値パラメーター値として任意の行セット オブジェクトを提供できます。
プル モデルを使用するには、コンシューマーが行セット オブジェクトの独自の実装を提供する必要があります。 テーブル値パラメーター行セット (CLSID_ROWSET_TVP) でプル モデルを使用する場合、コンシューマーは ITableDefinitionWithConstraints::CreateTableWithConstraints メソッドまたは IOpenRowset::OpenRowset メソッドを通じてプロバイダーが公開するテーブル値パラメーター行セット オブジェクトを集計する必要があります。 コンシューマー オブジェクトは、IRowset インターフェイスの実装をオーバーライドすることのみを想定しています。 次の関数をオーバーライドする必要があります。
IRowset::GetNextRows
IRowset::AddRefRows
IRowset::GetData
IRowset::ReleaseRows
IRowset::RestartPosition
SQL Server Native Client OLE DB Provider は、コンシューマー行セット オブジェクトから一度に 1 つ以上の行を読み取り、テーブル値パラメーターでのストリーミング動作をサポートします。 たとえば、ユーザーはテーブル値パラメーターの行セット データをディスク上 (メモリ内にありません) に配置し、SQL Server Native Client OLE DB Provider で必要な場合にディスクからデータを読み取る機能を実装できます。
コンシューマーは、テーブル値パラメーター行セット オブジェクトの IAccessor::CreateAccessor を使用して、データ形式を SQL Server Native Client OLE DB Provider と通信します。 コンシューマー バッファーからデータを読み取るとき、プロバイダーは、少なくとも 1 つのアクセサー ハンドルを介してすべての書き込み可能な列と既定以外の列が使用可能であることを確認し、対応するハンドルを使用して列データを読み取ります。 あいまいさを回避するには、テーブル値パラメーター行セット列とバインドの間に 1 対 1 の対応が必要です。 同じ列にバインドが重複すると、エラーが発生します。 また、各アクセサーには、DBBindings の iOrdinal メンバーが順番に含まれている必要があります。 IRowset::GetData への呼び出しは行あたりのアクセサーの数と同じ数になり、呼び出しの順序は iOrdinal 値の順序に基づいて低い値から大きい値に基づいて行われます。
プロバイダーは、テーブル値パラメーター行セット オブジェクトによって公開されるほとんどのインターフェイスを実装することが期待されます。 コンシューマーは、最小限のインターフェイス (IRowset) を持つ行セット オブジェクトを実装します。 ブラインド集計のため、残りの必須行セット オブジェクト インターフェイスは、テーブル値パラメーター行セット オブジェクトによって実装されます。
OLE DB プロバイダー用に取得された行セット オブジェクトなど、その他の行セット オブジェクトの場合、コンシューマーが提供する行セットは、OLE DB 仕様で指定されている必須の行セット オブジェクト インターフェイスをすべて実装する必要があります。
実行時に、SQL Server Native Client OLE DB Provider は行セット オブジェクトにコールバックして行をフェッチし、列データを読み取ります。
こちらもご覧ください
Table-Valued パラメーター (OLE DB)
Table-Valued パラメーターの使用 (OLE DB)