0

私は困惑している次の問題を抱えています。注意すべき点として、Qt の組み込み SQLite サポートではなく、プリコンパイル済みの sqlite3.dll を使用しています。

テーブル作成コード:

CREATE TABLE STUDY(
    Name NOT NULL, 
    UserName NOT NULL REFERENCES USERS(UserName), 
    Description DEFAULT NULL, 
    PathToOsirixDB DEFAULT NULL, 
    PRIMARY KEY(Name, UserName)
)

次の C++ コードはPathToOsirixDB、既に値が含まれている場合、列の値を更新できません。

エラーは返されず、サイレントに失敗します。これは、UPDATE で一致する行がないことを意味します。ただし、有効なエントリを含む同じ UPDATE をuserstudyに一致させ、SQLite Manager Firefox プラグインまたはコマンド ライン ツールのいずれかを介して実行すると、正しく機能します。

void CStudyDatabase::SetOsirixDBForStudy(const QString user, const QString study, const QString path)
{
    if (mp_db)
    {
        int before = sqlite3_total_changes(mp_db);
        QString insert = QString("UPDATE STUDY SET PathToOsirixDB = '%1' WHERE Name = '%2' AND UserName = '%3'").arg(path, study, user);
        if (!InsertData(insert))
        {
            int after = sqlite3_total_changes(mp_db);

            if (after - before >= 1)
            {
                SetOsirixDB(path.toAscii().data());
                emit ReturnOsirixDB(osirix_db);
            }
            else
            {
                emit DatabaseError(QString("Failed to update the target path."));
            }
       }
   }
}

挿入データの場合

int CStudyDatabase::InsertData(const QString insert)
{
    char *err_msg = 0;
    int rc = sqlite3_exec(mp_db,
                      insert.toStdString().c_str(),
                      NULL,
                      this,
                      &err_msg);
    if (rc)
        SignalDatabaseError(&err_msg);

    return rc;
}

どんな洞察も高く評価されます。ありがとうございました。

SetOsiriXDBForStudy更新:更新する行が実際に見つかるかどうかを確認するために、次のコードを追加しました。

osirix_db = QString("");

QString query = QString("SELECT PathToOsirixDB FROM STUDY WHERE Name = '%1' AND UserName = '%2'").arg(study, user);
int rc = 0;
char *err_msg = 0;

rc = sqlite3_exec(mp_db,
                      query.toStdString().c_str(),
                      &OsirixDBCallback,
                      this,
                      &err_msg);
if (rc)
    SignalDatabaseError(&err_msg);

if (!(QString(osirix_db).isEmpty()))
    studyrowfound = true;

この場合、osirix_db を空の文字列のままにします。

しかし、この関数を実行すると:

void CStudyDatabase::QueryOsirixDB(const QString user, const QString study)
{
    int rc = 0;
    char *err_msg = 0;

    // we query the OrisixDB via the callback and then emit the signal if all went well
    QString query = QString("SELECT PathToOsirixDB FROM STUDY WHERE Name = '%1' AND UserName = '%2'").arg(study, user);

    rc = sqlite3_exec(mp_db,
                  query.toStdString().c_str(),
                  &OsirixDBCallback,
                  this,
                  &err_msg);
    if (rc)
        SignalDatabaseError(&err_msg);

    if (QString(osirix_db).isEmpty())
        emit NeedToSetOsirixDB(user, study, QString());
    else
        emit ReturnOsirixDB(osirix_db);
}

次に、期待値を osirix_db に正しく取得します。

最終更新: 問題が見つかりました。userとの先行スペースでしたstudy。同じデバッガー ステートメントを長時間見つめていて、余分なスペースをごまかしていました。失敗した SELECT は、SQL の構築に問題があることを示す大きな手がかりでした。

4

1 に答える 1

0

ユーザーと研究に関する主要なスペースがありました。同じデバッガー ステートメントを長時間見つめていて、余分なスペースをごまかしていました。失敗した SELECT は、SQL の構築に問題があることを示す大きな手がかりでした。

于 2013-12-05T17:55:40.980 に答える