次の方法で共有


テーブル値パラメータへのデータの挿入

SQL Server Native Client OLE DB プロバイダでは、コンシューマがテーブル値パラメータの行にデータを指定するときのモデルとして、プッシュ モデルとプル モデルという 2 つのモデルがサポートされます。プル モデルの使用方法を示すサンプルがあります。詳細については、「SQL Server のサンプルとサンプル データベースのインストールに関する注意点」を参照してください。

注意注意

テーブル値パラメータの列では、すべての行に既定値以外の値が格納されているか、すべての行に既定値が格納されているかのどちらかでなければなりません。一部の行にだけ既定値を格納することはできません。したがって、テーブル値パラメータのバインドでは、テーブル値パラメータの行セット列データに許容される状態値は DBSTATUS_S_ISNULL と DBSTATUS_S_OK だけです。DBSTATUS_S_DEFAULT ではエラーが発生し、バインド状態値が DBSTATUS_E_BADSTATUS に設定されます。

プッシュ モデル (メモリ内のすべてのテーブル値パラメータのデータを読み込む)

プッシュ モデルは、パラメータ セットの使用方法 (ICommand::Execute の DBPARAMS パラメータ) に似ています。プッシュ モデルが使用されるのは、IRowset インターフェイスをカスタマイズして実装せずに、テーブル値パラメータの行セット オブジェクトを使用する場合だけです。テーブル値パラメータの行セット内の行数が少なく、アプリケーションに高いメモリ負荷がかからないことが見込まれる場合は、プッシュ モデルをお勧めします。プッシュ モデルは、プル モデルよりも簡単な方法です。このモデルでは、コンシューマ アプリケーションに対し、標準的な OLE DB アプリケーションで現在一般的である以上の機能は要求されません。

コンシューマは、コマンドを実行する前に、すべてのテーブル値パラメータのデータをプロバイダに提供します。コンシューマは、データを提供するために、各テーブル値パラメータ用にテーブル値パラメータの行セット オブジェクトを作成します。テーブル値パラメータの行セット オブジェクトでは、行セットの挿入、設定、および削除の各操作が公開されます。このような操作は、コンシューマがテーブル値パラメータのデータを操作する際に使用します。プロバイダでは、実行時にこのテーブル値パラメータの行セット オブジェクトからデータをフェッチします。

テーブル値パラメータの行セット オブジェクトがコンシューマに提供されると、コンシューマはそのオブジェクトを行セット オブジェクトとして処理できます。コンシューマは IColumnsInfo::GetColumnInfo インターフェイス メソッドまたは IColumnsRowset::GetColumnsRowset インターフェイス メソッドを使用して、各列の型情報 (型、最大長、有効桁数、および小数点以下桁数) を取得できます。その後、コンシューマはアクセサを作成してデータのバインドを指定します。次に、データ行をテーブル値パラメータの行セットに挿入します。この操作を行うには、IRowsetChange::InsertRow を使用します。データを操作する必要がある場合は、テーブル値パラメータの行セット オブジェクトで IRowsetChange::SetData または IRowsetChange::DeleteRows も使用できます。テーブル値パラメータの行セット オブジェクトは、ストリーム オブジェクトと同様に参照数がカウントされます。

IColumnsRowset::GetColumnsRowset が使用されると、その後、結果の列の行セット オブジェクトで IRowset::GetNextRowsIRowset::GetData、および IRowset::ReleaseRows の各メソッドが呼び出されます。

SQL Server Native Client OLE DB プロバイダでコマンドの実行が開始されると、テーブル値パラメータの値は、このテーブル値パラメータの行セット オブジェクトからフェッチされ、サーバーに送信されます。

プッシュ モデルでは、コンシューマによる作業は必要最小限になりますが、使用するメモリはプル モデルよりも多くなります。これは、すべてのテーブル値パラメータのデータが実行時にメモリ内に存在する必要があるためです。

プル モデル (要求時にコンシューマからテーブル値パラメータのデータを取得する)

プル モデルは、次の 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 プロバイダでは、コンシューマの行セット オブジェクトから一度に 1 つ以上の行を読み取り、テーブル値パラメータのストリーミング動作をサポートします。たとえば、ユーザーは、(メモリではなく) ディスクにテーブル値パラメータの行セットのデータを保持し、SQL Server Native Client OLE DB プロバイダから要求されたときにディスクからデータを読み取る機能を実装する場合があります。

コンシューマは、テーブル値パラメータの行セット オブジェクトで IAccessor::CreateAccessor を使用して、コンシューマのデータ形式を SQL Server Native Client OLE DB プロバイダに通知します。プロバイダは、データをコンシューマ バッファから読み取る際に、既定以外の書き込み可能な列すべてを少なくとも 1 つのアクセサ ハンドルで使用できることを確認し、対応するハンドルを使用して列のデータを読み取ります。あいまいさを排除するため、テーブル値パラメータの行セットの列とバインドが一対一で対応するようにする必要があります。同じ列に対するバインドが重複すると、エラーが発生します。また、各アクセサでは、DBBindings の iOrdinal メンバを順番に使用します。IRowset::GetData が各行のアクセサの数と同じ回数だけ呼び出されます。呼び出しの順序は、iOrdinal 値の順序 (昇順) に基づきます。

プロバイダは、テーブル値パラメータの行セット オブジェクトで公開されるインターフェイスのほとんどを実装することが期待されています。コンシューマは、最小限のインターフェイス (IRowset) を使用して行セット オブジェクトを実装します。無計画な集計があるため、残りの必須の行セット オブジェクトのインターフェイスは、テーブル値パラメータの行セット オブジェクトによって実装されます。

任意の OLE DB プロバイダ用に取得した行セット オブジェクトなどの他の行セット オブジェクトの場合、コンシューマが提供した行セットは、OLE DB の仕様で指定されているとおり、必須の行セット オブジェクトのインターフェイスすべてを実装する必要があります。

実行時に、SQL Server Native Client OLE DB プロバイダは行セット オブジェクトにコールバックし、行をフェッチして列のデータを読み取ります。