[英]How can one bind datetime2(SQL_C_TYPE_TIMESTAMP) using SQLBindParameter?
我正在嘗試使用 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 錯誤,指示日期時間字段溢出;
我已經查找了有關此數據類型的任何示例代碼,但找不到任何工作示例,是否有針對此類型的解決方案的忍者? 精度為 7 的 SQL_TYPE_TIME 很好。
我在 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。 如果我插入一個小數為100
的行(來自 ODBC),這將顯示(在 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.
的日期時間中。 如果我們將123
更改為12300
,則可以存儲事物:它最多匹配000,012,300
,這適合精度為 7 的日期時間,SQL Server 最終顯示: 1999-02-03 08:20:30.0000123
。
我希望這會有所幫助,我希望我理解並正確解釋了分數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.