从数据库中删除URL

时间:2013-08-13 11:39:14

标签: c++ sql sqlite wxwidgets

我的数据库包含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

我错过了什么?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

  

Stefano,我下载了数据库文件并看了一下。从我的角度来看   看,我认为你是在错误的列序列中保存数据。您   在“名称”列中找到“位置”值(即“http:// ...”)   反之亦然。因此,DELETE命令不会令人惊讶   工作。您可以将WHERE条件更改为“WHERE name =?”。然而,   检查您正在使用的代码肯定会更好   保存并从表中检索数据并更正序列   列值。