SQLBindParameter для подготовки к SQLPutData с использованием C ++ и собственного клиента SQL - PullRequest
1 голос
/ 17 сентября 2008

Я пытаюсь использовать SQLBindParameter, чтобы подготовить драйвер для ввода через SQLPutData. Поле в базе данных является полем TEXT. Моя функция создана на основе примера MS здесь: http://msdn.microsoft.com/en-us/library/ms713824(VS.85).aspx.

Я настроил среду, установил соединение и успешно подготовил свое утверждение, но когда я вызываю SQLBindParam (используя приведенный ниже код), оно постоянно не сообщает:

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 ]

3 голосов
/ 18 сентября 2008

Хотя это не похоже на пример кода в документации, я нашел следующее решение для достижения того, чего я пытаюсь достичь. Спасибо 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 голос
/ 17 сентября 2008

вы передаете NULL в качестве длины буфера, это параметр in / out, который должен быть размером параметра col_num. Также вам следует передать значение для параметров ColumnSize или DecimalDigits.

http://msdn.microsoft.com/en-us/library/ms710963(VS.85).aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...