1

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 ); 

SQL_NEED_LONG_DATA_LEN上記は、使用中のドライバーが の情報タイプに「N」を返すことに依存していSQLGetInfoます。私のドライバーは「Y」を返します。を使用できるようにバインドするにはどうすればよいSQLPutDataですか?

4

2 に答える 2

3

ドキュメントのサンプル コードのようには見えませんが、私が達成しようとしていることに役立つ次の解決策を見つけました。入力の組み合わせを SQLBindParameter に再テストさせてくれた gbjbaanb に感謝します。

    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 );
    }
于 2008-09-18T02:17:40.063 に答える
1

バッファ長としてNULLを渡します。これは、col_numパラメータのサイズである入力/出力パラメータです。また、ColumnSizeまたはDecimalDigitsパラメーターの値を渡す必要があります。

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

于 2008-09-17T16:35:17.780 に答える