0

我有包含 URL 作为主键的数据库。表架构是

 -- Describe HISTORY
CREATE TABLE history  ("name" TEXT NOT NULL,  "location"  TEXT NOT NULL PRIMARY KEY, "time_date" DATE)

和样本数据

|   name    |   location                            |   time_date   |
|   Google  |   http://www.google.co.tz/?gws_rd=cr  |   2013-08-13  |

所以我这样做:

DELETE FROM history WHERE location="http://www.google.co.tz/?gws_rd=cr"

但是删除不起作用!如果我按日期删除或删除一切正常,那么我似乎需要某种转义 URL。我使用 wxSQLite3 和下面的函数

DeleteHistory(const wxString& location)
{
    wxString sql = wxT("DELETE FROM history WHERE location=?;");
    try
    {
        wxSQLite3Statement stmt = m_db->PrepareStatement(sql);
        stmt.Bind(1, location);

        stmt.ExecuteUpdate();
        stmt.Reset();
        stmt.Finalize();//done
    }
    catch (wxSQLite3Exception& e)
    {
        wxMessageBox(e.GetMessage());
        return false;
    }
    return true;
}

数据库文件可以在这里找到:https ://www.dropbox.com/s/szori418cryvvuy/browser.config

我错过了什么?

4

2 回答 2

0

我认为您需要将 location 参数放在引号中,因为它包含(或可能包含)一个问号(解释为占位符)。

于 2013-08-13T13:15:05.550 回答
0

我很愚蠢,因为我在数据库中插入数据期间交换了参数,因此删除无法工作(因为 where 子句指向了不在引用列中的错误数据)。简而言之,我在插入期间交换了列值(即在名称中插入 url,反之亦然)。

我纠正了代码及其工作,感谢 Ulrich Telle 在我引用他时指出

Stefano,我下载了数据库文件并查看了。据我所知,我认为您将数据保存在错误的列顺序中。您可以在“名称”列中找到“位置”值(即“http://...”),反之亦然。因此,您的 DELETE 命令不起作用也就不足为奇了。您可以将 WHERE 条件更改为“WHERE name=?”。但是,最好检查您用于在表中保存和检索数据的代码并更正列值的顺序。

于 2013-08-19T10:47:04.650 回答