语句参数(statementparameters)是指插入到SQL命令字符串中的特殊字符,他们作为临时占位符。当一条语句在prepare之后,尚未执行之前,可以给这些占位符绑定指定的值。
参数符号(ParameterTokens)
<span style="font-family:KaiTi_GB2312;font-size:14px;">INSERT INTO people (id, name) VALUES ( ?, ? );</span>
<span style="font-family:KaiTi_GB2312;"> INSERT INTO people (pid, uid, name) VALUES ( ?1, ?1, ?2 );</span>
<span style="font-family:KaiTi_GB2312;"> INSERT INTO people (pid, uid, name) VALUES ( ?1, ?2, ?4 );</span>
<span style="font-family:KaiTi_GB2312;"> INSERT INTO people (id, name) VALUES ( :id, :name );</span>
绑定值(BindingValues)
<span style="font-family:KaiTi_GB2312;">int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));</span>
<span style="font-family:KaiTi_GB2312;">int sqlite3_bind_double(sqlite3_stmt*, int, double);</span>
<span style="font-family:KaiTi_GB2312;">int sqlite3_bind_int(sqlite3_stmt*, int, int);</span>
<span style="font-family:KaiTi_GB2312;">int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64);</span>
<span style="font-family:KaiTi_GB2312;">int sqlite3_bind_null(sqlite3_stmt*, int);</span>
<span style="font-family:KaiTi_GB2312;">int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*));</span>
<span style="font-family:KaiTi_GB2312;">int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*));</span>
<span style="font-family:KaiTi_GB2312;">int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n);</span>
<span style="font-family:KaiTi_GB2312;">int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*);</span>
<span style="font-family:KaiTi_GB2312;">int sqlite3_bind_parameter_count(sqlite3_stmt*);</span>
<span style="font-family:KaiTi_GB2312;">int sqlite3_bind_parameter_index( sqlite3_stmt *stmt, const char *name )</span>
<span style="font-family:KaiTi_GB2312;">sqlite3_bind_int(stmt, sqlite3_bind_parameter_index(stmt, ":pid"), pid);
</span>
<span style="font-family:KaiTi_GB2312;">const char* sqlite3_bind_parameter_name( sqlite3_stmt *stmt, int pidx )</span>
<span style="font-family:KaiTi_GB2312;">int sqlite3_clear_bindings( sqlite3_stmt *stmt )</span>
安全性和性能(Security andPerformance)
<span style="font-family:KaiTi_GB2312;"> snprintf(buf, buf_size,
"INSERT INTO people( id, name ) VALUES ( %d, '%s' );", </span>
<span style="font-family:KaiTi_GB2312;"> id_val = 23; name_val = "Fred";</span>
<span style="font-family:KaiTi_GB2312;"> INSERT INTO people( id, name ) VALUES ( 23, 'Fred');</span>
示例代码
<span style="font-family:KaiTi_GB2312;">char *data = ""; sqlite3_stmt
*stmt = NULL;int idx = -1;rc = sqlite3_prepare_v2( db, "INSERT INTO tbl </span>
潜在的陷阱(PotentialPitfalls)
(1)
<span style="font-family:KaiTi_GB2312;">INSERT INTO membership ( pid, gid, type ) VALUES ( :pid, :gid, :type );</span>
<span style="font-family:KaiTi_GB2312;">INSERT INTO membership ( pid, gid ) VALUES ( :pid, :gid );</span>
(2)另一种容易引起误用的情况是与NULL值的比较。
<span style="font-family:KaiTi_GB2312;">SELECT * FROM employee WHERE manager = :manager;</span>
<span style="font-family:KaiTi_GB2312;">SELECT * FROM employee WHERE manager IS :manager;</span>