首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用datetime2(SQL_C_TYPE_TIMESTAMP)绑定SQLBindParameter?

如何使用datetime2(SQL_C_TYPE_TIMESTAMP)绑定SQLBindParameter?
EN

Stack Overflow用户
提问于 2015-11-07 02:33:14
回答 1查看 2.8K关注 0票数 2

我试图使用datetime2数据类型的SQLBindParameter绑定SQL_TYPE_TIMESTAMP参数,如下所示

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平方的状态错误,指示日期时间字段溢出;

我已经查找过这个数据类型上的任何示例代码,但是找不到任何有用的示例,是否有一个忍者有这种类型的解决方案?对于精度为7的SQL_TYPE_TIME来说,这是很好的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-10 08:48:55

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

错误;本机: 0;状态: 22008;msg: MicrosoftDatetime字段溢出。小数秒精度超过在参数绑定中指定的比例。

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

代码语言:javascript
复制
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;

这张打印出来:

ParamSize: 27;DecimalDigits: 7

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

错误;本机: 0;状态: 22008;msg: MicrosoftDatetime字段溢出。小数秒精度超过在参数绑定中指定的比例。

但是我在微软发现了一个例子:https://msdn.microsoft.com/de-de/library/ff878122%28v=sql.120%29.aspx --这个示例使事情变得更加混乱,因为它们做的是完全相同的事情?等等--区别是,他们只使用100的分数值--这会有什么区别吗?是的,确实如此。将分数更改为100可以使事情顺利进行。为什么?

让我们直接看看Server 2014。如果我插入了一个行(来自ODBC)和100的一小部分,它将被显示为: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 (小于10亿)。例如,半秒的分数场的值是500,000,000,对于千分之一秒( 1毫秒)是1,000,000,对于百万分之一秒(1微秒)是1,000,对于十亿分之一秒(1毫秒)是1。

所以:100的一小部分是一亿分之一秒,这是000,000,100。但Datetime2场具有7的精度。由于最后一部分是00,所以没有舍入错误。但是如果你通过123,这将是000,000,123。这不能以7.的精度存储在日期时间内。如果我们将123更改为12300,则可以存储它:它与000,012,300匹配,这符合日期时间,精度为7,Server最终显示:1999-02-03 08:20:30.0000123

我希望这有帮助,我希望我理解并解释了分数的事情。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33578536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档