0

o blob をデータベースに挿入しようとしています。2 つの列にデータを入力することに成功しました。

SQLParamData で問題が発生しています。SQL_NEED_DATA を返す必要があるときにエラーを返します (コードを投稿します)

SQLGetDiagRec を実行すると、エラー テキスト Function sequence error で S1010 が返されます。インターネットでこのエラーを検索したところ、 SQLBindParameter のパラメーターに関連している可能性があることがわかりました。

// Bind the parameter marker.
    retCode = retcode = SQLBindParameter(hstmt,  // hstmt
         1,                     // ipar
         SQL_PARAM_INPUT,            // fParamType
         SQL_C_BINARY,               // fCType
         SQL_LONGVARBINARY,           // FSqlType
         lbytes,                  // cbColDef
         0,                     // ibScale
         &pParmID,       // rgbValue
         0,                     // cbValueMax
         &cbTextSize);            // pcbValue

    SqlError(hstmt,SQL_HANDLE_STMT,_T("WriteBlob"), _T("CTLSqlConnection"), _T("SQLBindParameter"));
    if(retCode != SQL_SUCCESS)
    {
        delete pData;

        if(!EndTransaction(FALSE))
            return ERR_ENDTRANSACTION_FAILED;
        else
            return -3;
    }

    //SQLExec
    retcode = retCode = SQLExecDirect(hstmt,(SQLTCHAR*)szSqlStat, SQL_NTS);

        SQLRETURN ret;
        SQLCHAR* SQLState;
        SQLINTEGER NativeError;
        SQLSMALLINT errmsglen;
        SQLCHAR errmsg[255];
        SQLCHAR errstate[50];



    retCode = SQLParamData(hstmt, &pParmID);

SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, 1, (SQLCHAR*)errstate, &NativeError, (SQLCHAR*)errmsg, sizeof(errmsg), &errmsglen);
    if(retCode == SQL_NEED_DATA)
    {
        // Put final batch.
        SQLPutData(hstmt, pData, lbytes); 
    }
    else
    {
        delete pData;

コードのこの部分が十分に関連していない場合は、さらに投稿します。

よろしくお願いします。

4

1 に答える 1

0

あなたの論理はここで間違っているようです。SQLExecute (SQLExecDirect) が SQL_NEED_DATA を返したときに、SQLParamData を呼び出し、SQLPutData でデータを提供する必要があるパラメーターを通知します。SQLExecute が SQL_NEED_DATA を返さなかったときに SQLParamData を呼び出すと、関数シーケンス エラーであることがよくわかります。まだ必要な場合は、おそらくどこかから例を掘り出すことができます。

于 2012-09-27T14:16:43.823 に答える