SQL から C へ: 数値

数値 ODBC SQL データ型の識別子は次のとおりです。

  • SQL_DECIMAL
  • SQL_BIGINT
  • SQL_NUMERIC
  • SQL_REAL
  • SQL_TINYINT
  • SQL_FLOAT
  • SQL_SMALLINT
  • SQL_DOUBLE SQL_INTEGER

次の表は、数値 SQL データの変換先となる ODBC C データ型を示しています。 テーブル内の列と用語の詳細については、「 SQL から C データ型へのデータの変換」を参照してください。

C 型識別子 テスト *TargetValuePtr *StrLen_or_IndPtr SQLSTATE
SQL_C_CHAR 文字バイト長 <BufferLength

整数 (小数部ではなく) の桁数 <BufferLength

整数 (小数部ではなく) 数字 >の数 = BufferLength
Data

切り捨てられたデータ

未定義。
データの長さ (バイト単位)

データの長さ (バイト単位)

未定義。
該当なし

01004

22003
SQL_C_WCHAR 文字の長さ <BufferLength

整数 (小数部ではなく) の桁数 <BufferLength

整数 (小数部ではなく) 数字 >の数 = BufferLength
Data

切り捨てられたデータ

未定義。
文字単位のデータの長さ

文字単位のデータの長さ

未定義。
該当なし

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
切り捨てなしで変換されたデータ [a]

小数部の桁を切り捨てて変換されたデータ[a]

データを変換すると、(小数ではなく) 全体の数字が失われます[a]
Data

切り捨てられたデータ

未定義。
C データ型のサイズ

C データ型のサイズ

未定義。
該当なし

01S07

22003
SQL_C_FLOAT

SQL_C_DOUBLE
データは、数値の変換先となるデータ型の範囲内です[a]

データが、数値の変換先となるデータ型の範囲外である[a]
Data

未定義。
C データ型のサイズ

未定義。
該当なし

22003
SQL_C_BIT データが 0 または 1 である [a]

データが 0 より大きく、2 未満で、1[a] と等しくない

データが 0 より小さいか、2 以上である [a]
Data

切り捨てられたデータ

未定義。
1[b]

1[b]

未定義。
該当なし

01S07

22003
SQL_C_BINARY データ <のバイト長 = BufferLength

データ >BufferLength のバイト長
Data

未定義。
データの長さ

未定義。
該当なし

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] データが切り捨てられない

秒の小数部の切り捨て

切り捨てられた数値の全体
Data

切り捨てられたデータ

未定義。
データの長さ (バイト単位)

データの長さ (バイト単位)

未定義。
該当なし

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 切り捨てられた数値の全体 未定義。 未定義。 22015

[a] この変換では BufferLength の値は無視されます。 ドライバーは、*TargetValuePtr のサイズが C データ型のサイズであると想定しています。

[b] これは、対応する C データ型のサイズです。

[c] この変換は、正確な数値データ型 (SQL_DECIMAL、SQL_NUMERIC、SQL_TINYINT、SQL_SMALLINT、SQL_INTEGER、SQL_BIGINT) でのみサポートされます。 近似数値データ型 (SQL_REAL、SQL_FLOAT、またはSQL_DOUBLE) ではサポートされていません。

SQL_C_NUMERIC と SQLSetDescField

SQL_C_NUMERIC値を使用して手動バインドを実行するには、 SQLSetDescField 関数 が必要です。 (SQLSetDescField は ODBC 3.0 で追加されていることに注意してください)。手動バインドを実行するには、まず記述子ハンドルを取得する必要があります。

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