一些参数化查询的SQLite问题

时间:2010-06-09 16:51:07

标签: c++ sqlite

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

有没有人知道为什么sqlite3_step在使用参数化查询时只返回1行而在传统的非参数化方式中使用相同的查询?

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

编辑: 以下是显示问题的最简单表的架构: CREATE TABLE RefNums(键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';然后它按预期工作。

1 个答案:

答案 0 :(得分:0)

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

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