我正在通过 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
感兴趣。
文档说
数字结构的精度和小数位数字段从不用于应用程序的输入,仅用于从驱动程序到应用程序的输出。
这与您的观察结果一致。
附近的文档提供了一个与您尝试做的几乎完全相同的事情的示例。它们展示了为参数创建和配置类型为 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);