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.
Hinweis |
---|
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.
Rufen Sie SQLFetch auf, um die Position auf die abgerufene Zeile zu verschieben.
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.
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.