如何使用SQL_NUMERIC_STRUCT发送小数部分?

问题描述 投票:0回答:1

我正在通过 ODBC 使用 SQL Server。

数据库有一个带有

money
字段的表。我想向它发送数据。所以我正在做:

SQL_NUMERIC_STRUCT st = {.scale=4, .precision=19, .sign=1};
memcpy(st.val, convert_to_hexdecimal((int64_t)(1.2345 * 10000)), sizeof(st.val));
SQLBindParam(stmt, 1, SQL_PARAM_INPUT, SQL_C_NUMERIC, SQL_NUMERIC, 19, 0, &st, 0, NULL);

这给了我在数据库中的

12345.0000

我做错了什么?

请不要建议切换到 SQL_C_CHAR 并向数据库发送带有“1.2345”的字符串。我已经知道这个解决方案了。我对正确使用

SQL_NUMERIC_STRUCT
感兴趣。

c sql-server odbc unixodbc
1个回答
0
投票

文档

数字结构的精度和小数位数字段从不用于应用程序的输入,仅用于从驱动程序到应用程序的输出。

这与您的观察结果一致。

附近的文档提供了一个与您尝试做的几乎完全相同的事情的示例。它们展示了为参数创建和配置类型为 SQLHDESC

参数描述符
,并在那里设置精度和比例。 我没有合适的环境来测试这个,但按照这个例子,看起来你想要这样的东西:

SQL_NUMERIC_STRUCT st = {.sign=1};
memcpy(st.val, convert_to_hexdecimal(12345), sizeof(st.val));
SQLBindParam(stmt, 1, SQL_PARAM_INPUT, SQL_C_NUMERIC, SQL_NUMERIC, 19, 0, &st, 0, NULL);

SQLHDESC hdesc = NULL;

SQLGetStmtAttr(stmt, SQL_ATTR_APP_PARAM_DESC, &hdesc, 0, NULL);
SQLSetDescField(hdesc, 1, SQL_DESC_TYPE, (SQLPOINTER) SQL_C_NUMERIC, 0);
SQLSetDescField(hdesc, 1, SQL_DESC_PRECISION, (SQLPOINTER) 5, 0);
SQLSetDescField(hdesc, 1, SQL_DESC_SCALE, (SQLPOINTER) 4, 0);
SQLSetDescField(hdesc, 1, SQL_DESC_DATA_PTR, (SQLPOINTER) &st, 0);
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.