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