使用 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
导致错误代码“无效的精度值”。如果我设置len1 = 0
为一些(可怕的)文档似乎建议,调用SQLBindParameter
工作(对于 2008 本机驱动程序),但执行语句会导致大小为 2 的 blob,即所有输入 blob 的两个默认 0 字节数据被截断为 0 字节。我已经尝试了所有这些组合以及下面列出的所有客户端驱动程序,但都无济于事。我究竟做错了什么?????
环境
客户端操作系统:Windows XP sp3
SQL Server 是
Microsoft SQL Server 09.00.3042
尝试使用的 SQL 客户端:
Microsoft SQL Server Native Client 版本 10.00.5500 (sqlncli10.dll, 2007.100.5500.00)
Microsoft SQL Native Client 版本 09.00.5000 (sqlncli.dll, 2005.90.5000.00)
Microsoft SQL Server ODBC 驱动程序版本 03.85.1132 (sqlsrv32 .dll 2000.85.1132.0)