ODBC 错误"String data, right truncation State code: 22001"与 SQL Server 数据库
ODBC error "String data, right truncation State code: 22001" with SQL Server database
我有一个使用Microsoft SQL Server的测试表,其定义如下:
CREATE TABLE [dbo].[Table] (
[FirstName] NVARCHAR (255) NULL,
[LastName] NVARCHAR (255) NULL
);
表中只有一行的值分别为"person"answers"man"。
我试图添加一个函数来更新该行的值,但我一直遇到这个"[Microsoft][ODBC SQL Server Driver]字符串数据,右截断状态代码: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",然后第三个是"人",第四个是"男人"。
然后要执行这些语句,只需调用SQLExecute()
:
SQLExecute(statement);
对SQLExecute()
的调用失败,然后生成错误,并且还有一些代码输出错误消息。据我所知,这一切应该都很顺利。我有另一个使用Oracle的数据库,它使用了完全相同的设置和代码,它工作起来没有任何问题,只是SQL Server因为某种原因而出现了问题。我是不是遗漏了什么明显的问题?SQL Server是否有一些奇怪的规则需要添加?
传递给SQLBindParameter()
的SQLLEN pcbValue(SQL_NTS);
变量在绑定参数和执行语句之间超出了范围,这意味着在参数绑定中指向了一些垃圾数据。我还意识到,您不需要指定最后一个参数。您可以直接传递NULL,它将表现为一个以nul结尾的字符串。
因此,修复方法是删除SQLLEN pcbValue(SQL_NTS);
变量,并将NULL
传递给SQLBindParameter()
作为最后一个参数。
愚蠢的错误,但我想值得注意。
- VisualStudio:使用 Suse Enterprise Server 12 SP5 时,不会下载远程库标头
- 如何在 Windows 2016 Server 版本 1607 中访问 SetThreadDescription()
- 使用 SQLConfig数据源创建 SQL Server DSN 失败:关键字-值对无效
- 如何将QTime保存在SQL Server Express表中并读回?
- 我需要安装什么才能获得在Windows Server 2012 R2 Standard上运行C++hello world
- boost beast Websocket Multi Request Server/Client 并不是真正的 mul
- Gstreamer:rtsp-server中的trickplay模式
- 无法从 SQL Server 检索数据
- 如何在将Visual Studio C++控制台应用程序连接到Microsoft SQL Server时修复"
- 以C++为目标的Windows Server Core
- SQL Server-未找到数据源名称,也未指定默认驱动程序
- 在Windows Server 2012上运行VS2019编译的应用程序需要什么?
- 我必须安装"libbitcoin-server"才能包含"bitcoin.hpp"
- SDL_Init失败并显示'SDL_Error: Failed to connect to the Mir Server'
- Python vs C++ for CUDA web server?
- 我应该如何使用SQL Server CLR来使用由C++ / C编译的UDT
- 如何在C++代码中连接 SQL Server 数据库
- SQL Server 2017 C++ ODBC 连接在 Linux 上不起作用
- TCP-Server以数据包结构(非Java客户端)发送文件
- ODBC 错误"String data, right truncation State code: 22001"与 SQL Server 数据库