Anmerkung
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die Bezeichner für die numerischen ODBC SQL-Datentypen sind die folgenden:
- SQL_DECIMAL
- SQL_BIGINT
- SQL_NUMERIC
- SQL_REAL
- SQL_TINYINT
- SQL_FLOAT
- SQL_SMALLINT
- SQL_DOUBLE SQL_INTEGER
Die folgende Tabelle zeigt die ODBC C-Datentypen, in die numerische SQL-Daten konvertiert werden können. Eine Erläuterung der Spalten und Begriffe in der Tabelle finden Sie unter Konvertieren von Daten aus SQL in C-Datentypen.
| C-Typbezeichner | Test | * TargetValuePtr | * StrLen_or_IndPtr | SQLSTATE |
|---|---|---|---|---|
| SQL_C_CHAR | Zeichenbytelänge <BufferLength Anzahl der ganzen Ziffern (im Gegensatz zu Bruchstellen<) BufferLength Anzahl ganzer Ziffern (im Gegensatz zu Bruchstellen >) = BufferLength |
Daten Abgeschnittene Daten Nicht definiert |
Länge der Daten in Bytes Länge der Daten in Bytes Nicht definiert |
– 01004 22003 |
| SQL_C_WCHAR | Zeichenlänge <BufferLength Anzahl der ganzen Ziffern (im Gegensatz zu Bruchstellen<) BufferLength Anzahl ganzer Ziffern (im Gegensatz zu Bruchstellen >) = BufferLength |
Daten Abgeschnittene Daten Nicht definiert |
Länge der Daten in Zeichen Länge der Daten in Zeichen Nicht definiert |
– 01004 22003 |
| SQL_C_STINYINT SQL_C_UTINYINT SQL_C_TINYINT SQL_C_SBIGINT SQL_C_UBIGINT SQL_C_SSHORT SQL_C_USHORT SQL_C_SHORT SQL_C_SLONG SQL_C_ULONG SQL_C_LONG SQL_C_NUMERIC |
Konvertierte Daten ohne Abschneiden[a] Konvertierte Daten mit Abschneiden von Teilziffern[a] Die Konvertierung von Daten würde zum Verlust ganzer (im Gegensatz zu bruchbehafteten) Ziffern führen[a] |
Daten Abgeschnittene Daten Nicht definiert |
Größe des C-Datentyps Größe des C-Datentyps Nicht definiert |
– 01S07 22003 |
| SQL_C_FLOAT SQL_C_DOUBLE |
Die Daten liegen innerhalb des Bereichs des Datentyps, in den die Zahl konvertiert wird.[a] Daten liegen außerhalb des Bereichs des Datentyps, in den die Zahl konvertiert wird[a] |
Daten Nicht definiert |
Größe des C-Datentyps Nicht definiert |
– 22003 |
| SQL_C_BIT | Daten sind 0 oder 1[a] Daten sind größer als 0, kleiner als 2 und nicht gleich 1[a] Daten sind kleiner als 0 oder größer als oder gleich 2[a] |
Daten Abgeschnittene Daten Nicht definiert |
1[b] 1[b] Nicht definiert |
– 01S07 22003 |
| SQL_C_BINARY | Bytelänge der Daten <= BufferLength Bytelänge der Daten >BufferLength |
Daten Nicht definiert |
Länge der Daten Nicht definiert |
– 22003 |
| SQL_C_INTERVAL_MONTH[c] SQL_C_INTERVAL_YEAR[c] SQL_C_INTERVAL_DAY[c] SQL_C_INTERVAL_HOUR[c] SQL_C_INTERVAL_MINUTE[c] SQL_C_INTERVAL_SECOND[c] | Nicht abgeschnittene Daten Sekundenbruchteil abgeschnitten Ganzer Teil der Zahl abgeschnitten |
Daten Abgeschnittene Daten Nicht definiert |
Länge der Daten in Bytes Länge der Daten in Bytes Nicht definiert |
– 01S07 22015 |
| SQL_C_INTERVAL_YEAR_TO_MONTH SQL_C_INTERVAL_DAY_TO_HOUR SQL_C_INTERVAL_DAY_TO_MINUTE SQL_C_INTERVAL_DAY_TO_SECOND SQL_C_INTERVAL_HOUR_TO_MINUTE SQL_C_INTERVAL_HOUR_TO_SECOND | Ganzer Teil der Zahl abgeschnitten | Nicht definiert | Nicht definiert | 22015 |
[a] Der Wert von BufferLength wird für diese Konvertierung ignoriert. Der Treiber geht davon aus, dass die Größe von *TargetValuePtr der Größe des C-Datentyps entspricht.
[b] Dies ist die Größe des entsprechenden C-Datentyps.
[c] Diese Konvertierung wird nur für die genauen numerischen Datentypen (SQL_DECIMAL, SQL_NUMERIC, SQL_TINYINT, SQL_SMALLINT, SQL_INTEGER und SQL_BIGINT) unterstützt. Sie wird für die ungefähren numerischen Datentypen (SQL_REAL, SQL_FLOAT oder SQL_DOUBLE) nicht unterstützt.
SQL_C_NUMERIC und SQLSetDescField
Die SQLSetDescField-Funktion ist erforderlich, um eine manuelle Bindung mit SQL_C_NUMERIC Werten durchzuführen. (Beachten Sie, dass SQLSetDescField in ODBC 3.0 hinzugefügt wurde.) Zum Ausführen einer manuellen Bindung müssen Sie zuerst das Deskriptorhandle abrufen.
if (fCType == SQL_C_NUMERIC) {
// special processing required for NUMERIC to get right scale & precision
// Modify the fields in the implicit application parameter descriptor
SQLHDESC hdesc=NULL;
// Use SQL_ATTR_APP_ROW_DESC for calls to SQLBindCol()
// Use SQL_ATTR_APP_PARAM_DESC for calls to SQLBindParameter()
//
// retcode = SQLGetStmtAttr(hstmt, SQL_ATTR_APP_ROW_DESC, &hdesc, 0, NULL);
retcode = SQLGetStmtAttr(hstmt, SQL_ATTR_APP_PARAM_DESC, &hdesc, 0, NULL);
if (!ODBC_CALL_SUCCESS(retcode)) {
printf ("\nSQLGetStmtAttr failed");
i = 1;
sqlstate[7] = '\0';
while (SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, i, sqlstate, &NativeError, wrkbuf, sizeof(wrkbuf), &len) != SQL_NO_DATA) {
printf("\niTestCase = %d Failed...Precision = %d, Scale = %d\nNativeError=%d, State=%s, \n Message=%s",
iTestCase, Precision, Scale, NativeError, sqlstate, wrkbuf);
i++;
}
continue;
}
retcode = SQLSetDescField(hdesc, iCol, SQL_DESC_TYPE, (SQLPOINTER) SQL_C_NUMERIC, 0);
if (!ODBC_CALL_SUCCESS(retcode))
goto error;
retcode = SQLSetDescField(hdesc, iCol, SQL_DESC_PRECISION, (SQLPOINTER)num.precision, 0);
if (!ODBC_CALL_SUCCESS(retcode))
goto error;
retcode = SQLSetDescField(hdesc, iCol, SQL_DESC_SCALE, (SQLPOINTER)num.scale, 0);
if (!ODBC_CALL_SUCCESS(retcode))
goto error;
retcode = SQLSetDescField(hdesc, iCol, SQL_DESC_DATA_PTR, (SQLPOINTER) &(num), sizeof(num));