簡體   English   中英

如何使用 SQLBindParameter 綁定 datetime2(SQL_C_TYPE_TIMESTAMP)?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM