Small. Fast. Reliable.
Choose any three.

SQLite C接口

确定SQL语句是否写入数据库

int sqlite3_stmt_readonly(sqlite3_stmt * pStmt);

当且仅当准备好的语句X没有直接更改数据库文件的内容时,sqlite3_stmt_readonly(X)接口才返回true(非零)。

请注意,应用程序定义的SQL函数虚拟表可能会间接影响数据库的副作用。例如,如果应用程序定义了调用sqlite3_exec()的函数“ eval()” ,则以下SQL语句将通过副作用更改数据库文件:

从t2选择SELECT eval('DELETE FROM t1');

但是由于SELECT语句不会直接更改数据库文件,因此sqlite3_stmt_readonly()仍将返回true。

事务控制语句(例如BEGINCOMMITROLLBACKSAVEPOINTRELEASE)使sqlite3_stmt_readonly()返回true,因为语句本身并不实际修改数据库,而是控制其他语句修改数据库的时间。该ATTACHDETACH语句也引起sqlite3_stmt_readonly(),因为返回true,而那些语句更改数据库连接的配置,也不用更改数据库文件的磁盘上的内容。sqlite3_stmt_readonly()接口对BEGIN返回true,因为 BEGIN仅设置内部标志,但是BEGIN IMMEDIATEBEGIN EXCLUSIVE命令确实会触及数据库,因此sqlite3_stmt_readonly()对于这些命令返回false。

另请参见 对象常量函数的列表