Я пытаюсь использовать 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?





вы передаете NULL в качестве длины буфера, это параметр ввода / вывода, который должен быть размером параметра 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 );
}
+1 для комментария «длина в следующей операции должна все еще существовать при вызове SQLExecDirect или SQLExecute». Поскольку ODBC, кажется, оптимизируется, отправляя результаты вызовов Bind и Execute вместе, я столкнулся с несколькими ошибками области видимости по пути.
Пример MSDN каждый раз ломается, у меня до сих пор нет работы :( -