SQL zu C: numerisch
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));