Zuordnen von Datentypen (ODBC)

Der SQL Server Native Client-ODBC-Treiber ordnet den ODBC-SQL-Datentypen SQL Server-SQL-Datentypen zu. In den folgenden Abschnitten werden die SQL Server-SQL-Datentypen sowie die ODBC-SQL-Datentypen, denen sie zugeordnet werden, erläutert. Außerdem werden die ODBC-SQL-Datentypen und die zugehörigen ODBC-C-Datentypen sowie die unterstützten und standardmäßigen Konvertierungen erklärt.

HinweisHinweis

Der SQL Servertimestamp-Datentyp wird dem SQL_BINARY- oder SQL_VARBINARY ODBC-Datentyp zugeordnet, da die Werte in timestamp-Spalten keine datetime-Werte, sondern binary(8)- oder varbinary(8)-Werte sind, die die Sequenz der SQL Server-Aktivität in der Zeile angeben. Wenn der SQL Server Native Client-ODBC-Treiber einen SQL_C_WCHAR-Wert (Unicode) erkennt, der eine ungerade Anzahl von Bytes enthält, wird das letzte ungerade Byte abgeschnitten.

Arbeiten mit dem 'sql_variant'-Datentyp in ODBC

Die sql_variant-Datentypspalte kann jeden Datentyp in SQL Server außer LOBs (Large Object) enthalten, z. B. text, ntext und image. Die Spalte kann beispielsweise smallint-Werte in einigen Zeilen, float-Werte in anderen Zeilen und char/nchar-Werte in den übrigen Zeilen enthalten.

Der sql_variant-Datentyp ist dem Variant-Datentyp in Microsoft-Visual-Basic® ähnlich.

Abrufen von Daten vom Server

ODBC verfügt nicht über ein Konzept für Variant-Datentypen. Dadurch wird die Nutzung des sql_variant-Datentyps mit einem ODBC-Treiber in SQL Server eingeschränkt. Wenn in SQL Server das Binden festgelegt ist, muss der sql_variant-Datentyp an einen der dokumentierten ODBC-Datentypen gebunden werden. SQL_CA_SS_VARIANT_TYPE, ein neues für SQL Server Native Client-ODBC-Treiber spezifisches Attribut, gibt den Datentyp einer Instanz in der sql_variant-Spalte an den Benutzer zurück.

Wenn kein Binden festgelegt ist, kann mit der SQLGetData-Funktion der Datentyp einer Instanz in der sql_variant-Spalte bestimmt werden.

Um sql_variant-Daten abzurufen, führen Sie folgende Schritte aus.

  1. Rufen Sie SQLFetch auf, um die Position auf die abgerufene Zeile zu verschieben.

  2. Rufen Sie SQLGetData auf, und legen Sie SQL_C_BINARY für den Typ und 0 für die Datenlänge fest. Dies zwingt den Treiber, den sql_variant-Header zu lesen. Der Header stellt den Datentyp dieser Instanz in der sql_variant -Spalte bereit. SQLGetData gibt die Länge des Werts in Bytes zurück.

  3. Rufen Sie SQLColAttribute auf, indem Sie SQL_CA_SS_VARIANT_TYPE als Attributwert angeben. Mit dieser Funktion wird der C-Datentyp der Instanz in der sql_variant-Spalte an den Client zurückgegeben.

Im folgenden Codesegment werden die vorhergehenden Schritte gezeigt.

while ((retcode = SQLFetch (hstmt))==SQL_SUCCESS)
{
    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
    {
        SQLError (NULL, NULL, hstmt, NULL, 
                    &lNativeError,szError,MAX_DATA,&sReturned);
        printf_s ("%s\n",szError);
        goto Exit;
    }
    retcode = SQLGetData (hstmt, 1, SQL_C_BINARY, 
                                pBuff,0,&Indicator);//Figure out the length
    if (retcode != SQL_SUCCESS_WITH_INFO && retcode != SQL_SUCCESS)
    {
        SQLError (NULL, NULL, hstmt, NULL, &lNativeError, 
                    szError,MAX_DATA,&sReturned);
        printf_s ("%s\n",szError);
        goto Exit;
    }
    printf_s ("Byte length : %d ",Indicator); //Print out the byte length
        
    int iValue = 0;
    retcode = SQLColAttribute (hstmt, 1, SQL_CA_SS_VARIANT_TYPE, NULL, 
                                        NULL,NULL,&iValue);  //Figure out the type
    printf_s ("Sub type = %d ",iValue);//Print the type, the return is C_type of the column]

// Set up a new binding or do the SQLGetData on that column with 
// the appropriate type
}

Wenn der Benutzer die Bindung mit SQLBindCol erstellt, liest der Treiber die Metadaten und die Daten. Der Treiber konvertiert die Daten dann in den entsprechenden in der Bindung angegebenen ODBC-Typ.

Senden von Daten an den Server

SQL_SS_VARIANT, ein neuer für SQL Server Native Client-ODBC-Treiber spezifischer Datentyp, wird für Daten verwendet, die an eine sql_variant-Spalte gesendet werden. Beim Senden von Daten an den Server mit Parametern (z. B. INSERT INTO TableName VALUES (?,?)), werden mit SQLBindParameter die Parameterinformationen, einschließlich des C-Typs und des entsprechenden SQL Server-Typs, angegeben. Der SQL Server Native Client-ODBC-Treiber konvertiert den C-Datentyp in einen entsprechenden sql_variant-Untertyp.