我有使用這樣定義一個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是否有一些我需要在某處添加的奇怪規則?