SQLBindParameter для подготовки к SQLPutData с использованием C++ и собственного клиента SQL
Я пытаюсь использовать 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 );
Вышеуказанное зависит от используемого драйвера, возвращающего "N" для SQL_NEED_LONG_DATA_LEN
тип информации в SQLGetInfo
, Мой водитель возвращает "Y". Как связать, чтобы я мог использовать SQLPutData
?
2 ответа
Вы передаете NULL в качестве длины буфера, это параметр in / out, который должен быть размером параметра col_num. Также вам следует передать значение для параметров ColumnSize или DecimalDigits.
http://msdn.microsoft.com/en-us/library/ms710963(VS.85).aspx
Хотя это не похоже на пример кода в документации, я нашел следующее решение для того, что я пытаюсь выполнить. Спасибо 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 );
}