gpt4 book ai didi

sql-server - SQLBindParameter 与 SQL_VARBINARY(MAX) 给出 "Invalid precision value"

转载 作者:行者123 更新时间:2023-12-04 01:51:50 28 4
gpt4 key购买 nike

使用 C++ 代码,我尝试使用存储过程将大型二进制 blob 插入到 MS SQL 服务器中。我要插入的表有 5 列,类型:

int
varchar
datetime
varbinary(max)
datetime

存储过程有4个参数:

PROCEDURE [dbo].[spr_fff] 
@act AS INT
,@id AS VARCHAR(255)
,@timestamp AS DATETIME
,@blob AS VARBINARY(MAX)

我设置了我的语句(检查我没有显示的返回值):

const std::string queryString("{Call [spr_fff](?,?,?,?)}");
SQLHSTMT handle = NULL;
SQLAllocHandle(SQL_HANDLE_STMT, m_hConn, &handle);
SQLPrepare(handle, (SQLCHAR *)queryString.c_str(), SQL_NTS);

我绑定(bind)前三个参数没有问题,但我似乎无法弄清楚如何绑定(bind)第四个参数。代码本质上是:

std::string sData; getData(sData);  //fills sData with the binary data
SQLLEN len1 = ???;
SQLBindParameter( handle, (SQLUSMALLINT)4, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_VARBINARY, len1, 0, (SQLCHAR*)&sData.c_str(), (SQLLEN)sData.size(), NULL);

技巧似乎是弄清楚 len1 应该是什么。如果sData.size() < 8000 , 然后 len1 = sData.size()工作正常。但是如果sData.size() > 8000 ,似乎没有任何效果。如果我设置 len1 = sData.size() , 或 len1 = 2147483647调用SQLBindParameter导致错误代码“无效的精度值”。如果我设置 len1 = 0正如一些(可怕的)文档似乎暗示的那样,调用 SQLBindParameter工作(对于 2008 native 驱动程序),但执行该语句会导致大小为 2 的 blob,即两个默认的 0 字节,所有输入 blob 数据都被截断为 0 字节。我已经尝试了所有这些与下面列出的所有客户端驱动程序的组合,但都无济于事。我做错了什么????

环境
客户端操作系统:Windows XP sp3

SQL Server 是
微软 SQL Server 09.00.3042

尝试过的 SQL 客户端:
Microsoft SQL Server Native Client 版本 10.00.5500 (sqlncli10.dll, 2007.100.5500.00)
Microsoft SQL native 客户端版本 09.00.5000(sqlncli.dll,2005.90.5000.00)
Microsoft SQL Server ODBC 驱动程序版本 03.85.1132 (sqlsrv32.dll 2000.85.1132.0)

最佳答案

好的,我的问题的答案实际上是我在调用 SQLBindParameter 时搞砸了。如果您查看我上面的代码,我将最终参数设置为 NULL。仔细阅读文档 - 相信我,它需要仔细阅读! - 显示如果最终参数为 NULL,则数据将被视为以零终止。 (the documentation for SQLBindParameter 说“如果 StrLen_or_IndPtr 是一个空指针,驱动程序假定所有输入参数值都是非 NULL 并且字符和二进制数据是空终止的。” - 强调我的)并且,不幸的是,我提供的数据的第二个或第三个字节为零,因此实际存储的 blob 只有 1 或 2 个字节。不确定为什么它在 8000 以下的大小下工作 - 大小 <8000 和各种驱动程序版本可能有一些相互作用,但我没有花时间去梳理它。

此外,在上面的代码中,我声明“如果我设置 len1 = 0,就像一些(可怕的)文档似乎建议的那样,”。这实际上是正确的做法。

正确的代码是

SQLLEN len1 = 0;
SQLLEN nThisLen = (SQLLEN)sData.size();
SQLBindParameter( handle, (SQLUSMALLINT)4, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_VARBINARY, len1, 0, (SQLCHAR*)&sData.c_str(), nThisLen, &nThisLen );

关于sql-server - SQLBindParameter 与 SQL_VARBINARY(MAX) 给出 "Invalid precision value",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14860330/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com