【问题标题】:SQLite problem with some parameterized queries一些参数化查询的 SQLite 问题
【发布时间】:2011-03-01 18:44:20
【问题描述】:

我在使用带有几个表的 SQLite 和参数化查询时遇到了一些问题。我注意到一些使用 SELECT * FROM Table WHERE row=? 的查询在应该返回更多行时返回 1 行。如果我将参数化查询更改为SELECT * FROM Table WHERE row='row',则返回正确的行数。

有谁知道为什么sqlite3_step 在使用参数化查询与以传统非参数化方式使用相同查询时只返回 1 行?

我在 SQLite3 周围使用了一个非常薄的 C++ 包装器。我怀疑包装器可能有问题,但这个问题只存在于几个表上。这让我想知道这些表的设置方式是否有问题。任何建议表示赞赏。

编辑: 这是显示问题的最简单表的架构: CREATE TABLE RefNums (Key TEXT PRIMARY KEY, TripNumber TEXT, RefDesc TEXT, RefNum TEXT);

我正在使用查询:

SELECT * FROM RefNums WHERE TripNumber=?并使用 sqlite3_bind_text。这将在第一次调用 sqlite3_step 时返回 SQLITE_ROW,并在第二次调用 sqlite3_step 时返回 SQLITE_DONE。应该有 2 行。我已经使用 SQLDataBrowser 验证了这些行是否存在。 如果我将查询更改为 SELECT * FROM RefNumbers WHERE TripNumber='012345';然后它按预期工作。

【问题讨论】:

  • 表上的架构是什么样的?
  • 贴一些说明问题的代码。
  • 您怀疑这是包装器的问题是有根据的。

标签: c++ sqlite


【解决方案1】:

我已经解决了这个问题。此代码在 Windows CE/Windows Mobile 平台上运行,其中几乎所有系统 API 都是 Unicode-only。在通过sqlite3_bind_xxx 函数将变量传递给 SQLite 之前,我使用 ATL 7.0 转换实用程序 CT2A 在 T (Unicode) 和 A (Ascii) 之间进行转换。这似乎是问题的根源,因为如果我对查询进行硬编码而不是使用参数化查询,则相同的程序可以正常工作。

我修改了sqlite3_bind_text 包装器以使用 SQLITE_TRANSIENT(SQL 复制数据)而不是 SQLITE_STATIC(SQLite 假定指针是固定的)。该程序现在可以正常工作。临时 CT2A 对象的生命周期和 sqlite3_stmt 对象的生命周期似乎存在一些问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 2011-04-19
    相关资源
    最近更新 更多