在 ODBC 应用程序中使用十进制浮点数据的示例
DECFLOAT(16)和DECFLOAT(34) SQL数据类型分别映射到 SQLDECIMAL64 和 SQLDECIMAL128 C类型。 在将数据分配给 DECFLOAT 列之前,必须将十进制浮点值的字符数据转换为十进制浮点类型。 您可以将DECFLOAT列中检索到的数据转换为其他数据类型,以便在应用程序中进行操作。
以下代码演示了如何将十进制浮点数据分配给DECFLOAT列。 例子:
- 将表示十进制浮点值的字符串常量分配给字符变量。
- 将字符变量转换为 SQLDECIMAL64 和 SQLDECIMAL128 格式,并将结果分配给 SQLDECIMAL64 和 SQLDECIMAL128 变量。
- 将 SQLDECIMAL64 变量绑定到DECFLOAT(16)参数标记,将 SQLDECIMAL128 变量绑定到DECFLOAT(34)参数标记。
/* Declare variables for decimal floating point data */
SQLDECIMAL64 H1DFP16;
SQLDECIMAL128 H1DFP34;
SQLINTEGER LEN_H1DFP16;
SQLINTEGER LEN_H1DFP34;
SQLCHAR H1CHAR[100];
decContext_t l_decCtxt64;
decContext_t l_decCtxt128;
/* Initialize a decContext structure to default values */
decContextDefault(&l_decCtxt64, DEC_INIT_DECIMAL64);
decContextDefault(&l_decCtxt128, DEC_INIT_DECIMAL128);
/* Convert a character string to decimal64 format for insert */
strcpy( (char *)H1CHAR, "6400E-2" );
decimal64FromString((decimal64_t *)&H1DFP16,
(char *)H1CHAR,
&l_decCtxt64);
LEN_H1DFP16 = sizeof(H1DFP16);
/* Convert a character string to decimal128 format for insert */
strcpy( (char *)H1CHAR, "1.28E2" );
decimal128FromString((decimal128_t *)&H1DFP34,
(char *)H1CHAR,
&l_decCtxt128);
LEN_H1DFP34 = sizeof(H1DFP34);
/* Bind to DECFLOAT(16)*/
SQLParameter( hstmt,
1,
SQL_PARAM_INPUT,
SQL_C_DECIMAL64,
SQL_DECFLOAT,
16,
0,
(SQLPOINTER)&H1DFP16,
sizeof(H1DFP16),
(SQLINTEGER *)&LEN_H1DFP16);
/* Bind to DECFLOAT(34)*/
SQLParameter( hstmt,
1,
SQL_PARAM_INPUT,
SQL_C_DECIMAL128,
SQL_DECFLOAT,
34,
0,
(SQLPOINTER)&H1DFP34,
sizeof(H1DFP34),
(SQLINTEGER *)&LEN_H1DFP34);
以下代码演示了如何从 DECFLOAT 列中检索十进制浮点数据。 例子:
- 将 DECFLOAT(16) 列绑定到 SQLDECIMAL64 变量,将 DECFLOAT(34) 列绑定到 SQLDECIMAL128 变量。
- 将数据从DECFLOAT列中提取到 SQLDECIMAL64 和 SQLDECIMAL128 变量中。
- 将 SQLDECIMAL64 和 SQLDECIMAL128 变量转换为字符格式,并将结果赋值给字符变量。
/* Declare variables for decimal floating point data */
SQLDECIMAL64 H1DFP16;
SQLDECIMAL128 H1DFP34;
SQLINTEGER LEN_H1DFP16;
SQLINTEGER LEN_H1DFP34;
SQLCHAR H1CHAR[100];
decNumber_t tempDecNum;
/* Bind DECFLOAT(16) column */
rc = SQLBindCol( hstmt,
1,
SQL_C_DECIMAL64,
(SQLPOINTER)&H1DFP16,
sizeof(H1DFP16),
(SQLINTEGER *)&LEN_H1DFP16);
/* Bind DECFLOAT(34) column */
rc = SQLBindCol( hstmt,
1,
SQL_C_DECIMAL128,
(SQLPOINTER)&H1DFP34,
sizeof(H1DFP34),
(SQLINTEGER *)&LEN_H1DFP34);
rc = SQLFetch( hstmt );
/* Convert H1DFP16 to a character string for display */
decimal64ToString( (decimal64_t *)&H1DFP16, (char *)H1CHAR );
/* Convert H1DFP34 to decNumber form in preparation for arithmetic or other operations */
decimal128ToNumber( (decimal128_t *)&H1DFP34, &tempDecNum);