使用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);我绑定了前三个参数,没有问题,但我似乎无法弄清楚如何绑定第四个参数。代码本质上是:
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字节。我已经用下面列出的所有客户端驱动程序尝试了所有这些组合,但都没有用。我做错了什么?
环境
Client OS: Windows XP sp3SQL Server是
Microsoft SQL Server 09.00.3042SQL客户端尝试:
Microsoft SQL Server Native Client Version 10.00.5500 (sqlncli10.dll, 2007.100.5500.00) Microsoft SQL Native Client Version 09.00.5000 (sqlncli.dll, 2005.90.5000.00) Microsoft SQL Server ODBC Driver Version 03.85.1132 (sqlsrv32.dll 2000.85.1132.0)发布于 2013-02-14 06:24:24
杰夫·奥在正确的轨道上。尝试将存储过程更改为...
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的结果。
干杯。
https://stackoverflow.com/questions/14860330
复制相似问题