【发布时间】:2013-08-13 11:39:13
【问题描述】:
我有一个包含 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
我错过了什么?
【问题讨论】:
-
您确定数据库中的
location字符串中没有尾随空格?是否有其他表引用该特定条目? -
不确定,因为我所做的只是以编程方式设置字符串,然后在 wxListCtrl 中加载相同的字符串,然后再次使用相同的字符串发送查询。所以我相信它不应该有任何区别,不是吗?
-
我通过将您的代码添加到 wxSQLite3 附带的最小示例中来测试您的代码。它按预期工作 - 尽管不需要为准备好的语句调用 Reset 和 Finalize。也就是说,相应的条目被删除了。插入数据时可能出现问题。您能否提供生成的数据库以供进一步检查?
-
@UlrichTelle 数据库文件可以在这里找到:dropbox.com/s/szori418cryvvuy/browser.config
-
Stefano,我下载了数据库文件看了一下。据我所知,我认为您将数据保存在错误的列顺序中。您可以在“名称”列中找到“位置”值(即“http://...”),反之亦然。因此,您的 DELETE 命令不起作用也就不足为奇了。您可以将 WHERE 条件更改为“WHERE name=?”。但是,最好检查一下用于在表中保存和检索数据的代码,并更正列值的顺序。