【问题标题】:Getting old results when iterating over sqlite3_next_stmt()迭代 sqlite3_next_stmt() 时得到旧结果
【发布时间】:2019-12-28 12:06:30
【问题描述】:

我有一个图形界面,可以在各自的选项卡中显示多个 SQLite 查询结果。现在,当用户关闭其选项卡时,我正在完成一个sqlite3_stmt 语句,而不是立即。如果有多个选项卡/结果,第一个给我一个sqlite3_stmt,但第二个给我两个:第二个选项卡中的sqlite3_stmt,加上第一个选项卡中的一个。第三个选项卡会给我 3 个结果,依此类推。

简化的 Delphi 代码:

var
    FHandle: sqlite3;
    QueryResult: sqlite3_stmt;
begin
    QueryResult := nil;
    QueryStatus := sqlite3_prepare_v2(FHandle, SQL, -1, QueryResult, nil);
    if QueryStatus = SQLITE_OK then begin
        QueryResult := sqlite3_next_stmt(FHandle, nil);
        while QueryResult <> nil do begin
            while sqlite3_step(QueryResult) = SQLITE_ROW do begin
              // store row data...
            end;
            // points to a previously prepared query:
            QueryResult := sqlite3_next_stmt(FHandle, QueryResult);
        end;
    end;
end;

如何只从刚刚触发的 SQL 中返回语句,而不是从较早的 SQL 中返回?

编辑:我刚刚尝试了sqlite3_prepare_v3,它有一个prepFlags 参数,我可以在其中传递SQLITE_PREPARE_PERSISTENT。但这似乎并没有改变任何东西。

【问题讨论】:

    标签: sqlite c-api


    【解决方案1】:

    我想我在sqlite3_prepare_* functions 中过度读取了pzTail 参数。

    因此,我现在使用最后一个循环中的pzTail 字符串调用sqlite3_prepare_v2,而不是遍历sqlite3_next_stmt()

    while sqlite3_prepare_v2(FHandle, CurrentSQL, -1, QueryResult, NextSQL) = SQLITE_OK do begin
        // store QueryResult for later use...
        while sqlite3_step(QueryResult) = SQLITE_ROW do begin
          // store row data for later use...
        end;
        CurrentSQL := NextSQL;
        if Trim(CurrentSQL) = '' then
          break;
    end;
    

    nabble.com 上的This thread 让我找到了正确的方向。

    【讨论】:

      猜你喜欢
      • 2014-07-28
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多