阅读量:0
在Linux编程中,Curd(创建、读取、更新、删除)操作是数据库交互的基础。以下是一个使用C语言和SQLite数据库进行CRUD操作的简单示例,遵循了一些最佳实践:
- 连接数据库:使用
sqlite3_open
函数连接到SQLite数据库。确保检查返回值以处理可能的错误。
#include <sqlite3.h> int main() { sqlite3 *db; char *errorMessage = 0; int connection; connection = sqlite3_open("test.db", &db); if (connection) { fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db)); return 0; } }
- 执行SQL查询:使用
sqlite3_exec
函数执行SQL命令。这个函数可以执行任何有效的SQL语句,但通常建议使用预处理语句以提高安全性。
char *sql = "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, email TEXT NOT NULL);"; connection = sqlite3_exec(db, sql, 0, 0, &errorMessage); if (connection != SQLITE_OK) { fprintf(stderr, "SQL错误: %s\n", errorMessage); sqlite3_free(errorMessage); }
- 预处理语句:使用
sqlite3_prepare_v2
函数准备SQL语句,并使用sqlite3_bind_*
函数绑定参数。这有助于防止SQL注入攻击。
char *sql = "INSERT INTO users (name, email) VALUES (?, ?);"; sqlite3_stmt *statement; connection = sqlite3_prepare_v2(db, sql, -1, &statement, 0); if (connection != SQLITE_OK) { fprintf(stderr, "SQL错误: %s\n", sqlite3_errmsg(db)); return 0; } sqlite3_bind_text(statement, 1, "John Doe", -1, SQLITE_STATIC); sqlite3_bind_text(statement, 2, "john.doe@example.com", -1, SQLITE_STATIC); connection = sqlite3_step(statement); if (connection != SQLITE_DONE) { fprintf(stderr, "SQL错误: %s\n", sqlite3_errmsg(db)); } sqlite3_finalize(statement);
- 查询数据:使用
sqlite3_prepare_v2
和sqlite3_step
函数执行SELECT查询,并使用sqlite3_column_*
函数获取结果。
sql = "SELECT * FROM users;"; statement = 0; connection = sqlite3_prepare_v2(db, sql, -1, &statement, 0); if (connection != SQLITE_OK) { fprintf(stderr, "SQL错误: %s\n", sqlite3_errmsg(db)); return 0; } while ((connection = sqlite3_step(statement)) == SQLITE_ROW) { int id = sqlite3_column_int(statement, 0); const char *name = sqlite3_column_text(statement, 1); const char *email = sqlite3_column_text(statement, 2); printf("ID: %d, Name: %s, Email: %s\n", id, name, email); } if (connection != SQLITE_DONE) { fprintf(stderr, "SQL错误: %s\n", sqlite3_errmsg(db)); } sqlite3_finalize(statement);
- 更新数据:使用
sqlite3_prepare_v2
、sqlite3_bind_*
和sqlite3_step
函数执行UPDATE语句。
sql = "UPDATE users SET email = ? WHERE id = ?;"; statement = 0; connection = sqlite3_prepare_v2(db, sql, -1, &statement, 0); if (connection != SQLITE_OK) { fprintf(stderr, "SQL错误: %s\n", sqlite3_errmsg(db)); return 0; } sqlite3_bind_text(statement, 1, "new.email@example.com", -1, SQLITE_STATIC); sqlite3_bind_int(statement, 2, 1); connection = sqlite3_step(statement); if (connection != SQLITE_DONE) { fprintf(stderr, "SQL错误: %s\n", sqlite3_errmsg(db)); } sqlite3_finalize(statement);
- 删除数据:使用
sqlite3_prepare_v2
、sqlite3_bind_*
和sqlite3_step
函数执行DELETE语句。
sql = "DELETE FROM users WHERE id = ?;"; statement = 0; connection = sqlite3_prepare_v2(db, sql, -1, &statement, 0); if (connection != SQLITE_OK) { fprintf(stderr, "SQL错误: %s\n", sqlite3_errmsg(db)); return 0; } sqlite3_bind_int(statement, 1, 1); connection = sqlite3_step(statement); if (connection != SQLITE_DONE) { fprintf(stderr, "SQL错误: %s\n", sqlite3_errmsg(db)); } sqlite3_finalize(statement);
- 关闭数据库连接:使用
sqlite3_close
函数关闭数据库连接。
sqlite3_close(db);
这个示例展示了如何在Linux编程中使用C语言和SQLite数据库执行基本的CRUD操作,同时遵循了一些最佳实践,如错误处理、参数绑定和使用预处理语句。在实际应用中,你可能需要根据具体需求调整代码,例如添加更多的错误检查、使用连接池管理数据库连接等。此外,对于生产环境,建议使用更高级的数据库管理系统,如PostgreSQL或MySQL,并提供相应的驱动程序和库。