【问题标题】:ODBC error "String data, right truncation State code: 22001" with SQL Server databaseODBC 错误“字符串数据,右截断状态代码:22001”与 SQL Server 数据库
【发布时间】:2014-02-24 20:40:07
【问题描述】:

我有一个使用 Microsoft SQL Server 的测试表,其定义如下:

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

表中只有一行的值分别为“person”和“man”。

我正在尝试添加一个函数来更新该行的值,但我一直遇到此“[Microsoft][ODBC SQL Server Driver]String 数据,右截断状态代码: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 是否有一些我需要在某处添加的奇怪规则?

【问题讨论】:

    标签: c++ sql-server odbc


    【解决方案1】:

    传递给SQLBindParameter()SQLLEN pcbValue(SQL_NTS); 变量超出了绑定参数和执行语句之间的范围,这意味着在参数绑定中指向了一些垃圾数据。我还意识到您不需要指定最后一个参数。你可以只传递 NULL,它会像一个以 nul 结尾的字符串一样。

    因此解决方法是删除 SQLLEN pcbValue(SQL_NTS); 变量,并将 NULL 传递给 SQLBindParameter() 作为最后一个参数。

    愚蠢的错误,但我想值得注意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-18
      • 1970-01-01
      • 2020-07-26
      • 2016-11-10
      • 2013-01-15
      • 1970-01-01
      • 2021-07-03
      • 1970-01-01
      相关资源
      最近更新 更多