2

我正在尝试使用 SQLBindParameter 为SQL_TYPE_TIMESTAMP数据类型绑定 datetime2 参数,如下所示

SQLBindParameter(hStmt, 7, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, 0, 0, &datetime2, 0, NULL);

也试过这个:

rc = SQLBindParameter(hStmt, 8, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, SQL_TIMESTAMP_LEN + 1, 7, &rec.datetime2, 0, NULL);

rc 为 0

当我执行查询(插入)时, SQLExecDirect(hStmt, const_cast<wchar_t*>(query.c_str()), SQL_NTS); 我收到 22008 sqlstate 错误,指示日期时间字段溢出;

我已经查找了有关此数据类型的任何示例代码,但找不到任何可行的示例,是否有忍者对此类型有解决方案?精度为 7 的 SQL_TYPE_TIME 很好。

4

1 回答 1

3

我在 SQL Server 2014 中遇到了同样的错误:如果我使用 绑定nResult = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TIMESTAMP, 0, 0, &ts, sizeof(ts), &cbValue); ,我得到:

错误; 本机:0;状态:22008;msg:[Microsoft][ODBC Driver 11 for SQLerver]日期时间字段溢出。小数秒精度超过参数绑定中指定的比例。

因此,我尝试使用如下代码检查服务器的实际期望:

nResult = SQLPrepare(hstmt, (SQLWCHAR*)L"INSERT INTO tTestTable (myTestCol, d2) VALUES(100, ?)", SQL_NTS);

SQLSMALLINT   DataType, DecimalDigits, Nullable;
SQLUINTEGER   ParamSize;

nResult = SQLDescribeParam(hstmt, 1, &DataType, &ParamSize, &DecimalDigits, &Nullable);
if (!SQL_SUCCEEDED(nResult))
{
    printErrStmt(hstmt);
}
std::wcout << L"ParamSize: " << ParamSize << L"; DecimalDigits: " << DecimalDigits << std::endl;

这打印出来:

参数大小:27;小数位数:7

所以,让我们尝试使用 27 和 7 以及一小部分123- 我仍然得到错误:

错误; 本机:0;状态:22008;msg:[Microsoft][ODBC Driver 11 for SQL erver]日期时间字段溢出。小数秒精度超过参数绑定中指定的比例。

但后来我在 microsoft 找到了示例:https ://msdn.microsoft.com/de-de/library/ff878122%28v=sql.120%29.aspx 这个示例让事情变得更加混乱,因为它们完全符合一样?等等——不同的是,他们只使用了一个小数值100——这会有所作为吗?是的,它确实。将分数更改为100使事情起作用。为什么?

让我们直接看 SQL Server 2014。如果我插入了一个行(来自 ODBC),其中的一部分100会显示(在 SQL Server Management Studio 中)为:1999-02-03 08:20:30.0000001. 记住分数的确切含义:来自 MS 的文档:https ://msdn.microsoft.com/en-us/library/ms714556%28v=vs.85%29.aspx

[b] 分数字段的值是十亿分之一秒的数量,范围从 0 到 999,999,999(1 小于 10 亿)。例如,半秒的分数字段的值为 500,000,000,千分之一秒(一毫秒)的值为 1,000,000,百万分之一秒(一微秒)的值为 1,000,十亿分之一秒(一纳秒)为 1。

所以:一小部分100是 100 亿分之一秒,这是000,000,100. 但是 Datetime2 字段的精度为7. 由于最后一部分是00没有舍入误差。但是,如果您通过,123这将是000,000,123. 这不能存储在精度为 的日期时间中7.。如果我们将 更改12312300,则可以存储事物:匹配到000,012,300,这适合日期时间,精度为 7,SQL Server 最终显示:1999-02-03 08:20:30.0000123

我希望这会有所帮助,我希望我正确理解并解释了分数。

于 2015-11-10T08:48:55.853 回答