【问题标题】:Deleting URL from database从数据库中删除 URL
【发布时间】: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=?”。但是,最好检查一下用于在表中保存和检索数据的代码,并更正列值的顺序。

标签: c++ sql sqlite wxwidgets


【解决方案1】:

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

【讨论】:

  • 下面链接中的评论说没有必要(顺便说一句,将其添加到占位符使其字符串文字在链接中抛出相同的错误)comments.gmane.org/gmane.comp.db.sqlite.general/44144
  • 我做了一些测试,它甚至没有删除那些没有?
  • 能否在debug模式下运行,在sql调用前查看'location'的值?
  • 当使用参数绑定时(如这里的情况),不需要引用或转义。没有看到完整的代码和数据库,这只是疯狂的猜测。但是,应用程序中的字符串与驻留在数据库文件中的字符串之间必须存在差异 - 可能只是一些空格 - 因为我自己测试了代码并且当字符串相等时删除工作。
  • 我会尝试修剪两个空格,看看它是否有效。还使用示例数据库更新了帖子。
【解决方案2】:

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

感谢 Ulrich Telle 在我引用他时指出的代码及其工作原理

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 2013-05-28
    相关资源
    最近更新 更多