在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;
}
}
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,并提供相应的驱动程序和库。