如何编写sql语句和绑定参数?
How to prepare sql statements and bind parameters?
不幸的是,documentation 完全没有示例(真奇怪),好像它假定所有读者都是优秀的程序员。然而,我是 C++
的新手,无法从文档中真正弄清楚如何真正准备和执行语句。我喜欢它在 PDO
for PHP
中的实现方式。通常,我只是这样做:
$s = $db->prepare("SELECT id FROM mytable WHERE id = :id");
$s->bindParam(':id', $id);
$s->execute();
或使用 ?
个代币:
$data = array();
$data[] = 1;
$data[] = 2;
$s = $db->prepare("SELECT id FROM mytable WHERE id = ? or id = ?");
$s->execute($data);
现在,我手上有C++
和sqlite3.h
。此时此刻,我知道如何连接到数据库 - 我这样做并且没有出现错误:
sqlite3 * conn;
int rc = sqlite3_open(db_name, &conn);
请给出一些关于如何实现 PDO
在 PHP
中所做的类似事情的说明(带有清晰的小示例)- 使用命名参数和使用 ?
标记准备一个语句.
您可以在此处找到大量文档:sqlite.org
此示例未详细解释 sqlite3
函数调用和参数,因为要涵盖的信息相当多 - 请参阅给定的 link 以获得更深入的详细信息。
此示例多次将值绑定到问题中的语句,并在每次绑定后读取所有查询结果:
sqlite3* conn;
sqlite3_stmt* stmt = 0;
int rc = sqlite3_open(db_name, &conn);
// Good idea to always check the return value of sqlite3 function calls.
// Only done once in this example:
if ( rc != SQLITE_OK ) { // Do something }
rc = sqlite3_prepare_v2( conn, "SELECT id FROM myTable WHERE id = ? or id = ?", -1, &stmt, 0 );
// Optional, but will most likely increase performance.
rc = sqlite3_exec( conn, "BEGIN TRANSACTION", 0, 0, 0 );
for ( int bindIndex = 0; bindIndex < number_of_times_you_wish_to_bind; bindIndex++ ) {
// Binding integer values in this example.
// Bind functions for other data-types are available - see end of post.
// Bind-parameter indexing is 1-based.
rc = sqlite3_bind_int( stmt, 1, int_you_wish_to_bind ); // Bind first parameter.
rc = sqlite3_bind_int( stmt, 2, int_you_wish_to_bind ); // Bind second parameter.
// Reading interger results in this example.
// Read functions for other data-types are available - see end of post.
while ( sqlite3_step( stmt ) == SQLITE_ROW ) { // While query has result-rows.
// In your example the column count will be 1.
for ( int colIndex = 0; colIndex < sqlite3_column_count( stmt ); colIndex++ ) {
int result = sqlite3_column_int( stmt, colIndex );
// Do something with the result.
}
}
// Step, Clear and Reset the statement after each bind.
rc = sqlite3_step( stmt );
rc = sqlite3_clear_bindings( stmt );
rc = sqlite3_reset( stmt );
}
char *zErrMsg = 0; // Can perhaps display the error message if rc != SQLITE_OK.
rc = sqlite3_exec( conn, "END TRANSACTION", 0, 0, &zErrMsg ); // End the transaction.
rc = sqlite3_finalize( stmt ); // Finalize the prepared statement.
据我从 http://hoogli.com/items/Avoid_sqlite3_clear_bindings().html 中了解到,在这种情况下,步骤 rc = sqlite3_clear_bindings( stmt );
不是必需的。
不幸的是,我还不能 post 将此作为对先前非常好的答案的评论。
不幸的是,documentation 完全没有示例(真奇怪),好像它假定所有读者都是优秀的程序员。然而,我是 C++
的新手,无法从文档中真正弄清楚如何真正准备和执行语句。我喜欢它在 PDO
for PHP
中的实现方式。通常,我只是这样做:
$s = $db->prepare("SELECT id FROM mytable WHERE id = :id");
$s->bindParam(':id', $id);
$s->execute();
或使用 ?
个代币:
$data = array();
$data[] = 1;
$data[] = 2;
$s = $db->prepare("SELECT id FROM mytable WHERE id = ? or id = ?");
$s->execute($data);
现在,我手上有C++
和sqlite3.h
。此时此刻,我知道如何连接到数据库 - 我这样做并且没有出现错误:
sqlite3 * conn;
int rc = sqlite3_open(db_name, &conn);
请给出一些关于如何实现 PDO
在 PHP
中所做的类似事情的说明(带有清晰的小示例)- 使用命名参数和使用 ?
标记准备一个语句.
您可以在此处找到大量文档:sqlite.org
此示例未详细解释 sqlite3
函数调用和参数,因为要涵盖的信息相当多 - 请参阅给定的 link 以获得更深入的详细信息。
此示例多次将值绑定到问题中的语句,并在每次绑定后读取所有查询结果:
sqlite3* conn;
sqlite3_stmt* stmt = 0;
int rc = sqlite3_open(db_name, &conn);
// Good idea to always check the return value of sqlite3 function calls.
// Only done once in this example:
if ( rc != SQLITE_OK ) { // Do something }
rc = sqlite3_prepare_v2( conn, "SELECT id FROM myTable WHERE id = ? or id = ?", -1, &stmt, 0 );
// Optional, but will most likely increase performance.
rc = sqlite3_exec( conn, "BEGIN TRANSACTION", 0, 0, 0 );
for ( int bindIndex = 0; bindIndex < number_of_times_you_wish_to_bind; bindIndex++ ) {
// Binding integer values in this example.
// Bind functions for other data-types are available - see end of post.
// Bind-parameter indexing is 1-based.
rc = sqlite3_bind_int( stmt, 1, int_you_wish_to_bind ); // Bind first parameter.
rc = sqlite3_bind_int( stmt, 2, int_you_wish_to_bind ); // Bind second parameter.
// Reading interger results in this example.
// Read functions for other data-types are available - see end of post.
while ( sqlite3_step( stmt ) == SQLITE_ROW ) { // While query has result-rows.
// In your example the column count will be 1.
for ( int colIndex = 0; colIndex < sqlite3_column_count( stmt ); colIndex++ ) {
int result = sqlite3_column_int( stmt, colIndex );
// Do something with the result.
}
}
// Step, Clear and Reset the statement after each bind.
rc = sqlite3_step( stmt );
rc = sqlite3_clear_bindings( stmt );
rc = sqlite3_reset( stmt );
}
char *zErrMsg = 0; // Can perhaps display the error message if rc != SQLITE_OK.
rc = sqlite3_exec( conn, "END TRANSACTION", 0, 0, &zErrMsg ); // End the transaction.
rc = sqlite3_finalize( stmt ); // Finalize the prepared statement.
据我从 http://hoogli.com/items/Avoid_sqlite3_clear_bindings().html 中了解到,在这种情况下,步骤 rc = sqlite3_clear_bindings( stmt );
不是必需的。
不幸的是,我还不能 post 将此作为对先前非常好的答案的评论。