0

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

简化的德尔福代码:

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。但这似乎并没有改变任何东西。

4

1 回答 1

0

我想我重读了函数pzTail中的参数。sqlite3_prepare_*

sqlite3_next_stmt()因此,我现在使用上一个循环sqlite3_prepare_v2中的pzTail字符串调用,而不是迭代:

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 上的这个帖子让我找到了正确的方向。

于 2019-12-29T10:57:54.800 回答