1

私は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()メソッドは何も返しません)。

文字列に変換しようとしたときに例外をオンにすると、セグメンテーション違反が発生します。

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

    return sbuffer_.str();
}
4

2 に答える 2

1

ウォーレンはメーリングリストの答えに私を殴りましたが、後世のために:

BLOBデータ(Password)は引用符で囲んでエスケープする必要があります。

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

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

于 2011-07-13T20:47:59.797 に答える
1

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

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

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

于 2011-07-14T18:12:18.150 に答える