0

qt c ++でmysqlデータベースにアクセスしようとしています。

さまざまなテーブルがあり、それらを に出力したいと考えていますQTableView

を使用していますがQSqlTableModel、これはうまく機能しますが、結果をフィルタリングしたいときに問題が発生します..

ソースコードの主要部分は次のとおりです。

mModelContacts->setTable("contacts");
mModelContacts->select();
mUi->tableContacts->setModel(mModelContacts);

void MainWindow::on_submitContactsButton_clicked()
{

switch(mUi->comboBoxContacts->currentIndex())
{
    case 0:
        mModelContacts->setFilter("contacts_id = "+mUi->searchContactsLine->text());
        break;
    case 1:
        mModelContacts->setFilter("contacts_firstName LIKE "+'%'+mUi->searchContactsLine->text()+'%');
        break;
    case 2:
        mModelContacts->setFilter("contacts_lastName LIKE "+'%'+mUi->searchContactsLine->text()+'%');
        break;
    case 3:
        mModelContacts->setFilter("contacts_city LIKE "+'%'+mUi->searchContactsLine->text()+'%');
        break;
    case 4:
        mModelContacts->setFilter("contacts_phoneNumber LIKE "+'%'+mUi->searchContactsLine->text()+'%');
        break;
}

mModelContacts->select();
mUi->tableContacts->setModel(mModelContacts);

}

ID フィルター (ケース 0) は正常に機能します。しかし、他のすべて (ファーストネーム、ラストネームなど) はそうではありません。空のテーブルが表示されます。したがって、列名は表示されますが (したがって、SQL 構文は正しいと思います)、何を入力してもエントリはありません。

ソースコードに誤りはありますか? または、どうすればこれを機能させることができますか?

4

1 に答える 1

1

char*C スタイルの文字列 ( "contacts_firstName LIKE ") をchar( ) に追加すると問題が発生します'%'。これにより、次のようになります。

  1. char( )は'%'整数 (ASCII での表現) にキャストされます。加算を実行するには、これを見てください。
  2. キャストの結果の整数 ( 37) が C スタイルの文字列に追加されchar*ます。これにより、初期化していないメモリが取得されます (おそらく、読み取り専用データ セクションにある他の C スタイルの文字列)。
  3. その後、QString上記の結果の邪悪なポインタからのデータを(文字が見つかるまで'\0')行編集にある文字列に追加し、QString明らかに目的ではない a になります。. .

setFilter要約すると、呼び出しを次のように置き換える必要があります。

mModelContacts->setFilter(QString("contacts_firstName LIKE '%")+mUi->searchContactsLine->text()+QString("%'"));
于 2016-06-24T13:11:18.703 に答える