2011-07-13 13 views
1

私はmysql ++の新しいユーザーで、いくつかのポインタ(punが意図している)を探しています。mysql ++クエリが失敗する

問題:私の更新ステートメントが失敗します。

接続が開いています。接続を使用する前のステートメントが機能します。

更新しようとしているレコードが存在すると確信しています。私はmysqlのクエリツールでそれを見ることができます。 CustomerIdが正しいと確信しています。

 // declaration of the customer id 
    uint32_t CustomerId; 

これはなぜ更新に失敗しますか?

mysqlpp::Connection conn(true); 
    try 
    { 
     if (conn.connect(db_rw.Name, db_rw.Host, db_rw.User, db_rw.Password)) 
     { 

     // *snip* insert code here works fine. 

     // this query fails 
     mysqlpp::Query query = conn.query("UPDATE customer SET AccountName=%2q, Active=%3, Password=%1 WHERE CustomerId=%0"); 
     query.parse(); 
     mysqlpp::SQLQueryParms parms; 
     parms.push_back(mysqlpp::sql_int(CustomerId)); 
     parms.push_back(mysqlpp::sql_blob(data, sizeof(data))); //<- 16 byte binary blob 
     parms.push_back(mysqlpp::sql_varchar(widget.AccountName->text().toAscii().data())); // string 
     parms.push_back(mysqlpp::sql_bool(widget.ActiveCheckBox->checkState() == Qt::Checked ? 1 : 0)); // 
     mysqlpp::SimpleResult res = query.execute(parms); 
     } 
    } 

接続の例外を無効にすると、自動的に失敗します(result.info()メソッドは何も返しません)。

は、私は文字列に変換しようとすると、それに例外は障害をSEG回す場合:

BLOBデータ(Password

std::string Query::str(SQLQueryParms& p) 
{ 
    if (!parse_elems_.empty()) { 
     proc(p); 
    } 

    return sbuffer_.str(); 
} 
+0

問題はバイナリBLOBのようです。バイナリデータを16進数でエンコードするためのssqls修飾子はありますか? – Jay

答えて

1

いくつかの問題がありました。

ライブラリはバイナリデータを正しくエスケープしません。

接続に関連付けられたユーザーに更新アクセス権がない場合、ライブラリは例外をスローする代わりにクラッシュします。

1

ウォーレンは、メーリングリスト上の答えに私を打つが、後世のために)を引用してエスケープする必要があります。

テンプレートクエリの代わりにSSQLSを使用すると、これが自動的に処理されます。

http://tangentsoft.net/mysql++/doc/html/userman/tutorial.html#id2776204

+0

ツイートクロスポスト。答えをミラーリングしてくれてありがとう、クリス。 –

関連する問題