2015-11-07 127 views
1

我試圖使用SQLBindParameter DATETIME2參數綁定爲SQL_TYPE_TIMESTAMP數據類型如下如何使用SQLBindParameter綁定datetime2(SQL_C_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);

R c是0

當我exceute的查詢(INSERT) SQLExecDirect(hStmt, const_cast<wchar_t*>(query.c_str()), SQL_NTS); 我得到2 2008年的sqlstate錯誤指示日期時間字段溢出;

我查找過這個數據類型的任何示例代碼,找不到任何工作示例,有沒有一個忍者那裏誰有這種類型的解決方案? 是罰款精密SQL_TYPE_TIME 7

+0

我首先想到Datetime2有一個特殊的擴展(比如time2),但是沒有 - https://msdn.microsoft.com/en-us/library/bb677267。aspx 你可以顯示你正在填充到被綁定爲輸入參數的'SQL_TIMESTAMP_STRUCT'中的值嗎? – erg

+0

@確定,這是值'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

回答

1

我得到的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

我希望這會有所幫助,並且我希望我能理解並解釋分數。