2014-02-24 374 views
1

我有使用這樣定義一個Microsoft SQL Server測試表:ODBC錯誤「字符串數據,右截斷州代碼:22001」與SQL Server數據庫

CREATE TABLE [dbo].[Table] ( [FirstName] NVARCHAR (255) NULL, [LastName] NVARCHAR (255) NULL );

只是有一排該表分別具有值「人」和「人」。

我想添加一個函數,將更新該行的值,但我一直運行到這個「[Microsoft] [ODBC SQL Server驅動程序]字符串數據,右截斷狀態代碼:22001」錯誤,我不能找出問題所在。我環顧四周,人們說這是由於數據太長而無法放入列中引起的,但這是不可能的,因爲我試圖更新的字符串只有兩個字符,並且您可以在表格定義中看到它有足夠的空間。

我使用優化的目的準備好的聲明,代碼創建它看起來是這樣的:

const tString query("UPDATE \"" + tableName + "\" SET " + setClause + " WHERE " + whereClause + ";"); 

SQLHSTMT statement; 
SQLAllocHandle(SQL_HANDLE_STMT, fSQLConnection, &statement); 

SQLPrepareW(statement, (SQLWCHAR *) query.mWideStr(), SQL_NTS);` 

查詢字符串看起來是這樣的:

UPDATE "Table" SET "FirstName" = ?, "LastName" = ? WHERE "FirstName" = ? AND "LastName" = ?;

然後我我綁定這樣的參數:

// We have our own string class that we use, which is where the mWideStr() and mGetStrSize() 
// come from. mWideStr() returns a pointer to a UCS-2 buffer and mGetStrSize() returns the 
// size in bytes. 
SQLLEN pcbValue(SQL_NTS); 
SQLUSMALLINT paramIndex(1); 

// Call this for each parameter in the correct order they need to be bound, incrementing the 
// index each time. 
SQLBindParameter(statement, paramIndex++, SQL_PARAM_INPUT, SQL_C_WCHAR, SQL_VARCHAR, 255, 0, (SQLPOINTER) paramValue.mWideStr(), paramValue.mGetStrSize(), &pcbValue); 

第一個和第二個綁定參數是新值,它們都是「55」,然後第三個是「person」,第四個是「man」。

然後執行它只是一個調用語句SQLExecute()

SQLExecute(statement);

的呼叫SQLExecute()失敗,然後生成錯誤,有一些更多的代碼輸出的錯誤消息。據我可以告訴這應該都工作得很好。我有另一個使用Oracle的數據庫,它使用完全相同的設置和代碼,並且沒有任何問題,它只是SQL Server出於某種原因而出現故障。這裏有什麼明顯的錯誤,我錯過了? SQL Server是否有一些我需要在某處添加的奇怪規則?

回答

3

SQLLEN pcbValue(SQL_NTS);變量被傳遞給SQLBindParameter()在綁定參數和執行語句之間超出了範圍,這意味着在參數綁定中指向了一些垃圾數據。我也意識到你不需要指定最後一個參數。你可以傳遞NULL,它會像一個nul終止的字符串一樣工作。

因此,修復方法是取消SQLLEN pcbValue(SQL_NTS);變量,而僅將NULL改爲SQLBindParameter()作爲最後一個參數。

愚蠢的錯誤,但值得注意,我想。

相關問題