大型 CLR 使用者定義型別 (OLE DB)
本主題討論 SQL Server Native Client 中 OLE DB 的變更,以支援大型 Common Language Runtime (CLR) 使用者定義型別 (UDT)。
如需有關 SQL Server Native Client 中大型 CLR UDT 支援的詳細資訊,請參閱<大型 CLR 使用者定義型別>。
資料格式
SQL Server Native Client 使用 ~0 來代表大型物件 (LOB) 類型的無限制大小的値長度。從 SQL Server 2008 開始,~0 也代表大於 8,000 位元組的 CLR UDT 大小。
下表顯示參數和資料列集內的資料類型對應:
SQL Server 資料類型 |
OLE DB 資料類型 |
記憶體配置 |
値 |
---|---|---|---|
CLR UDT |
DBTYPE_UDT |
BYTE[](位元組陣列) |
132 (oledb.h) |
UDT 值會表示為位元組陣列。支援與十六進位字串之間的來回轉換。常值會表示為具有 "0x" 前置詞的十六進位字串。十六進位字串是使用基底 16 的二進位資料文字表示法。從伺服器類型 varbinary(10) 轉換成 DBTYPE_STR 即為一例,這項作業會導致 20 個字元的十六進位表示,其中每一組字元都代表單一的位元組。
ITableDefinition::CreateTable 中的資料類型對應
當需要 UDT 資料行時,下列資訊會用於 ITableDefinition::CreateTable 所使用的 DBCOLUMNDESC 結構中:
OLE DB 資料類型 (wType) |
pwszTypeName |
SQL Server 資料類型 |
rgPropertySets |
---|---|---|---|
DBTYPE_UDT |
忽略 |
UDT |
必須包含 DBPROPSET_SQLSERVERCOLUMN 屬性集。 |
ICommandWithParameters::GetParameterInfo
透過 prgParamInfo 以 DBPARAMINFO 結構所傳回的資訊如下:
參數類型 |
wType |
ulParamSize |
bPrecision |
bScale |
dwFlags DBPARAMFLAGS_ISLONG |
---|---|---|---|---|---|
DBTYPE_UDT (長度小於或等於 8,000 個位元組) |
"DBTYPE_UDT" |
n |
未定義 |
未定義 |
清除 |
DBTYPE_UDT (長度大於 8,000 個位元組) |
"DBTYPE_UDT" |
~0 |
未定義 |
未定義 |
集合 |
ICommandWithParameters::SetParameterInfo
以 DBPARAMBINDINFO 結構所提供的資訊必須與下列相符:
參數類型 |
pwszDataSourceType |
ulParamSize |
bPrecision |
bScale |
dwFlags DBPARAMFLAGS_ISLONG |
---|---|---|---|---|---|
DBTYPE_UDT (長度小於或等於 8,000 個位元組) |
DBTYPE_UDT |
n |
忽略 |
忽略 |
如果要使用 DBTYPE_IUNKNOWN 傳遞此參數,則必須設定。 |
DBTYPE_UDT (長度大於 8,000 個位元組) |
DBTYPE_UDT |
~0 |
忽略 |
忽略 |
忽略 |
ISSCommandWithParameters
應用程式會使用 ISSCommandWithParameters 來取得並設定定義於 Parameter Properties 區段中的參數屬性。
IColumnsRowset::GetColumnsRowset
傳回的資料行如下:
資料行類型 |
DBCOLUMN_TYPE |
DBCOLUMN_COLUMNSIZE |
DBCOLUMN_PRECISION |
DBCOLUMN_SCALE |
DBCOLUMN_FLAGS_ISLONG |
DBCOLUMNS_ISSEARCHABLE |
DBCOLUMN_OCTETLENGTH |
---|---|---|---|---|---|---|---|
DBTYPE_UDT (長度小於或等於 8,000 個位元組) |
DBTYPE_UDT |
n |
NULL |
NULL |
清除 |
DB_ALL_EXCEPT_LIKE |
n |
DBTYPE_UDT (長度大於 8,000 個位元組) |
DBTYPE_UDT |
~0 |
NULL |
NULL |
集合 |
DB_ALL_EXCEPT_LIKE |
0 |
下列資料行也會針對 UDT 而定義:
資料行識別碼 |
類型 |
描述 |
---|---|---|
DBCOLUMN_UDT_CATALOGNAME |
DBTYPE_WSTR |
對於 UDT 資料行而言,此為定義 UDT 之目錄的名稱。 |
DBCOLUMN_UDT_SCHEMANAME |
DBTYPE_WSTR |
對於 UDT 資料行而言,此為定義 UDT 之結構描述的名稱。 |
DBCOLUMN_UDT_NAME |
DBTYPE_WSTR |
對於 UDT 資料行而言,此為 UDT 的單一部分名稱。 |
DBCOLUMN_ASSEMBLY_TYPENAME |
DBTYPE_WSTR |
對於 UDT 資料行而言,此為 UDT 的完整類型名稱。組件類型的完整名稱可以讓您使用 Type.GetType 方法來具現化該類型的物件。 |
IColumnsInfo::GetColumnInfo
以 DBCOLUMNINFO 結構所傳回的資訊如下:
參數類型 |
wType |
ulColumnSize |
bPrecision |
bScale |
dwFlags DBCOLUMNFLAGS_ISLONG |
---|---|---|---|---|---|
DBTYPE_UDT (長度小於或等於 8,000 個位元組) |
DBTYPE_UDT |
n |
~0 |
~0 |
清除 |
DBTYPE_UDT (長度大於 8,000 個位元組) |
DBTYPE_UDT |
~0 |
~0 |
~0 |
集合 |
COLUMNS 資料列集 (結構描述資料列集)
下列資料行值是針對 UDT 類型所傳回:
資料行類型 |
DATA_TYPE |
COLUMN_FLAGS、DBCOLUMFLAGS_ISLONG |
CHARACTER_OCTET_LENGTH |
---|---|---|---|
DBTYPE_UDT (長度小於或等於 8,000 個位元組) |
DBTYPE_UDT |
清除 |
n |
DBTYPE_UDT (長度大於 8,000 個位元組) |
DBTYPE_UDT |
集合 |
0 |
下列其他資料行也會針對 UDT 而定義:
資料行識別碼 |
類型 |
描述 |
---|---|---|
SS_UDT_CATALOGNAME |
DBTYPE_WSTR |
對於 UDT 資料行而言,此為定義 UDT 之目錄的名稱。 |
SS_UDT_SCHEMANAME |
DBTYPE_WSTR |
對於 UDT 資料行而言,此為定義 UDT 之結構描述的名稱。 |
SS_UDT_NAME |
DBTYPE_WSTR |
對於 UDT 資料行而言,此為 UDT 的單一部分名稱。 |
SS_ASSEMBLY_TYPENAME |
DBTYPE_WSTR |
對於 UDT 資料行而言,此為 UDT 的完整類型名稱。組件類型的完整名稱可以讓您使用 Type.GetType 方法來具現化該類型的物件。 |
有關 PROCEDURE_PARAMETERS 資料列集方面,DATA_TYPE 會包含與 COLUMNS 結構描述資料列集相同的値,而 TYPE_NAME 則會包含 UDT。也會定義相同的其他資料行。
使用者定義型別不會出現在 PROVIDER_TYPES 結構描述資料列集中。
繫結和轉換
繫結資料類型 |
UDT 到伺服器 |
非 UDT 到伺服器 |
從伺服器中的 UDT |
從伺服器中的非 UDT |
---|---|---|---|---|
DBTYPE_UDT |
支援 (5) |
錯誤 (1) |
支援 (5) |
錯誤 (4) |
DBTYPE_BYTES |
支援 (5) |
無 |
支援 (5) |
無 |
DBTYPE_WSTR |
支援 (2)、(5) |
無 |
支援 (3)、(5)、(6) |
無 |
DBTYPE_BSTR |
支援 (2)、(5) |
無 |
支援 (3)、(5) |
無 |
DBTYPE_STR |
支援 (2)、(5) |
無 |
支援 (3)、(5) |
無 |
DBTYPE_IUNKNOWN |
支援 (6) |
無 |
支援 (6) |
無 |
DBTYPE_VARIANT (VT_UI1 | VT_ARRAY) |
支援 (5) |
無 |
支援 (3)、(5) |
無 |
DBTYPE_VARIANT (VT_BSTR) |
支援 (2)、(5) |
無 |
無 |
無 |
索引鍵到符號
符號 |
意義 |
---|---|
1 |
如果使用 ICommandWithParameters::SetParameterInfo 指定了 DBTYPE_UDT 以外的伺服器類型,而且存取子類型為 DBTYPE_UDT,則當陳述式執行時會發生錯誤。此錯誤將是 DB_E_ERRORSOCCURRED,而參數狀態將是 DBSTATUS_E_BADACCESSOR。 針對不是 UDT 的伺服器參數指定 UDT 類型的參數是一項錯誤。 |
2 |
資料會從十六進位字串轉換成二進位資料。 |
3 |
資料會從二進位資料轉換成十六進位字串。 |
4 |
在使用 CreateAccessor 或 GetNextRows 時可能會發生驗證。錯誤是 DB_E_ERRORSOCCURRED。繫結狀態設定為 DBBINDSTATUS_UNSUPPORTEDCONVERSION。 |
5 |
可能會使用 BY_REF。 |
6 |
UDT 參數可以在 DBBINDING 中繫結為 DBTYPE_IUNKNOWN。繫結至 DBTYPE_IUNKNOWN 表示應用程式想要使用 ISequentialStream 介面將資料處理為資料流。當取用者在繫結中將 wType 指定為類型 DBTYPE_IUNKNOWN,而預存程序相對應的資料行或輸出參數為 UDT 時,SQL Server Native Client 會傳回 ISequentialStream。對於輸入參數而言,SQL Server Native Client 將會查詢 ISequentialStream 介面。 在大型 UDT 的情況下,您可以選擇不要在使用 DBTYPE_IUNKNOWN 繫結時繫結 UDT 資料的長度。不過,小型 UDT 則必須繫結長度。如果下列其中一項或多項成立,則 DBTYPE_UDT 參數可以指定為大型 UDT:
對於資料列資料而言,DBTYPE_IUNKNOWN 繫結只適用於大型 UDT。您可以在 Rowset 或 Command 物件的 IColumnsInfo 介面上使用 IColumnsInfo::GetColumnInfo 方法來查明資料行是否為大型 UDT 類型。如果下列其中一項或多項成立,則 DBTYPE_UDT 資料行會是大型 UDT 資料行:
|
DBTYPE_NULL 和 DBTYPE_EMPTY 可以針對輸入參數而繫結,但是不能針對輸出參數或結果而繫結。當針對輸入參數來繫結時,狀態必須針對 DBTYPE_NULL 設定為 DBSTATUS_S_ISNULL,或針對 DBTYPE_EMPTY 設定為 DBSTATUS_S_DEFAULT。DBTYPE_BYREF 不適用於 DBTYPE_NULL 或 DBTYPE_EMPTY。
DBTYPE_UDT 也可以轉換成 DBTYPE_EMPTY 或 DBTYPE_NULL。不過,DBTYPE_NULL 和 DBTYPE_EMPTY 不能轉換成 DBTYPE_UDT。這與 DBTYPE_BYTES 一致。ISSCommandWithParameters 可用來將 UDT 當做參數處理。
OLE DB 核心服務 (IDataConvert) 提供的資料轉換不適用於 DBTYPE_UDT。
不支援其他任何繫結。
IRowsetFind 的相容性
對於 UDT 類型而言,只支援下列比較:
EQ
NE
IGNORE
如果嘗試其他任何比較,就會傳回 DB_E_BADCOMPAREOP。
UDT 的 BCP 支援
UDT 值只能當做字元或二進位值來匯入及匯出。
UDT 的下層用戶端行為
UDT 受限於與下層用戶端對應的類型,如下所示:
用戶端版本 |
DBTYPE_UDT (長度小於或等於 8,000 個位元組) |
DBTYPE_UDT (長度大於 8,000 個位元組) |
---|---|---|
SQL Server 2000 及更早版本 |
varbinary |
影像 |
SQL Server 2005 |
UDT |
varbinary(max) |
SQL Server 2008 |
UDT |
UDT |
當 DataTypeCompatibility (SSPROP_INIT_DATATYPECOMPATIBILITY) 設定為 "80" 時,大型 UDT 類型會以針對下層用戶端顯示的相同方式向用戶端顯示。