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


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

Поставщик 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 создает временное имя таблицы для потребителя. Потребитель задает для параметра pTableID метода CreateTable значение NULL. Временные таблицы с именами, созданными поставщиком SQL SERVER NATIVE CLIENT OLE DB, не отображаются в наборе строк TABLES, но доступны через интерфейс IOpenRowset.

Когда потребители указывают имя таблицы в элементе pwszName объединения uName в параметре pTableID, поставщик 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 возвращает созданное имя таблицы в элементе pwszName объединения uName DBID, на который указывает значение ppTableID. Чтобы создать временную таблицу с именем поставщика OLE DB SQL Server Native Client, потребитель включает свойство таблицы OLE DB DBPROP_TBL_TEMPTABLE в набор свойств таблицы, на который ссылается параметр rgPropertySets. SQL Server Native Client временные таблицы с именем поставщика OLE DB являются локальными.

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

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

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

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

Поставщик OLE DB SQL Server Native Client распознает подмножество значений DB, перечисляемых 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 интерпретируются следующим образом.

Идентификатор свойства Описание
DBPROP_COL_AUTOINCREMENT Ч/З Чтение/запись

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

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

Поставщик OLE DB SQL Server Native Client возвращает 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 Ч/З Чтение/запись

Значение по умолчанию: None

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

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

Значение по умолчанию: None

Описание. Свойство столбца DBPROP_COL_DESCRIPTION не реализуется поставщиком SQL SERVER NATIVE CLIENT OLE DB.

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

Установка свойства не является неустранимой ошибкой для поставщика SQL SERVER NATIVE CLIENT OLE DB. Если все остальные значения параметров допустимы, таблица SQL Server будет создана.
DBPROP_COL_FIXEDLENGTH Ч/З Чтение/запись

Значение по умолчанию: VARIANT_FALSE

Описание. Поставщик SQL SERVER NATIVE CLIENT OLE DB использует DBPROP_COL_FIXEDLENGTH для определения сопоставления типов данных, когда потребитель определяет тип данных столбца с помощью члена wType DBCOLUMNDESC. Дополнительные сведения см. в разделе Сопоставление типов данных в интерфейсе ITableDefinition.
DBPROP_COL_NULLABLE Ч/З Чтение/запись

Значение по умолчанию: None

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

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

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

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

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

Поставщик OLE DB SQL Server Native Client возвращает 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 Native Client возвращает ошибку, если DBPROP_COL_PRIMARYKEY и DBPROP_COL_NULLABLE VARIANT_TRUE.

Поставщик OLE DB SQL Server Native Client возвращает ошибку из 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 Native Client возвращает 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 Native Client возвращает 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 Native Client возвращает ошибку из SQL Server, когда потребитель пытается создать ограничение UNIQUE для столбца с недопустимым типом данных SQL Server. Ограничения UNIQUE нельзя определять для столбцов, относящихся к типу данных SQL Server bit.

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

Идентификатор свойства Описание
DBPROP_TBL_TEMPTABLE Ч/З Чтение/запись

По умолчанию: VARIANT_FALSE Описание. По умолчанию поставщик OLE DB SQL Server Native Client создает таблицы с именами потребителя. При VARIANT_TRUE поставщик SQL SERVER NATIVE CLIENT OLE DB создает временное имя таблицы для потребителя. Потребитель задает для параметра pTableID метода CreateTable значение 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);  
    }  

См. также:

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