当前位置:首页 > 行业动态 > 正文

如何高效地进行C语言数据库的查询与数据保存操作?

数据库查询与保存是数据管理的核心,涉及检索、更新和存储信息以支持决策。

在C语言中,数据库查询与保存是开发过程中不可或缺的一部分,本文将详细介绍如何在C语言中进行数据库查询与保存操作,包括使用第三方库、手动操作文件以及嵌入式数据库等方法。

如何高效地进行C语言数据库的查询与数据保存操作?  第1张

一、使用第三方库

使用第三方库是最常见的数据库操作方法之一,常见的第三方库有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;
}
0