我得到的SQL Server 2014同樣的錯誤:如果我綁定使用nResult = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TIMESTAMP, 0, 0, &ts, sizeof(ts), &cbValue);
,我得到:
ERROR; native: 0; state: 22008; msg: [Microsoft][ODBC Driver 11 for SQLerver]Datetime field overflow. Fractional second precision exceeds the scale specified in the parameter binding.
所以,我試圖檢查服務器實際上是什麼預計,使用如下代碼:
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
一小部分 - 我仍然得到錯誤:
ERROR; native: 0; state: 22008; msg: [Microsoft][ODBC Driver 11 for SQL erver]Datetime field overflow. Fractional second precision exceeds the scale specified in the parameter binding.
但後來我發現這裏的樣品微軟: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] The value of the fraction field is the number of billionths of a second and ranges from 0 through 999,999,999 (1 less than 1 billion). For example, the value of the fraction field for a half-second is 500,000,000, for a thousandth of a second (one millisecond) is 1,000,000, for a millionth of a second (one microsecond) is 1,000, and for a billionth of a second (one nanosecond) is 1.
所以:的100
一部分將被第二個100個十億分,這是000,000,100
。但Datetime2字段的精度爲7
。作爲最後一部分是00
沒有舍入錯誤。但如果你通過123
這將是000,000,123
。這不能存儲在日期時間精度爲7.
。如果我們將123
更改爲12300
,則可以存儲該事物:它最多匹配000,012,300
,這符合日期時間,精度爲7,並且SQL Server最終顯示:1999-02-03 08:20:30.0000123
。
我希望這會有所幫助,並且我希望我能理解並解釋分數。
我首先想到Datetime2有一個特殊的擴展(比如time2),但是沒有 - https://msdn.microsoft.com/en-us/library/bb677267。aspx 你可以顯示你正在填充到被綁定爲輸入參數的'SQL_TIMESTAMP_STRUCT'中的值嗎? – erg
@確定,這是值'SQL_TIMESTAMP_STRUCT datetime2; datetime2.year = 1999; datetime2.month = 2; datetime2.day = 3; datetime2.hour = 8; datetime2.minute = 20; datetime2.second = 30; datetime2.fraction = 123;' – Genjutsu