2009-07-10 6 views
1

これは以前に尋ねられた解決方法ですが、ps-> executeUpdate()を呼び出すと例外エラーが発生します。誰か明白な例がありますか?C++コネクタでsetBlob()を使用してバイナリデータを設定する方法

+0

"私は解決策を実装しようとしました。"コードを投稿しないとどうしたのですか?また、使用しているチュートリアル/サンプルを知ることもできます。 –

答えて

0

申し訳ありませんマシュー - 私はこの質問(エルロインによる)への前の答えを仮定しました。たぶん私はそれに答えていたはずです。とにかくコードHERESに彼は提案:私は最新(ベータ版)コネクタ/ cppのデバッグLIBSとVS9を使用してい

class DataBuf : public streambuf 
{ 
public: 
    DataBuf(char * d, size_t s) { 
     setg(d, d, d + s); 
    } 
}; 


// prepare sql update statement etc. and set the data pointer 
string* pData = ; // ...not part of the original answer 

DataBuf buffer((char*)pData->data(), pData->length()); 
istream stream(&buffer); 
ps->setBlob(1, &stream); 
ps->executeUpdate(); // This causes an exception in free.c 

。私も文字列の代わりにchar *を使ってみました。

+0

free.cで例外が発生した場合は、メモリに問題が発生したことを意味します。私はそのチャットキャストをまっすぐに見ています。 – Puppy

0

このコードは、私のために正常に動作します:


    Driver *driver; 
    Connection *conn; 

    driver = get_driver_instance(); 
    conn = driver->connect("tcp://127.0.0.1:3306", "root", "root"); 

    std::auto_ptr use_stmt(conn->createStatement()); 
    use_stmt->execute("USE world"); 

    std::auto_ptr stmt(conn->prepareStatement("INSERT INTO terrain_texture_tiles_0 (data) VALUES(?)")); 
    std::string value("A\0B", sizeof("A\0B") - 1); 
    std::istringstream tmp_blob(value); 
    stmt->setBlob(1, &tmp_blob); 
    stmt->execute(); 

はヤロスラフPribyl

0

...それが役に立てば幸いこの投稿は少し古いですが、私は同じ質問に偶然出会いました。私は上記の方法を採用しましたが、私の場合は正しく動作しませんでした。私の場合は、ベクターを取ってストリームに使用しようとしていました。私がやっていたことは、UUIDをとり、これを16バイトのバイナリバージョンに変換してテーブルで使用することでした。上記の方法を使用すると、私のバッファの半分しか占有されていないことがわかりました。

私はstringstreamを使用しました。

std::vector<unsigned char> convertedId; 
std::stringstream   stream; 

// convertedId has been populated with the 16 byte binary version 
stream = std::stringstream(std::string(convertedId.begin(), convertedId.end())); 
// Parameter 1 is BINARY(16) 
pStatement->setBlob(1, &stream); 

注意すべき点がいくつかあります。ストリームは、executeバリアントの1つが呼び出されるまでアクセスされません。したがって、あなたがexecuteを実行するまでストリームを周りに保つ必要があります。

これは誰かを助け、時間を節約することを望みます。

関連する問題