SQL Server Native Client OLE DB 提供者支援兩個模型,供取用者指定數據表值參數數據列的數據:推送模型和提取模型。 示範提取模型的範例可供使用;請參閱 SQL Server 數據程式設計範例。
備註
數據表值參數數據行必須具有所有數據列的非預設值,或所有數據列中的預設值。 某些數據列不能有預設值,但不能有其他數據列。 因此,在數據表值參數係結中,數據表值參數數據列集數據行數據允許的唯一狀態值是DBSTATUS_S_ISNULL和DBSTATUS_S_OK。 DBSTATUS_S_DEFAULT會導致失敗,且系結狀態值會設定為 DBSTATUS_E_BADSTATUS。
推送模型 (載入記憶體中的所有 Table-Valued 剖析器資料)
推送模型類似於使用參數集 (也就是 ICommand::Execute 中的 DBPARAMS 參數)。 只有在不使用自定義的 IRowset 介面實作的情況下,才使用數據表值參數數據列集物件時,才會使用推送模型。 當數據表值參數數據列集中的數據列數目很小,而且不會對應用程式造成過多的記憶體壓力時,建議推送模型。 這比提取模型簡單,因為它不需要取用者應用程式比一般 OLE DB 應用程式中目前通用的功能還要多。
取用者應該在執行命令之前,先將所有數據表值參數數據提供給提供者。 為了提供數據,取用者會為每個數據表值參數填入數據表值參數數據列集物件。 數據表值參數數據列集物件會公開數據列集 Insert、Set 和 Delete 作業,取用者將用來作數據表值參數數據。 提供者會在運行時間從這個數據表值參數數據列集物件擷取數據。
當數據表值參數數據列集物件提供給取用者時,取用者可以將它當作數據列集對象來處理。 取用者可以使用 IColumnsInfo::GetColumnInfo 或 IColumnsRowset::GetColumnsRowset::GetColumnsRowset 介面方法來取得每個數據行的類型資訊(類型、最大長度、有效位數和小數位數)。 取用者接著會建立存取子來指定數據的系結。 下一個步驟是將數據列插入數據表值參數數據列集。 這可以使用 IRowsetChange::InsertRow 來完成。 如果您必須作數據,IRowsetChange::SetData 或 IRowsetChange::D eleteRows 也可以在數據表值參數數據列集物件上使用。 數據表值參數數據列集物件會計算參考計數,類似於數據流物件。
如果使用 IColumnsRowset::GetColumnsRowset,則會在結果數據行的數據列集物件上對 IRowset::GetNextRows、IRowset::GetData 和 IRowset::ReleaseRows 方法進行後續呼叫。
在 SQL Server Native Client OLE DB 提供者開始執行命令之後,將會從這個數據表值參數數據列集物件擷取數據表值參數值,並傳送至伺服器。
推送模型需要取用者最少的工作,但會使用比提取模型更多的記憶體,因為所有數據表值參數數據都必須在運行時間位於記憶體中。
提取模型(從取用者依需求取得 Table-Valued 參數數據)
提取模型適用於兩個案例:
若要串流數據列。
如果來自另一個提供者的數據列集正當做數據表值參數值使用。
在提取模型中,取用者會視需要提供數據給提供者。 如果您的應用程式有許多數據插入,而且記憶體中的數據表值參數數據列集資料會導致記憶體過多,請使用此方法。 如果使用多個 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 提供者會一次從取用者數據列集物件讀取一或多個數據列,以支援數據表值參數中的串流行為。 例如,使用者可能有磁碟上的數據表值參數數據列集數據(不在記憶體中),而且可能會在 SQL Server Native Client OLE DB 提供者需要時實作從磁碟讀取數據的功能。
取用者會在數據表值參數數據列集物件上使用 IAccessor::CreateAccessor,將其數據格式傳達給 SQL Server Native Client OLE DB 提供者。 從取用者緩衝區讀取數據時,提供者會確認所有可寫入和非預設數據行都可透過至少一個存取子句柄取得,並使用對應的句柄來讀取數據行數據。 為了避免模棱兩可,數據表值參數數據列集數據行與系結之間應該有一對一的對應。 對相同數據行的重複系結會導致錯誤。 此外,每個存取子應該都會依序擁有 DBBindings 的 iOrdinal 成員。 IRowset::GetData 的呼叫數目會和每個數據列的存取子數目一樣多,而呼叫的順序會根據 iOrdinal 值的順序從較低到較高的值。
提供者應該實作數據表值參數數據列集物件所公開的大部分介面。 取用者會實作具有最小介面的數據列集物件(IRowset)。 由於盲目匯總,其餘強制數據列集物件介面將由數據表值參數數據列集物件實作。
對於任何其他數據列集物件,例如針對任何 OLE DB 提供者取得的數據列集物件,取用者提供的數據列集必須實作 OLE DB 規格中指定的所有強制數據列集物件介面。
在執行時,SQL Server Native Client OLE DB 提供者會回呼數據列集物件,以擷取數據列和讀取數據行數據。