首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有SQL_VARBINARY(MAX)的SQLBindParameter给出“无效的精度值”

带有SQL_VARBINARY(MAX)的SQLBindParameter给出“无效的精度值”
EN

Stack Overflow用户
提问于 2013-02-14 02:20:53
回答 1查看 4.7K关注 0票数 3

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

代码语言:javascript
复制
int
varchar
datetime
varbinary(max)
datetime

存储过程有4个参数:

代码语言:javascript
复制
PROCEDURE [dbo].[spr_fff] 
     @act           AS INT
    ,@id            AS VARCHAR(255)
    ,@timestamp     AS DATETIME
    ,@blob          AS VARBINARY(MAX)

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

代码语言:javascript
复制
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);

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

代码语言:javascript
复制
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会导致错误代码"Invalid precision value“。如果我像一些(可怕的)文档所建议的那样设置len1 = 0,那么对SQLBindParameter的调用可以工作(对于2008本机驱动程序),但是执行该语句会产生一个大小为2的blob,即两个默认的0字节,所有输入的blob数据都被截断为0字节。我已经用下面列出的所有客户端驱动程序尝试了所有这些组合,但都没有用。我做错了什么?

环境

代码语言:javascript
复制
Client OS: Windows XP sp3

SQL Server是

代码语言:javascript
复制
      Microsoft SQL Server 09.00.3042

SQL客户端尝试:

代码语言:javascript
复制
     Microsoft SQL Server Native Client Version 10.00.5500 (sqlncli10.dll, 2007.100.5500.00)
代码语言:javascript
复制
     Microsoft SQL Native Client Version 09.00.5000 (sqlncli.dll, 2005.90.5000.00)
代码语言:javascript
复制
     Microsoft SQL Server ODBC Driver Version 03.85.1132 (sqlsrv32.dll 2000.85.1132.0)
EN

回答 1

Stack Overflow用户

发布于 2013-02-14 06:24:24

杰夫·奥在正确的轨道上。尝试将存储过程更改为...

代码语言:javascript
复制
PROCEDURE [dbo].[spr_fff] 
    @act           AS INT
    ,@id           AS VARCHAR(255)
    ,@timestamp    AS DATETIME
    ,@preblob      AS nvarchar(MAX)

    DECLARE @blob varbinary(MAX) = CAST(@preblob as varbinary(MAX))
    /* Continue using varbinary blob as before */

请注意存储过程中参数数据类型的更改以及随后转换为varbinary的结果。

干杯。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14860330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档