私は困惑している次の問題を抱えています。注意すべき点として、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 をuser
行study
に一致させ、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 の構築に問題があることを示す大きな手がかりでした。