如何查看从我的应用程序到达 .db/.sqlite 文件的 SQLite 查询?
How to view the SQLite query that is reaching the .db/.sqlite file from my application?
我知道 SQL 服务器有许多工具,包括探查器和一些连接到数据库并允许您查看到达它的查询以及随后返回的值的工具。
在我的 Qt 桌面应用程序中,单击按钮后,会准备查询、绑定值并执行,但结果是错误的。有兴趣调试此查询,我希望能够查看到达数据库的最终查询,以确定是否存在最终导致查询失败的与数据库无关的错误。
我怎样才能做到这一点?
您可以使用 sqlite3_expanded_sql()
查看准备好的语句正在执行的查询,包括绑定到查询中参数的值。
示例:
#include <iostream>
#include <sqlite3.h>
int main(void) {
sqlite3 *db;
if (sqlite3_open(":memory:", &db) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << '\n';
return 1;
}
if (sqlite3_exec(db, "CREATE TABLE foo(bar)", nullptr, nullptr, nullptr)
!= SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << '\n';
return 1;
}
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(db, "SELECT * FROM foo WHERE bar = ?", -1, &stmt,
nullptr) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << '\n';
return 1;
}
sqlite3_bind_text(stmt, 1, "example", -1, SQLITE_STATIC);
char *sql = sqlite3_expanded_sql(stmt);
// prints out SELECT * FROM foo WHERE bar = 'example'
std::cout << sql << '\n';
sqlite3_free(sql);
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
我知道 SQL 服务器有许多工具,包括探查器和一些连接到数据库并允许您查看到达它的查询以及随后返回的值的工具。
在我的 Qt 桌面应用程序中,单击按钮后,会准备查询、绑定值并执行,但结果是错误的。有兴趣调试此查询,我希望能够查看到达数据库的最终查询,以确定是否存在最终导致查询失败的与数据库无关的错误。
我怎样才能做到这一点?
您可以使用 sqlite3_expanded_sql()
查看准备好的语句正在执行的查询,包括绑定到查询中参数的值。
示例:
#include <iostream>
#include <sqlite3.h>
int main(void) {
sqlite3 *db;
if (sqlite3_open(":memory:", &db) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << '\n';
return 1;
}
if (sqlite3_exec(db, "CREATE TABLE foo(bar)", nullptr, nullptr, nullptr)
!= SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << '\n';
return 1;
}
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(db, "SELECT * FROM foo WHERE bar = ?", -1, &stmt,
nullptr) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << '\n';
return 1;
}
sqlite3_bind_text(stmt, 1, "example", -1, SQLITE_STATIC);
char *sql = sqlite3_expanded_sql(stmt);
// prints out SELECT * FROM foo WHERE bar = 'example'
std::cout << sql << '\n';
sqlite3_free(sql);
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}