我正在尝试使用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
当我超越查询(INSERT)时
SQLExecDirect(hStmt, const_cast<wchar_t*>(query.c_str()), SQL_NTS);
我得到22008 sqlstate错误,指示Datetime字段溢出;
我在这个数据类型上找了任何示例代码,找不到任何有用的例子,是否有一个忍者有这种类型的解决方案? 对于精度为7的SQL_TYPE_TIME来说没问题。
答案 0 :(得分:2)
我在SQL Server 2014中遇到同样的错误:如果我使用@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_advert);
InitUI();
final Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
@Override
public void run()
{
// Will be called after 5000ms
tvEAdvertLike.setOnClickListener(this);
tvEAdvertDislike.setOnClickListener(this);
btnEAdvertSubmit.setOnClickListener(this);
}
}, 5000);
}
绑定,我得到:
ERROR;原生:0;州:22008; msg:[Microsoft] [ODBC驱动程序11 for SQLerver]日期时间字段溢出。分数秒精度超过 参数绑定中指定的比例。
所以,我尝试检查服务器实际期望的内容,使用以下代码:
nResult = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TIMESTAMP, 0, 0, &ts, sizeof(ts), &cbValue);
打印出来:
ParamSize:27; DecimalDigits:7
所以,让我们试试27和7以及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;
的一小部分 - 我仍然得到错误:
ERROR;原生:0;州:22008; msg:[Microsoft] [ODBC驱动程序11 for SQL erver]日期时间字段溢出。分数秒精度超过 参数绑定中指定的比例。
但后来我在microsoft找到了样本:https://msdn.microsoft.com/de-de/library/ff878122%28v=sql.120%29.aspx
这个样本让事情变得更加混乱,因为它们完全一样吗?等等 - 区别在于,他们使用的分数值仅为123
- 能否产生影响?是的,它确实。将分数更改为100
会使事情奏效。为什么呢?
让我们直接看看SQL Server 2014。如果我插入一行(来自ODBC),其中只有一小部分100
,则会显示(在SQL Server Management Studio中):100
。请记住分数的确切含义:来自MS的文档:https://msdn.microsoft.com/en-us/library/ms714556%28v=vs.85%29.aspx
[b]分数字段的值是a的十亿分之一 第二个,范围从0到999,999,999(1不到10亿)。 例如,半秒的分数字段的值是 500,000,000,千分之一秒(一毫秒) 1,000,000,百万分之一秒(1微秒)是1,000,和 十亿分之一秒(1纳秒)是1。
所以:1999-02-03 08:20:30.0000001
的一小部分将是100亿分之一秒,这是100
。但Datetime2字段的精度为000,000,100
。由于最后一部分是7
,因此没有舍入错误。但如果你传入00
,这将是123
。这不能存储在精度为000,000,123
的日期时间中。如果我们将7.
更改为123
,则可以存储该内容:它最多匹配12300
,这适合日期时间,精度为7,SQL Server最终显示:{ {1}}。
我希望这会有所帮助,我希望我理解并解释了分数正确的事情。