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 の値によって指される DBID の 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されている必要があります。 CreateTable は、 eKind が無効な場合、 pwszName が NULL の場合、または pwszName の値が有効な SQL Server 識別子でない場合に、DB_E_BADCOLUMNIDを返します。
すべての列プロパティは、テーブルに対して定義されているすべての列で使用できます。 CreateTable は、プロパティ値が競合して設定されている場合、DB_S_ERRORSOCCURREDまたはDB_E_ERRORSOCCURREDを返すことができます。 列プロパティの設定が無効な場合、SQL Server テーブルの作成エラーが発生すると、CreateTable からエラーが返されます。
DBCOLUMNDESC の列プロパティは、次のように解釈されます。
| プロパティ ID | 説明 |
|---|---|
| DBPROP_COL_AUTOINCREMENT | R/W: 読み取り/書き込み 既定値: VARIANT_FALSE説明: 作成された列の ID プロパティを設定します。 SQL Server の場合、ID プロパティはテーブル内の 1 つの列に対して有効です。 プロパティを複数の列に対してVARIANT_TRUEに設定すると、SQL Server Native Client OLE DB プロバイダーがサーバー上にテーブルを作成しようとするとエラーが発生します。 SQL Server ID プロパティは、小数点以下桁数が 0 の場合、 整数、 数値、および 10 進 型に対してのみ有効です。 プロパティを他のデータ型の列にVARIANT_TRUEに設定すると、SQL Server Native Client OLE DB プロバイダーがサーバー上にテーブルを作成しようとするとエラーが発生します。 SQL Server Native Client OLE DB プロバイダーは、DBPROP_COL_AUTOINCREMENTとDBPROP_COL_NULLABLEの両方がVARIANT_TRUEであり、DBPROP_COL_NULLABLEの dwOption がDBPROPOPTIONS_REQUIREDされていない場合にDB_S_ERRORSOCCURREDを返します。 DB_E_ERRORSOCCURREDは、DBPROP_COL_AUTOINCREMENTとDBPROP_COL_NULLABLEの両方がVARIANT_TRUEされ、DBPROP_COL_NULLABLEの dwOption がDBPROPOPTIONS_REQUIRED等しい場合に返されます。 列は SQL Server ID プロパティで定義され、 DBPROP_COL_NULLABLE dwStatus メンバーは DBPROPSTATUS_CONFLICTING に設定されます。 |
| DBPROP_COL_DEFAULT | R/W: 読み取り/書き込み 既定値: なし 説明: 列の SQL Server DEFAULT 制約を作成します。 vValue DBPROP メンバーには、さまざまな型を指定できます。 vValue.vt メンバーは、列のデータ型と互換性のある型を指定する必要があります。 たとえば、DBTYPE_WSTRとして定義された列の既定値として BSTR N/A を定義することは互換性のある一致です。 DBTYPE_R8として定義されている列で同じ既定値を定義すると、SQL Server Native Client OLE DB プロバイダーがサーバー上にテーブルを作成しようとするとエラーが発生します。 |
| DBPROP_COL_DESCRIPTION | R/W: 読み取り/書き込み 既定値: なし 説明: DBPROP_COL_DESCRIPTION列プロパティは、SQL Server Native Client OLE DB プロバイダーによって実装されていません。 DBPROP 構造体の dwStatus メンバーは、コンシューマーがプロパティ値を書き込もうとしたときにDBPROPSTATUS_NOTSUPPORTEDを返します。 このプロパティを設定しても、SQL Server Native Client OLE DB プロバイダーの致命的なエラーは発生しません。 他のすべてのパラメーター値が有効な場合は、SQL Server テーブルが作成されます。 |
| DBPROP_COL_FIXEDLENGTH | R/W: 読み取り/書き込み 既定値: VARIANT_FALSE 説明: SQL Server Native Client OLE DB プロバイダーは、コンシューマーが DBCOLUMNDESC の wType メンバーを使用して列のデータ型を定義するときに、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 制約を持つ列が作成されます。 列プロパティとして定義されている場合、制約を決定できるのは 1 つの列だけです。 プロパティのVARIANT_TRUEを複数の列に設定すると、SQL Server Native Client OLE DB プロバイダーが SQL Server テーブルを作成しようとするとエラーが返されます。 注: コンシューマーは IIndexDefinition::CreateIndex を使用して、2 つ以上の列に 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を返します。 DB_E_ERRORSOCCURREDは、DBPROP_COL_PRIMARYKEYとDBPROP_COL_UNIQUEの両方がVARIANT_TRUEされ、DBPROP_COL_UNIQUEの dwOption がDBPROPOPTIONS_REQUIRED等しい場合に返されます。 列は SQL Server ID プロパティで定義され、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 プロバイダーからエラーが返されます。 PRIMARY KEY 制約は、SQL Server データ型 のビット、 テキスト、 ntext、 およびイメージを使用して作成された列では定義できません。 |
| DBPROP_COL_UNIQUE | R/W: 読み取り/書き込み 既定値: VARIANT_FALSE説明: SQL Server UNIQUE 制約を列に適用します。 列プロパティとして定義されている場合、制約は 1 つの列にのみ適用されます。 コンシューマーは 、IIndexDefinition::CreateIndex を使用して、2 つ以上の列の結合された値に UNIQUE 制約を適用できます。 SQL Server Native Client OLE DB プロバイダーは、DBPROP_COL_PRIMARYKEYとDBPROP_COL_UNIQUEの両方がVARIANT_TRUEであり、 dwOption がDBPROPOPTIONS_REQUIREDされていない場合にDB_S_ERRORSOCCURREDを返します。 DB_E_ERRORSOCCURREDは、DBPROP_COL_PRIMARYKEYとDBPROP_COL_UNIQUEの両方がVARIANT_TRUEで dwOption がDBPROPOPTIONS_REQUIRED等しい場合に返されます。 列は SQL Server ID プロパティで定義され、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を返します。 DB_E_ERRORSOCCURREDは、DBPROP_COL_NULLABLEとDBPROP_COL_UNIQUEが両方ともVARIANT_TRUEで dwOption がDBPROPOPTIONS_REQUIRED等しい場合に返されます。 列は SQL Server ID プロパティで定義され、 DBPROP_COL_NULLABLE dwStatus メンバーは DBPROPSTATUS_CONFLICTING に設定されます。 コンシューマーが無効な SQL Server データ型の列に UNIQUE 制約を作成しようとすると、SQL Server Native Client OLE DB プロバイダーからエラーが返されます。 SQL Server ビット データ型を使用して作成された列に対して UNIQUE 制約を定義することはできません。 |
コンシューマーが ITableDefinition::CreateTable を呼び出すと、SQL Server Native Client OLE DB プロバイダーはテーブルのプロパティを次のように解釈します。
| プロパティ ID | 説明 |
|---|---|
| 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);
}