描述
当且仅当准备的语句X不对数据库文件的内容进行直接更改时,sqlite3_stmt_readonly(X)函数返回true(非零)。
C / C ++语法
int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); |
PB语法
FUNCTION sqlite3_stmt_readonly ( _ BYVAL hStmt AS DWORD _ ) AS LONG |
参数
pStmt
[in]语句句柄。
返回值
对或错。
备注
请注意,应用程序定义的SQL函数或虚拟表可能会以副作用间接更改数据库。例如,如果应用程序定义了调用sqlite3_exec的函数“eval()”,则以下SQL语句将通过副作用更改数据库文件:
SELECT eval('DELETE FROM t1')FROM t2;
但是由于SELECT语句不会直接更改数据库文件,所以sqlite3_stmt_readonly仍将返回true。
事务控制语句(如BEGIN,COMMIT,ROLLBACK,SAVEPOINT和RELEASE)导致sqlite3_stmt_readonly返回true,因为语句本身并不实际修改数据库,而是控制其他语句修改数据库的时间。ATTACH和DETACH语句还会导致sqlite3_stmt_readonly返回true,因为这些语句更改了数据库连接的配置,它们不会更改磁盘上数据库文件的内容。
C ++实现代码
/*
** Return true if the prepared statement is guaranteed to not modify the
** database.
*/
SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt){
return pStmt ? ((Vdbe*)pStmt)->readOnly : 1;
}