[英]SQLBindParameter to prepare for SQLPutData using C++ and SQL Native Client
我正在尝试使用SQLBindParameter
来准备我的驱动程序以通过SQLPutData
输入。 数据库中的字段是TEXT
字段。 我的功能基于MS的示例精心制作: http : //msdn.microsoft.com/en-us/library/ms713824(VS.85).aspx 。
我已经设置了环境,建立了连接,并成功准备了我的语句但是当我调用SQLBindParam
(使用下面的代码)它始终无法报告: [Microsoft][SQL Native Client]Invalid precision value
int col_num = 1;
SQLINTEGER length = very_long_string.length( );
retcode = SQLBindParameter( StatementHandle,
col_num,
SQL_PARAM_INPUT,
SQL_C_BINARY,
SQL_LONGVARBINARY,
NULL,
NULL,
(SQLPOINTER) col_num,
NULL,
&length );
以上依赖于在SQLGetInfo
为SQL_NEED_LONG_DATA_LEN
信息类型返回“N”的驱动程序。 我的司机返回“Y”。 如何绑定以便我可以使用SQLPutData
?
虽然它看起来不像文档的示例代码,但我发现以下解决方案适用于我正在尝试完成的任务。 感谢gbjbaanb让我重新测试我的输入组合到SQLBindParameter。
SQLINTEGER length;
RETCODE retcode = SQLBindParameter( StatementHandle,
col_num, // position of the parameter in the query
SQL_PARAM_INPUT,
SQL_C_CHAR,
SQL_VARCHAR,
data_length, // size of our data
NULL, // decimal precision: not used our data types
&my_string, // SQLParamData will return this value later to indicate what data it's looking for so let's pass in the address of our std::string
data_length,
&length ); // it needs a length buffer
// length in the following operation must still exist when SQLExecDirect or SQLExecute is called
// in my code, I used a pointer on the heap for this.
length = SQL_LEN_DATA_AT_EXEC( data_length );
执行语句后,您可以使用SQLParamData来确定SQL希望您发送的数据,如下所示:
std::string* my_string;
// set string pointer to value given to SQLBindParameter
retcode = SQLParamData( StatementHandle, (SQLPOINTER*) &my_string );
最后,使用SQLPutData将字符串的内容发送到SQL:
// send data in chunks until everything is sent
SQLINTEGER len;
for ( int i(0); i < my_string->length( ); i += CHUNK_SIZE )
{
std::string substr = my_string->substr( i, CHUNK_SIZE );
len = substr.length( );
retcode = SQLPutData( StatementHandle, (SQLPOINTER) substr.c_str( ), len );
}
你传递NULL作为缓冲区长度,这是一个输入/输出参数,它应该是col_num参数的大小。 此外,您应该传递ColumnSize或DecimalDigits参数的值。
http://msdn.microsoft.com/en-us/library/ms710963(VS.85).aspx
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.