Поделиться через


Создание таблиц SQL Server

В поставщике OLE DB собственного клиента SQL Server доступна функция ITableDefinition::CreateTable , которая позволяет потребителям создавать таблицы SQL Server. Потребители используют функцию CreateTable для создания именованных потребителем постоянных таблиц, а также постоянных и временных таблиц с уникальными именами, созданными поставщиком OLE DB собственного клиента SQL Server.

Когда потребитель вызывает метод ITableDefinition::CreateTable, если свойство DBPROP_TBL_TEMPTABLE имеет значение VARIANT_TRUE, поставщик OLE DB собственного клиента SQL Server создает за потребителя временное имя таблицы. Потребитель задает для параметра pTableID метода CreateTable значение NULL. Временные таблицы с именами, сформированными поставщиком OLE DB собственного клиента SQL Server, не содержатся в наборе строк TABLES, но к ним можно получить доступ через интерфейс IOpenRowset.

Когда потребители задают имя таблицы в переменной-члене pwszName объединения uName в параметре pTableID, поставщик OLE DB собственного клиента SQL Server создает таблицу SQL Server с таким именем. Имя таблицы подчиняется ограничениям для имен таблиц, принятым в SQL Server, и может указывать на постоянную таблицу, а также локальную или глобальную временную таблицу. Дополнительные сведения см. в разделе CREATE TABLE. Параметр ppTableID может быть равен NULL.

Поставщик OLE DB для собственного клиента SQL Server может формировать имена постоянных и временных таблиц. Когда потребитель задает для параметра pTableID значение NULL, а для параметра ppTableID значение, указывающее на действующий DBID*, поставщик OLE DB для собственного клиента SQL Server возвращает сформированное имя таблицы в переменной-члене pwszName объединения uName структуры DBID, на которую указывает значение ppTableID. Для создания временной таблицы, имя для которой сформирует поставщик OLE DB для собственного клиента SQL Server, потребитель включает свойство таблицы OLE DB DBPROP_TBL_TEMPTABLE в набор свойств таблицы, на который указывает параметр rgPropertySets. Временные таблицы, имена которых сформированы поставщиком OLE DB собственного клиента SQL Server, являются локальными.

Функция CreateTable возвращает значение DB_E_BADTABLEID, если член eKind параметра pTableID не указывает на DBKIND_NAME.

Использование структуры DBCOLUMNDESC

Потребитель может задать тип данных столбца либо с помощью переменной-члена pwszTypeName, либо с помощью переменной-члена wType. Если потребитель задал тип данных с помощью переменной-члена pwszTypeName, поставщик OLE DB для собственного клиента SQL Server игнорирует значение wType.

Если используется переменная-член pwszTypeName, потребитель задает тип данных, используя имена типов данных SQL Server. Допустимыми именами типов данных являются те, которые возвращены в столбце TYPE_NAME набора строк схемы PROVIDER_TYPES.

Поставщик OLE DB для собственного клиента SQL Server распознает подмножество значений DBTYPE из перечисления OLE DB, задаваемый переменной-членом wType. Дополнительные сведения см. в разделе Сопоставление типов данных в интерфейсе ITableDefinition.

ПримечаниеПримечание

Функция CreateTable возвращает значение DB_E_BADTYPE, если потребитель указал тип данных столбца с помощью членов pTypeInfo или pclsid.

Пользователь задает имя столбца в элементе pwszName объединения uName в переменной-члене dbcid структуры DBCOLUMNDESC. Имя столбца задается в виде символьной строки в формате Юникод. Элемент eKind структуры dbcid должен быть равен DBKIND_NAME. Функция CreateTable возвращает значение DB_E_BADCOLUMNID, если элемент eKind недопустим, или если значение pwszName равно NULL или не является допустимым идентификатором SQL Server.

Все свойства столбцов доступны для всех столбцов, определенных в данной таблице. Функция CreateTable возвращает значение DB_S_ERRORSOCCURRED или DB_E_ERRORSOCCURRED, если установленные значения свойств противоречат друг другу. Функция CreateTable возвращает ошибку, если недопустимые значения свойств столбцов вызывают ошибку при создании таблицы в SQL Server.

Свойства столбцов в структуре DBCOLUMNDESC интерпретируются следующим образом:

Cвойство

Description

DBPROP_COL_AUTOINCREMENT

Чтение-запись: Чтение и запись

По умолчанию: Описание VARIANT_FALSE: Задает свойство идентификатора для создаваемого столбца. В SQL Server свойство идентификатора может иметь только один столбец таблицы. Если установить значение VARIANT_TRUE этого свойства для нескольких столбцов, возникнет ошибка при попытке поставщика OLE DB для собственного клиента SQL Server создать таблицу на сервере.

Свойство идентификатора SQL Server допустимо только для типов integer, numeric и decimal с масштабом 0. Если установить значение VARIANT_TRUE этого свойства для столбца любого другого типа, возникнет ошибка при попытке поставщика OLE DB для собственного клиента SQL Server создать таблицу на сервере.

Поставщик OLE DB для собственного клиента SQL Server возвращает значение DB_S_ERRORSOCCURRED, если оба свойства DBPROP_COL_AUTOINCREMENT и DBPROP_COL_NULLABLE имеют значение VARIANT_TRUE, а элемент dwOption свойства DBPROP_COL_NULLABLE не равен DBPROPOPTIONS_REQUIRED. Если оба свойства DBPROP_COL_AUTOINCREMENT и DBPROP_COL_NULLABLE имеют значение VARIANT_TRUE и элемент dwOption свойства DBPROP_COL_NULLABLE равен DBPROPOPTIONS_REQUIRED, будет возвращено значение DB_E_ERRORSOCCURRED. Столбец определяется при помощи свойства идентификатора SQL Server, а элементу DBPROP_COL_NULLABLE dwStatus устанавливается значение DBPROPSTATUS_CONFLICTING.

DBPROP_COL_DEFAULT

Чтение-запись: Чтение и запись

По умолчанию: Отсутствует

Описание: Создает на столбце ограничение SQL Server DEFAULT.

Элемент vValue структуры DBPROP может относиться к любому типу из определенного набора типов. Элемент vValue.vt должен задавать тип, совместимый с типом данных столбца. Например, если столбец имеет тип DBTYPE_WSTR и для этого столбца задано значение по умолчанию BSTR N/A, эти два типа совместимы. Если установить такое же значение по умолчанию для столбца с типом DBTYPE_R8, возникнет ошибка при попытке поставщика OLE DB для собственного клиента SQL Server создать таблицу на сервере.

DBPROP_COL_DESCRIPTION

Чтение-запись: Чтение и запись

По умолчанию: Отсутствует

Описание: Поставщик OLE DB для собственного клиента SQL Server не реализует свойство столбца DBPROP_COL_DESCRIPTION.

Элемент dwStatus структуры DBPROP возвращает значение DBPROPSTATUS_NOTSUPPORTED при попытке потребителя записать значение свойства.

Изменение этого свойства не является неустранимой ошибкой для поставщика OLE DB для собственного клиента SQL Server. Если все остальные значения параметров допустимы, таблица SQL Server будет создана.

DBPROP_COL_FIXEDLENGTH

Чтение-запись: Чтение и запись

По умолчанию: VARIANT_FALSE

Описание: Поставщик OLE DB для собственного клиента SQL Server использует значение DBPROP_COL_FIXEDLENGTH для определения сопоставления типов данных, используя элемент wType структуры DBCOLUMNDESC. Дополнительные сведения см. в разделе Сопоставление типов данных в интерфейсе ITableDefinition.

DBPROP_COL_NULLABLE

Чтение-запись: Чтение и запись

По умолчанию: Отсутствует

Описание: При создании таблицы поставщик OLE DB для собственного клиента SQL Server указывает, разрешаются ли для данного столбца значения типа NULL, если задано это свойство. Когда свойство не задано, способность столбца принимать значения NULL определяется установленным по умолчанию свойством базы данных SQL Server ANSI_NULLS.

Поставщик OLE DB для собственного клиента SQL Server соответствует требованиям стандарта ISO. Подключенные сеансы ведут себя в соответствии со стандартом ISO. Если потребитель не задал свойство DBPROP_COL_NULLABLE, столбец принимает значения NULL.

DBPROP_COL_PRIMARYKEY

Чтение-запись: Чтение и запись

По умолчанию: Описание VARIANT_FALSE: Если для этого столбца установлено значение VARIANT_TRUE, поставщик OLE DB для собственного клиента SQL Server создает столбец с ограничением PRIMARY KEY.

При задании в качестве свойства столбца только один столбец может определять это ограничение. Если установить значение этого свойства в VARIANT_TRUE для нескольких столбцов, возникнет ошибка при попытке поставщика OLE DB для собственного клиента SQL Server создать таблицу SQL Server.

Примечание: Потребитель может использовать метод IIndexDefinition::CreateIndex для создания ограничения PRIMARY KEY на нескольких столбцах.

Поставщик OLE DB для собственного клиента SQL Server возвращает значение DB_S_ERRORSOCCURRED, если оба свойства DBPROP_COL_PRIMARYKEY и DBPROP_COL_UNIQUE имеют значение VARIANT_TRUE, а элемент dwOption свойства DBPROP_COL_UNIQUE не равен DBPROPOPTIONS_REQUIRED.

Если оба свойства DBPROP_COL_PRIMARYKEY и DBPROP_COL_UNIQUE имеют значение VARIANT_TRUE и элемент dwOption свойства DBPROP_COL_UNIQUE равен DBPROPOPTIONS_REQUIRED, будет возвращено значение DB_E_ERRORSOCCURRED. Столбец определяется при помощи свойства идентификатора SQL Server, а элементу DBPROP_COL_PRIMARYKEY dwStatus устанавливается значение DBPROPSTATUS_CONFLICTING.

Поставщик OLE DB для собственного клиента SQL Server возвращает ошибку, когда DBPROP_COL_PRIMARYKEY и DBPROP_COL_NULLABLE одновременно равны VARIANT_TRUE.

Поставщик OLE DB для собственного клиента SQL Server возвращает ошибку из SQL Server, если потребитель пытается создать ограничение PRIMARY KEY на столбце недопустимого типа данных SQL Server. Ограничения PRIMARY KEY нельзя определять для столбцов, принадлежащих к типам данных SQL Serverbit, text, ntext и image.

DBPROP_COL_UNIQUE

Чтение-запись: Чтение и запись

По умолчанию: Описание VARIANT_FALSE: Применяет к столбцу ограничение SQL Server UNIQUE.

При задании в качестве свойства столбца только к одному столбцу может быть применено это ограничение. Потребитель может использовать метод IIndexDefinition::CreateIndex для создания ограничения UNIQUE на сочетании значений нескольких столбцов.

Поставщик OLE DB для собственного клиента SQL Server возвращает значение DB_S_ERRORSOCCURRED, если оба свойства DBPROP_COL_PRIMARYKEY и DBPROP_COL_UNIQUE имеют значение VARIANT_TRUE, а элемент dwOption не равен DBPROPOPTIONS_REQUIRED.

Если оба свойства DBPROP_COL_PRIMARYKEY и DBPROP_COL_UNIQUE имеют значение VARIANT_TRUE и элемент dwOption равен DBPROPOPTIONS_REQUIRED, будет возвращено значение DB_E_ERRORSOCCURRED. Столбец определяется при помощи свойства идентификатора SQL Server, а элементу DBPROP_COL_PRIMARYKEY dwStatus устанавливается значение DBPROPSTATUS_CONFLICTING.

Поставщик OLE DB для собственного клиента SQL Server возвращает значение DB_S_ERRORSOCCURRED, если оба свойства DBPROP_COL_NULLABLE и DBPROP_COL_UNIQUE имеют значение VARIANT_TRUE, а элемент dwOption не равен DBPROPOPTIONS_REQUIRED.

Если оба свойства DBPROP_COL_NULLABLE и DBPROP_COL_UNIQUE имеют значение VARIANT_TRUE и элемент dwOption равен DBPROPOPTIONS_REQUIRED, будет возвращено значение DB_E_ERRORSOCCURRED. Столбец определяется при помощи свойства идентификатора SQL Server, а элементу DBPROP_COL_NULLABLE dwStatus устанавливается значение DBPROPSTATUS_CONFLICTING.

Поставщик OLE DB для собственного клиента SQL Server возвращает ошибку из SQL Server, если потребитель пытается создать ограничение UNIQUE на столбце недопустимого типа данных SQL Server. Ограничения UNIQUE нельзя определять для столбцов, принадлежащих к типу данных SQL Serverbit.

Когда потребитель вызывает метод ITableDefinition::CreateTable, поставщик OLE DB для собственного клиента SQL Server интерпретирует свойства таблицы следующим образом.

Cвойство

Description

DBPROP_TBL_TEMPTABLE

Чтение-запись: Чтение и запись

По умолчанию: Описание VARIANT_FALSE: По определению поставщик OLE DB собственного клиента SQL Server создает таблицы, имена которых присваивает потребитель. Если для этого столбца установлено значение VARIANT_TRUE, поставщик OLE DB для собственного клиента SQL Server создает для потребителя временную таблицу. Потребитель задает для параметра pTableID метода CreateTable значение NULL. Параметр ppTableID должен содержать действующий указатель.

Если потребитель запрашивает открытие набора рядов на успешно созданной таблице, поставщик OLE DB для собственного клиента SQL Server открывает набор рядов с поддержкой курсора. Все свойства набора рядов могут быть заданы в передаваемых наборах свойств.

В данном примере создается таблица 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);    }

См. также

Основные понятия