Freigeben über


Erstellen von SQL Server-Tabellen

Der SQL Server Native Client OLE DB-Anbieter macht die ITableDefinition::CreateTable-Funktion verfügbar, sodass Consumer SQL Server Tabellen erstellen können. Consumer verwenden CreateTable, um permanente Tabellen mit Consumernamen und permanente oder temporäre Tabellen mit eindeutigen Namen zu erstellen, die vom SQL Server Native Client OLE DB-Anbieter generiert wurden.

Wenn der Consumer ITableDefinition::CreateTable aufruft, generiert der SQL Server Native Client OLE DB-Anbieter einen temporären Tabellennamen für den Consumer, wenn der Wert der DBPROP_TBL_TEMPTABLE-Eigenschaft VARIANT_TRUE ist. Der Consumer legt den pTableID-Parameter der CreateTable-Methode auf NULL fest. Die temporären Tabellen mit Namen, die vom SQL Server Native Client OLE DB-Anbieter generiert wurden, werden nicht im TABLES-Rowset angezeigt, sondern sind über die IOpenRowset-Schnittstelle zugänglich.

Wenn Consumer den Tabellennamen im pwszName-Member der uName-Union im pTableID-Parameter angeben, erstellt der SQL Server Native Client OLE DB-Anbieter eine SQL Server Tabelle mit diesem Namen. Es gelten die SQL Server-Einschränkungen für Tabellennamen, und der Tabellenname kann eine dauerhafte Tabelle angeben oder entweder eine lokale oder globale temporäre Tabelle. Weitere Informationen finden Sie unter CREATE TABLE. Der ppTableID-Parameter kann NULL sein.

Der SQL Server Native Client OLE DB-Anbieters kann die Namen dauerhafter oder temporärer Tabellen generieren. Wenn der Consumer den pTableID-Parameter auf NULL festlegt und ppTableID auf einen gültigen DBID* verweist, gibt der SQL Server Native Client OLE DB-Anbieter den generierten Namen der Tabelle im pwszName-Member der uName-Union der DBID zurück, auf die der Wert von ppTableID verweist. Um eine temporäre, SQL Server Native Client OLE DB-Anbieter benannte Tabelle zu erstellen, schließt der Consumer die OLE DB-Tabelleneigenschaft DBPROP_TBL_TEMPTABLE in einen Tabelleneigenschaftensatz ein, auf den im rgPropertySets-Parameter verwiesen wird. SQL Server Native Client temporären Tabellen des OLE DB-Anbieters sind lokal.

CreateTable gibt DB_E_BADTABLEID zurück, wenn das eKind-Element des pTableID-Parameters nicht DBKIND_NAME angibt.

DBCOLUMNDESC-Verwendung

Der Consumer kann einen Spaltendatentyp durch Verwendung des pwszTypeName-Elements oder des wType-Elements angeben. Wenn der Consumer den Datentyp in pwszTypeName angibt, ignoriert der SQL Server Native Client OLE DB-Anbieter den Wert von wType.

Bei Verwendung des pwszTypeName-Elements gibt der Consumer den Datentyp mit SQL Server-Datentypnamen an. Gültige Datentypnamen sind die, die in der Spalte TYPE_NAME des PROVIDER_TYPES-Schemarowsets zurückgegeben werden.

Der SQL Server Native Client OLE DB-Anbieter erkennt eine Teilmenge von OLE DB-aufgezählten DBTYPE-Werten im wType-Member. Weitere Informationen finden Sie unter Datentypzuordnung in ITableDefinition.

Hinweis

CreateTable gibt DB_E_BADTYPE zurück, wenn der Consumer das pTypeInfo- oder pclsid-Element zur Angabe des Spaltendatentyps verwendet.

Der Consumer gibt dne Spaltennamen im pwszName-Element der uName-Union des DBCOLUMNDESC dbcid-Elements an. Der Spaltenname wird als Unicode-Zeichenfolge angegeben. Das eKind-Element von dbcid muss DBKIND_NAME sein. CreateTable gibt DB_E_BADCOLUMNID zurück, wenn eKind ungültig ist,pwszName NULL ist oder der Wert von pwszName kein gültiger SQL Server-Bezeichner ist.

Alle Spalteneigenschaften sind in allen für die Tabelle definierten Spalten verfügbar. CreateTable kann DB_S_ERRORSOCCURRED oder DB_E_ERRORSOCCURRED zurückgeben, wenn Eigenschaftenwerte zu Konflikten führen. CreateTable gibt einen Fehler zurück, wenn ungültige Spalteneigenschaften Fehler bei der SQL Server-Tabellenerstellung verursachen.

Spalteneigenschaften in DBCOLUMNDESC werden wie folgt interpretiert.

Eigenschafts-ID BESCHREIBUNG
DBPROP_COL_AUTOINCREMENT R/W: Lesen/Schreiben

Standardwert: VARIANT_FALSE, Beschreibung: Legt die Identitätseigenschaft für die erstellte Spalte fest. Für SQL Server ist die IDENTITY-Eigenschaft für eine einzelne Spalte innerhalb einer Tabelle gültig. Wenn Sie die Eigenschaft auf VARIANT_TRUE für mehr als eine einzelne Spalte festlegen, wird ein Fehler generiert, wenn der SQL Server Native Client OLE DB-Anbieter versucht, die Tabelle auf dem Server zu erstellen.

Die SQL Server-Identitätseigenschaft ist nur für integer-, numeric- und decimal-Typen gültig wenn der Dezimalstellenwert 0 (null) ist. Wenn Sie die Eigenschaft auf VARIANT_TRUE für eine Spalte eines beliebigen anderen Datentyps festlegen, wird ein Fehler generiert, wenn der SQL Server Native Client OLE DB-Anbieter versucht, die Tabelle auf dem Server zu erstellen.

Der SQL Server Native Client OLE DB-Anbieter gibt DB_S_ERRORSOCCURRED zurück, wenn DBPROP_COL_AUTOINCREMENT und DBPROP_COL_NULLABLE VARIANT_TRUE sind und die dwOption von DBPROP_COL_NULLABLE nicht DBPROPOPTIONS_REQUIRED ist. DB_E_ERRORSOCCURRED wird zurückgegeben, wenn sowohl DBPROP_COL_AUTOINCREMENT als auch DBPROP_COL_NULLABLE den Wert VARIANT_TRUE haben und dwOption von DBPROP_COL_NULLABLE gleich DBPROPOPTIONS_REQUIRED ist. Die Spalte wird mit der SQL Server-Identitätseigenschaft definiert, und das DBPROP_COL_NULLABLE dwStatus-Element wird auf DBPROPSTATUS_CONFLICTING festgelegt.
DBPROP_COL_DEFAULT R/W: Lesen/Schreiben

Standardwert: Keine

Beschreibung: Erstellt eine SQL Server DEFAULT-Einschränkung für die Spalte.

Das vValue DBPROP-Element kann verschiedenen Typen entsprechen. Das vValue.vt-Element sollte einen Typ angeben, der mit dem Datentyp der Spalte kompatibel ist. Beispielsweise ist BSTR N/A als Standardwert für eine Spalte geeignet, die als DBTYPE_WSTR definiert ist. Wenn Sie dieselbe Standardeinstellung für eine Spalte definieren, die als DBTYPE_R8 definiert ist, wird ein Fehler generiert, wenn der SQL Server Native Client OLE DB-Anbieter versucht, die Tabelle auf dem Server zu erstellen.
DBPROP_COL_DESCRIPTION R/W: Lesen/Schreiben

Standardwert: Keine

Beschreibung: Die DBPROP_COL_DESCRIPTION Column-Eigenschaft wird vom SQL Server Native Client OLE DB-Anbieter nicht implementiert.

Das dwStatus-Element der DBPROP-Struktur gibt DBPROPSTATUS_NOTSUPPORTED zurück, wenn der Consumer versucht, den Eigenschaftenwert zu schreiben.

Das Festlegen der Eigenschaft stellt keinen schwerwiegenden Fehler für den SQL Server Native Client OLE DB-Anbieter dar. Wenn alle anderen Parameterwerte gültig sind, wird die SQL Server-Tabelle erstellt.
DBPROP_COL_FIXEDLENGTH R/W: Lesen/Schreiben

Standardwert: VARIANT_FALSE

Beschreibung: Der SQL Server Native Client OLE DB-Anbieter verwendet DBPROP_COL_FIXEDLENGTH, um die Datentypzuordnung zu bestimmen, wenn der Consumer den Datentyp einer Spalte mithilfe des wType-Members von DBCOLUMNDESC definiert. Weitere Informationen finden Sie unter Datentypzuordnung in ITableDefinition.
DBPROP_COL_NULLABLE R/W: Lesen/Schreiben

Standardwert: Keine

Beschreibung: Beim Erstellen der Tabelle gibt der SQL Server Native Client OLE DB-Anbieter an, ob die Spalte NULL-Werte akzeptieren soll, wenn die Eigenschaft festgelegt ist. Ist die Eigenschaft nicht festgelegt, wird durch die SQL Server ANSI_NULLS-Standarddatenbankoption festgelegt, ob die Spalte NULL-Werte akzeptiert.

Der SQL Server Native Client OLE DB-Anbieter ist ein ISO-konformer Anbieter. Verbundene Sitzungen weisen ISO-Verhalten auf. Wenn der Consumer DBPROP_COL_NULLABLE nicht festlegt, akzeptieren die Spalten NULL-Werte.
DBPROP_COL_PRIMARYKEY R/W: Lesen/Schreiben

Standard: VARIANT_FALSE Beschreibung: Beim VARIANT_TRUE erstellt der SQL Server Native Client OLE DB-Anbieter die Spalte mit einer PRIMARY KEY-Einschränkung.

Wenn sie als Spalteneigenschaft definiert ist, kann nur eine einzelne Spalte die Einschränkung bestimmen. Das Festlegen der Eigenschaft VARIANT_TRUE für mehr als eine einzelne Spalte gibt einen Fehler zurück, wenn der SQL Server Native Client OLE DB-Anbieter versucht, die SQL Server Tabelle zu erstellen.

Hinweis: Der Consumer kann IIndexDefinition::CreateIndex verwenden, um eine PRIMARY KEY-Einschränkung für zwei oder mehr Spalten zu erstellen.

Der SQL Server Native Client OLE DB-Anbieter gibt DB_S_ERRORSOCCURRED zurück, wenn DBPROP_COL_PRIMARYKEY und DBPROP_COL_UNIQUE beide VARIANT_TRUE sind und die dwOption von DBPROP_COL_UNIQUE nicht DBPROPOPTIONS_REQUIRED ist.

DB_E_ERRORSOCCURRED wird zurückgegeben, wenn sowohl DBPROP_COL_PRIMARYKEY als auch DBPROP_COL_UNIQUE den Wert VARIANT_TRUE haben und dwOption von DBPROP_COL_UNIQUE gleich DBPROPOPTIONS_REQUIRED ist. Die Spalte wird mit der SQL Server-Identitätseigenschaft definiert, und das DBPROP_COL_PRIMARYKEY dwStatus-Element wird auf DBPROPSTATUS_CONFLICTING festgelegt.

Der SQL Server Native Client OLE DB-Anbieter gibt einen Fehler zurück, wenn DBPROP_COL_PRIMARYKEY und DBPROP_COL_NULLABLE VARIANT_TRUE sind.

Der SQL Server Native Client OLE DB-Anbieter gibt einen Fehler von SQL Server zurück, wenn der Consumer versucht, eine PRIMARY KEY-Einschränkung für eine Spalte mit einem ungültigen SQL Server Datentyp zu erstellen. PRIMARY KEY-Einschränkungen können nicht für Spalten definiert werden, die mit den SQL Server-Datentypen bit, text, ntext und image erstellt wurden.
DBPROP_COL_UNIQUE R/W: Lesen/Schreiben

Standardwert: VARIANT_FALSE, Beschreibung: Wendet eine SQL Server UNIQUE-Einschränkung auf die Spalte an.

Wenn sie als Spalteneigenschaft definiert ist, wird die Einschränkung nur auf eine einzelne Spalte angewendet. Der Consumer kann IIndexDefinition::CreateIndex verwenden, um eine UNIQUE-Einschränkung auf kombinierte Werte von zwei oder mehr Spalten anzuwenden.

Der SQL Server Native Client OLE DB-Anbieter gibt DB_S_ERRORSOCCURRED zurück, wenn DBPROP_COL_PRIMARYKEY und DBPROP_COL_UNIQUE sowohl VARIANT_TRUE als auch dwOption nicht DBPROPOPTIONS_REQUIRED sind.

DB_E_ERRORSOCCURRED wird zurückgegeben, wenn sowohl DBPROP_COL_PRIMARYKEY als auch DBPROP_COL_UNIQUE den Wert VARIANT_TRUE haben und dwOption gleich DBPROPOPTIONS_REQUIRED ist. Die Spalte wird mit der SQL Server-Identitätseigenschaft definiert, und das DBPROP_COL_PRIMARYKEY dwStatus-Element wird auf DBPROPSTATUS_CONFLICTING festgelegt.

Der SQL Server Native Client OLE DB-Anbieter gibt DB_S_ERRORSOCCURRED zurück, wenn DBPROP_COL_NULLABLE und DBPROP_COL_UNIQUE sowohl VARIANT_TRUE als auch dwOption nicht DBPROPOPTIONS_REQUIRED sind.

DB_E_ERRORSOCCURRED wird zurückgegeben, wenn sowohl DBPROP_COL_NULLABLE als auch DBPROP_COL_UNIQUE den Wert VARIANT_TRUE haben und dwOption gleich DBPROPOPTIONS_REQUIRED ist. Die Spalte wird mit der SQL Server-Identitätseigenschaft definiert, und das DBPROP_COL_NULLABLE dwStatus-Element wird auf DBPROPSTATUS_CONFLICTING festgelegt.

Der SQL Server Native Client OLE DB-Anbieter gibt einen Fehler von SQL Server zurück, wenn der Consumer versucht, eine UNIQUE-Einschränkung für eine Spalte mit einem ungültigen SQL Server Datentyp zu erstellen. UNIQUE-Einschränkungen können nicht für Spalten definiert werden, die mit dem SQL Server bit-Datentyp erstellt wurden.

Wenn der Consumer ITableDefinition::CreateTable aufruft, interpretiert der SQL Server Native Client OLE DB-Anbieter die Tabelleneigenschaften wie folgt.

Eigenschafts-ID BESCHREIBUNG
DBPROP_TBL_TEMPTABLE R/W: Lesen/Schreiben

Standard: VARIANT_FALSE Beschreibung: Standardmäßig erstellt der SQL Server Native Client OLE DB-Anbieter Tabellen, die vom Consumer benannt werden. Wenn VARIANT_TRUE, generiert der SQL Server Native Client OLE DB-Anbieter einen temporären Tabellennamen für den Consumer. Der Consumer legt den pTableID-Parameter von CreateTable auf NULL fest. Der ppTableID-Parameter muss einen gültigen Zeiger enthalten.

Wenn der Consumer anfordert, dass ein Rowset für eine erfolgreich erstellte Tabelle geöffnet wird, öffnet der SQL Server Native Client OLE DB-Anbieter ein cursorgestütztes Rowset. Alle Rowseteigenschaften können in den übergebenen Eigenschaftensätzen angegeben werden.

Mit diesem Beispiel wird eine SQL Server-Tabelle erstellt.

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

Weitere Informationen

Tabellen und Indizes