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