Создание таблиц 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войство

Описание

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 Server bit, 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 Server bit.

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

Cвойство

Описание

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);
    }

См. также

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

Таблицы и индексы