在C语言中,数据库查询与保存是开发过程中不可或缺的一部分,本文将详细介绍如何在C语言中进行数据库查询与保存操作,包括使用第三方库、手动操作文件以及嵌入式数据库等方法。
使用第三方库是最常见的数据库操作方法之一,常见的第三方库有SQLite、MySQL和PostgreSQL,这里以SQLite为例,详细介绍如何在C语言中使用SQLite来保存和操作数据库。
1. 安装SQLite库
需要下载并安装SQLite库,SQLite官方网站提供了最新的库文件和安装包,下载后,按照指示进行安装,并将库文件配置到开发环境中。
2. 包含SQLite头文件
在C语言代码中,需要包含SQLite的头文件sqlite3.h
:
#include <sqlite3.h>
#include <stdio.h>
#include <stdlib.h>
3. 初始化SQLite数据库
在使用SQLite之前,需要初始化数据库并打开一个数据库连接:
sqlite3 *db;
int rc = sqlite3_open("test.db", &db);
if (rc) {
fprintf(stderr, "Can't open database: %s
", sqlite3_errmsg(db));
return(0);
} else {
fprintf(stderr, "Opened database successfully
");
}
4. 创建表
在数据库中创建表是保存数据的第一步,可以使用SQL语句来创建表:
char *sql = "CREATE TABLE COMPANY("
"ID INT PRIMARY KEY NOT NULL,"
"NAME TEXT NOT NULL,"
"AGE INT NOT NULL,"
"ADDRESS CHAR(50),"
"SALARY REAL );";
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL error: %s
", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Table created successfully
");
}
5. 插入数据
插入数据到表中是保存数据的重要步骤,可以使用SQL INSERT语句来插入数据:
sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "
"VALUES (1, 'Paul', 32, 'California', 20000.00 ); "
"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "
"VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); ";
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL error: %s
", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Records created successfully
");
}
6. 查询数据
查询数据是从数据库中获取数据的过程,可以使用SQL SELECT语句来查询数据:
sql = "SELECT * from COMPANY";
rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL error: %s
", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Operation done successfully
");
}
7. 关闭数据库连接
完成所有操作后,记得关闭数据库连接以释放资源:
sqlite3_close(db);
手动操作文件是另一种保存数据的方法,尽管这种方法不如使用数据库灵活和高效,但在某些简单的应用场景中仍然适用。
1. 打开文件
需要打开一个文件来保存数据:
FILE *fp;
fp = fopen("data.txt", "w+");
if (fp == NULL) {
fprintf(stderr, "Can't open file
");
return 1;
}
2. 写入数据
将数据写入文件:
fprintf(fp, "ID: %d
", id);
fprintf(fp, "Name: %s
", name);
fprintf(fp, "Age: %d
", age);
fprintf(fp, "Address: %s
", address);
fprintf(fp, "Salary: %f
", salary);
3. 读取数据
从文件中读取数据:
fscanf(fp, "ID: %d
", &id);
fscanf(fp, "Name: %s
", name);
fscanf(fp, "Age: %d
", &age);
fscanf(fp, "Address: %s
", address);
fscanf(fp, "Salary: %f
", &salary);
4. 关闭文件
完成读写操作后,关闭文件:
fclose(fp);
嵌入式数据库如Berkeley DB和LevelDB是保存数据的另一种方式,嵌入式数据库具有高性能、低资源消耗的特点,适用于嵌入式系统和高性能应用。
1. 安装嵌入式数据库
下载并安装嵌入式数据库,以Berkeley DB为例,可以从Oracle官方网站下载最新版本,并按照指示进行安装。
2. 包含头文件
在C语言代码中,包含嵌入式数据库的头文件:
#include <db.h>
3. 初始化数据库
初始化嵌入式数据库:
DB *dbp;
int ret;
ret = db_create(&dbp, NULL, 0);
if (ret != 0) {
fprintf(stderr, "db_create: %s
", db_strerror(ret));
return 1;
}
以下是一个完整的示例代码,展示如何在C语言中使用SQLite进行数据库操作:
#include <sqlite3.h>
#include <stdio.h>
#include <stdlib.h>
static int callback(void *NotUsed, int argc, charargv, charazColName){
int i;
for(i = 0; i<argc; i++){
printf("%s = %s
", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("
");
return 0;
}
int main(){
sqlite3 *db;
char *zErrMsg = 0;
int rc;
const char *sql;
/* Open database */
rc = sqlite3_open("test.db", &db);
if( rc ) {
fprintf(stderr, "Can't open database: %s
", sqlite3_errmsg(db));
return(0);
} else {
fprintf(stderr, "Opened database successfully
");
}
/* Create SQL statement */
sql = "CREATE TABLE COMPANY("
"ID INT PRIMARY KEY NOT NULL,"
"NAME TEXT NOT NULL,"
"AGE INT NOT NULL,"
"ADDRESS CHAR(50),"
"SALARY REAL );";
/* Execute SQL statement */
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if( rc != SQLITE_OK ){
fprintf(stderr, "SQL error: %s
", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Table created successfully
");
}
/* Create CompiledStatement that inserts data into the database */
sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "
"VALUES (1, 'Paul', 32, 'California', 20000.00 ); "
"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "
"VALUES (2, 'Allen', 25, 'Texas', 15000.00 );";
/* Execute SQL statement */
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if( rc != SQLITE_OK ){
fprintf(stderr, "SQL error: %s
", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Records created successfully
");
}
/* Create SQL statement to select all records from the database */
sql = "SELECT * from COMPANY";
/* Execute SQL statement */
rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
if( rc != SQLITE_OK ){
fprintf(stderr, "SQL error: %s
", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Operation done successfully
");
}
sqlite3_close(db); // Close database connection before exiting program.
return 0;
}