SQL Server Native Client OLE DB 提供程序公开 ITableDefinition::CreateTable 函数,使使用者能够创建 SQL Server 表。 使用者使用 CreateTable 创建使用者命名的永久表,以及 SQL Server Native Client OLE DB 访问接口生成的唯一名称的永久表或临时表。
当使用者调用 ITableDefinition::CreateTable 时,如果DBPROP_TBL_TEMPTABLE属性的值VARIANT_TRUE,则 SQL Server Native Client OLE DB 提供程序将为使用者生成临时表名称。 使用者将 CreateTable 方法的 pTableID 参数设置为 NULL。 SQL Server Native Client OLE DB 访问接口生成的名称的临时表不会显示在 TABLES 行集中,但可通过 IOpenRowset 接口访问。
当使用者在 pTableID 参数的 uName 联合的 pwszName 成员中指定表名时,SQL Server Native Client OLE DB 访问接口会创建一个具有该名称的 SQL Server 表。 SQL Server 表命名约束适用,表名可以指示永久表,也可以指示本地或全局临时表。 有关详细信息,请参阅 CREATE TABLE。 ppTableID 参数可以为 NULL。
SQL Server Native Client OLE DB 访问接口可以生成永久表或临时表的名称。 当使用者将 pTableID 参数设置为 NULL 并将 ppTableID 设置为指向有效的 DBID*时,SQL Server Native Client OLE DB 访问接口将返回由 ppTableID 值指向的 uName 联合的pwszName 成员中表生成的名称。 若要创建临时 SQL Server Native Client OLE DB 提供程序命名表,使用者在 rgPropertySets 参数引用的表属性集中包括 OLE DB 表属性DBPROP_TBL_TEMPTABLE。 SQL Server Native Client OLE DB 提供程序命名的临时表是本地表。
如果 pTableID 参数的 eKind 成员未指示DBKIND_NAME,则 CreateTable 返回DB_E_BADTABLEID。
DBCOLUMNDESC 用法
使用者可以使用 pwszTypeName 成员或 wType 成员来指示列数据类型。 如果使用者在 pwszTypeName 中指定数据类型,SQL Server Native Client OLE DB 访问接口将忽略 wType 的值。
如果使用 pwszTypeName 成员,使用者将使用 SQL Server 数据类型名称指定数据类型。 有效的数据类型名称是在PROVIDER_TYPES架构行集TYPE_NAME列中返回的名称。
SQL Server Native Client OLE DB 访问接口识别 wType 成员中 OLE DB 枚举的 DBTYPE 值的子集。 有关详细信息,请参阅 ITableDefinition 中的数据类型映射。
注释
如果使用者设置 pTypeInfo 或 pclsid 成员来指定列数据类型,则 CreateTable 将返回DB_E_BADTYPE。
使用者在 DBCOLUMNDESC dbcid 成员的 uName 联合的 pwszName 成员中指定列名。 列名称指定为 Unicode 字符串。 dbcid 的 eKind 成员必须DBKIND_NAME。 如果 eKind 无效,pwszName 为 NULL,或者 pwszName 的值不是有效的 SQL Server 标识符,则 CreateTable 返回DB_E_BADCOLUMNID。
所有列属性都可用于为表定义的所有列。 如果属性值设置冲突,CreateTable 可以返回DB_S_ERRORSOCCURRED或DB_E_ERRORSOCCURRED。 当无效的列属性设置导致 SQL Server 表创建失败时,CreateTable 将返回错误。
DBCOLUMNDESC 中的列属性解释如下。
| 属性 ID | DESCRIPTION |
|---|---|
| DBPROP_COL_AUTOINCREMENT | R/W:读/写 默认值:VARIANT_FALSE说明:设置所创建的列的标识属性。 对于 SQL Server,标识属性对表中的单个列有效。 当 SQL Server Native Client OLE DB 访问接口尝试在服务器上创建表时,将属性设置为VARIANT_TRUE会产生错误。 当刻度为 0 时,SQL Server 标识属性仅对 整数、 数字和 十进制 类型有效。 当 SQL Server Native Client OLE DB 访问接口尝试在服务器上创建表时,将属性设置为对任何其他数据类型的列VARIANT_TRUE将生成错误。 SQL Server Native Client OLE DB 访问接口在DBPROP_COL_AUTOINCREMENT和DBPROP_COL_NULLABLE都VARIANT_TRUE且DBPROP_COL_NULLABLE的 dwOption 不DBPROPOPTIONS_REQUIRED时返回DB_S_ERRORSOCCURRED。 当DBPROP_COL_AUTOINCREMENT和DBPROP_COL_NULLABLE同时VARIANT_TRUE且 DBPROP_COL_NULLABLE的 dwOption 等于DBPROPOPTIONS_REQUIRED时,将返回DB_E_ERRORSOCCURRED。 该列使用 SQL Server 标识属性定义,DBPROP_COL_NULLABLE dwStatus 成员设置为DBPROPSTATUS_CONFLICTING。 |
| DBPROP_COL_DEFAULT | R/W:读/写 默认值:无 说明:为列创建 SQL Server DEFAULT 约束。 vValue DBPROP 成员可以是任意类型。 vValue.vt 成员应指定与列的数据类型兼容的类型。 例如,将 BSTR N/A 定义为定义为DBTYPE_WSTR的列的默认值是兼容的匹配项。 在定义为DBTYPE_R8的列上定义相同的默认值会在 SQL Server Native Client OLE DB 访问接口尝试在服务器上创建表时生成错误。 |
| DBPROP_COL_DESCRIPTION | R/W:读/写 默认值:无 说明:sql Server Native Client OLE DB 访问接口未实现DBPROP_COL_DESCRIPTION列属性。 当使用者尝试写入属性值时,DBPROP 结构的 dwStatus 成员将返回DBPROPSTATUS_NOTSUPPORTED。 设置该属性并不构成 SQL Server Native Client OLE DB 访问接口的致命错误。 如果所有其他参数值都有效,则会创建 SQL Server 表。 |
| DBPROP_COL_FIXEDLENGTH | R/W:读/写 默认值:VARIANT_FALSE 说明:当使用者使用 DBCOLUMNDESC 的 wType 成员定义列的数据类型时,SQL Server Native Client OLE DB 访问接口使用DBPROP_COL_FIXEDLENGTH来确定数据类型映射。 有关详细信息,请参阅 ITableDefinition 中的数据类型映射。 |
| DBPROP_COL_NULLABLE | R/W:读/写 默认值:无 说明:创建表时,SQL Server Native Client OLE DB 访问接口指示在设置属性时列是否应接受 null 值。 如果未设置属性,则列接受 NULL 作为值的能力由 SQL Server ANSI_NULLS默认数据库选项决定。 SQL Server Native Client OLE DB 提供程序是符合 ISO 的提供程序。 连接的会话表现出 ISO 行为。 如果使用者未设置DBPROP_COL_NULLABLE,则列接受 null 值。 |
| DBPROP_COL_PRIMARYKEY | R/W:读/写 默认值:VARIANT_FALSE说明:VARIANT_TRUE时,SQL Server Native Client OLE DB 访问接口会创建具有 PRIMARY KEY 约束的列。 定义为列属性时,只有一列可以确定约束。 当 SQL Server Native Client OLE DB 访问接口尝试创建 SQL Server 表时,为多个列设置属性VARIANT_TRUE将返回错误。 注意:使用者可以使用 IIndexDefinition::CreateIndex 在两列或更多列上创建 PRIMARY KEY 约束。 SQL Server Native Client OLE DB 访问接口在DBPROP_COL_PRIMARYKEY和DBPROP_COL_UNIQUE均VARIANT_TRUE且DBPROP_COL_UNIQUE 的 dwOption 未DBPROPOPTIONS_REQUIRED时返回DB_S_ERRORSOCCURRED。 当DBPROP_COL_PRIMARYKEY和DBPROP_COL_UNIQUE同时VARIANT_TRUE且 DBPROP_COL_UNIQUE的 dwOption 等于DBPROPOPTIONS_REQUIRED时,将返回DB_E_ERRORSOCCURRED。 该列使用 SQL Server 标识属性定义,DBPROP_COL_PRIMARYKEY dwStatus 成员设置为DBPROPSTATUS_CONFLICTING。 SQL Server Native Client OLE DB 访问接口在DBPROP_COL_PRIMARYKEY和DBPROP_COL_NULLABLE都VARIANT_TRUE时返回错误。 当使用者尝试对无效 SQL Server 数据类型的列创建 PRIMARY KEY 约束时,SQL Server Native Client OLE DB 访问接口将返回 SQL Server 的错误。 不能对使用 SQL Server 数据类型 位、 文本、 ntext 和 图像创建的列定义 PRIMARY KEY 约束。 |
| DBPROP_COL_UNIQUE | R/W:读/写 默认值:VARIANT_FALSE说明:向列应用 SQL Server UNIQUE 约束。 定义为列属性时,约束仅应用于单个列。 使用者可以使用 IIndexDefinition::CreateIndex 对两列或更多列的组合值应用 UNIQUE 约束。 SQL Server Native Client OLE DB 访问接口在DBPROP_COL_PRIMARYKEY和DBPROP_COL_UNIQUE均VARIANT_TRUE且 dwOption 未DBPROPOPTIONS_REQUIRED时返回DB_S_ERRORSOCCURRED。 当DBPROP_COL_PRIMARYKEY和DBPROP_COL_UNIQUE同时VARIANT_TRUE且 dwOption 等于DBPROPOPTIONS_REQUIRED时,将返回DB_E_ERRORSOCCURRED。 该列使用 SQL Server 标识属性定义,DBPROP_COL_PRIMARYKEY dwStatus 成员设置为DBPROPSTATUS_CONFLICTING。 SQL Server Native Client OLE DB 访问接口在DBPROP_COL_NULLABLE和DBPROP_COL_UNIQUE均VARIANT_TRUE且 dwOption 不DBPROPOPTIONS_REQUIRED时返回DB_S_ERRORSOCCURRED。 当DBPROP_COL_NULLABLE和DBPROP_COL_UNIQUE同时VARIANT_TRUE且 dwOption 等于DBPROPOPTIONS_REQUIRED时,将返回DB_E_ERRORSOCCURRED。 该列使用 SQL Server 标识属性定义,DBPROP_COL_NULLABLE dwStatus 成员设置为DBPROPSTATUS_CONFLICTING。 当使用者尝试对无效 SQL Server 数据类型的列创建 UNIQUE 约束时,SQL Server Native Client OLE DB 访问接口将返回来自 SQL Server 的错误。 不能对使用 SQL Server 位 数据类型创建的列定义 UNIQUE 约束。 |
当使用者调用 ITableDefinition::CreateTable 时,SQL Server Native Client OLE DB 访问接口将解释表属性,如下所示。
| 属性 ID | DESCRIPTION |
|---|---|
| DBPROP_TBL_TEMPTABLE | R/W:读/写 默认值:VARIANT_FALSE说明:默认情况下,SQL Server Native Client OLE DB 访问接口创建由使用者命名的表。 VARIANT_TRUE时,SQL Server Native Client OLE DB 访问接口将为使用者生成临时表名称。 使用者将 CreateTable 的 pTableID 参数设置为 NULL。 ppTableID 参数必须包含有效的指针。 |
如果使用者请求在成功创建的表上打开行集,SQL Server Native Client OLE DB 访问接口将打开一个游标支持的行集。 可以在传递的属性集中指示任何行集属性。
此示例创建 SQL Server 表。
// This CREATE TABLE statement shows the details of the table created by
// the following example code.
//
// CREATE TABLE OrderDetails
// (
// OrderID int NOT NULL
// ProductID int NOT NULL
// CONSTRAINT PK_OrderDetails
// PRIMARY KEY CLUSTERED (OrderID, ProductID),
// UnitPrice money NOT NULL,
// Quantity int NOT NULL,
// Discount decimal(2,2) NOT NULL
// DEFAULT 0
// )
//
// The PRIMARY KEY constraint is created in an additional example.
HRESULT CreateTable
(
ITableDefinition* pITableDefinition
)
{
DBID dbidTable;
const ULONG nCols = 5;
ULONG nCol;
ULONG nProp;
DBCOLUMNDESC dbcoldesc[nCols];
HRESULT hr;
// Set up column descriptions. First, set default property values for
// the columns.
for (nCol = 0; nCol < nCols; nCol++)
{
dbcoldesc[nCol].pwszTypeName = NULL;
dbcoldesc[nCol].pTypeInfo = NULL;
dbcoldesc[nCol].rgPropertySets = new DBPROPSET;
dbcoldesc[nCol].pclsid = NULL;
dbcoldesc[nCol].cPropertySets = 1;
dbcoldesc[nCol].ulColumnSize = 0;
dbcoldesc[nCol].dbcid.eKind = DBKIND_NAME;
dbcoldesc[nCol].wType = DBTYPE_I4;
dbcoldesc[nCol].bPrecision = 0;
dbcoldesc[nCol].bScale = 0;
dbcoldesc[nCol].rgPropertySets[0].rgProperties =
new DBPROP[NCOLPROPS_MAX];
dbcoldesc[nCol].rgPropertySets[0].cProperties = NCOLPROPS_MAX;
dbcoldesc[nCol].rgPropertySets[0].guidPropertySet =
DBPROPSET_COLUMN;
for (nProp = 0; nProp < NCOLPROPS_MAX; nProp++)
{
dbcoldesc[nCol].rgPropertySets[0].rgProperties[nProp].
dwOptions = DBPROPOPTIONS_REQUIRED;
dbcoldesc[nCol].rgPropertySets[0].rgProperties[nProp].colid
= DB_NULLID;
VariantInit(
&(dbcoldesc[nCol].rgPropertySets[0].rgProperties[nProp].
vValue));
dbcoldesc[nCol].rgPropertySets[0].rgProperties[nProp].
vValue.vt = VT_BOOL;
}
}
// Set the column-specific information.
dbcoldesc[0].dbcid.uName.pwszName = L"OrderID";
dbcoldesc[0].rgPropertySets[0].rgProperties[0].dwPropertyID =
DBPROP_COL_NULLABLE;
dbcoldesc[0].rgPropertySets[0].rgProperties[0].vValue.boolVal =
VARIANT_FALSE;
dbcoldesc[0].rgPropertySets[0].cProperties = 1;
dbcoldesc[1].dbcid.uName.pwszName = L"ProductID";
dbcoldesc[1].rgPropertySets[0].rgProperties[0].dwPropertyID =
DBPROP_COL_NULLABLE;
dbcoldesc[1].rgPropertySets[0].rgProperties[0].vValue.boolVal =
VARIANT_FALSE;
dbcoldesc[1].rgPropertySets[0].cProperties = 1;
dbcoldesc[2].dbcid.uName.pwszName = L"UnitPrice";
dbcoldesc[2].wType = DBTYPE_CY;
dbcoldesc[2].rgPropertySets[0].rgProperties[0].dwPropertyID =
DBPROP_COL_NULLABLE;
dbcoldesc[2].rgPropertySets[0].rgProperties[0].vValue.boolVal =
VARIANT_FALSE;
dbcoldesc[2].rgPropertySets[0].cProperties = 1;
dbcoldesc[3].dbcid.uName.pwszName = L"Quantity";
dbcoldesc[3].rgPropertySets[0].rgProperties[0].dwPropertyID =
DBPROP_COL_NULLABLE;
dbcoldesc[3].rgPropertySets[0].rgProperties[0].vValue.boolVal =
VARIANT_FALSE;
dbcoldesc[3].rgPropertySets[0].cProperties = 1;
dbcoldesc[4].dbcid.uName.pwszName = L"Discount";
dbcoldesc[4].wType = DBTYPE_NUMERIC;
dbcoldesc[4].bPrecision = 2;
dbcoldesc[4].bScale = 2;
dbcoldesc[4].rgPropertySets[0].rgProperties[0].dwPropertyID =
DBPROP_COL_NULLABLE;
dbcoldesc[4].rgPropertySets[0].rgProperties[0].vValue.boolVal =
VARIANT_FALSE;
dbcoldesc[4].rgPropertySets[0].rgProperties[1].dwPropertyID =
DBPROP_COL_DEFAULT;
dbcoldesc[4].rgPropertySets[0].rgProperties[1].vValue.vt = VT_BSTR;
dbcoldesc[4].rgPropertySets[0].rgProperties[1].vValue.bstrVal =
SysAllocString(L"0");
dbcoldesc[4].rgPropertySets[0].cProperties = 2;
// Set up the dbid for OrderDetails.
dbidTable.eKind = DBKIND_NAME;
dbidTable.uName.pwszName = L"OrderDetails";
if (FAILED(hr = pITableDefinition->CreateTable(NULL, &dbidTable,
nCols, dbcoldesc, NULL, 0, NULL, NULL, NULL)))
{
DumpError(pITableDefinition, IID_ITableDefinition);
goto SAFE_EXIT;
}
SAFE_EXIT:
// Clean up dynamic allocation in the property sets.
for (nCol = 0; nCol < nCols; nCol++)
{
for (nProp = 0; nProp < NCOLPROPS_MAX; nProp++)
{
if (dbcoldesc[nCol].rgPropertySets[0].rgProperties[nProp].
vValue.vt == VT_BSTR)
{
SysFreeString(dbcoldesc[nCol].rgPropertySets[0].
rgProperties[nProp].vValue.bstrVal);
}
}
delete [] dbcoldesc[nCol].rgPropertySets[0].rgProperties;
delete [] dbcoldesc[nCol].rgPropertySets;
}
return (hr);
}