C语言编程实现Access2023数据库操作 (c access2023数据库操作)

随着计算机科学不断发展,数据库技术的应用越发广泛。数据库可以用于数据存储、提供数据访问和处理等方面,是现代信息技术应用的基础之一。C语言作为一门高级编程语言,具有跨平台、高效等优点,在数据库操作上也有着广泛的应用。本文将介绍如何使用,为初学者提供一个简单易懂的教程。

Access2023数据库简介

Access2023是微软公司推出的一款关系型数据库软件,常用于小型企业或个人用户的数据处理和管理。它支持SQL语言,并能实现表格设计、数据索引、查询、报表生成等功能。Access2023采用了基于文件的架构,文件扩展名为.accdb,因此它可以方便地存储在本地计算机上,也可以进行远程访问。

C语言实现Access2023数据库操作

使用C语言实现Access2023数据库操作,需要借助使用了ODBC(Open Database Connectivity)API的ODBC数据存取库。ODBC是一种与平台无关的API,可以在各种操作系统和编程语言中使用。它提供了访问SQL数据库(包括Access2023)的标准接口。

需要在计算机上安装ODBC数据存取库。可以从微软官网下载最新版本的ODBC SDK(https://www.microsoft.com/zh-cn/download/detls.aspx?id=36434)。

编写基本的Access2023数据库连接程序

下面以一个简单的程序为例,演示如何以C语言实现Access2023数据库操作。

“`c

#include

#include

#include

void mn()

{

SQLHENV env;

SQLHDBC dbc;

SQLHSTMT stmt;

SQLRETURN ret;

SQLCHAR *dsn = (SQLCHAR*) “Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=E:\\test.accdb”;

SQLCHAR user[1024] = “”;

SQLCHAR pswd[1024] = “”;

SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);

SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);

SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);

SQLDriverConnect(dbc, NULL, dsn, SQL_NTS, user, sizeof(user), pswd, sizeof(pswd));

SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);

SQLExecDirect(stmt, (SQLCHAR*)”select * from t1″, SQL_NTS);

int id, age;

char name[1024] = “”;

while (SQLFetch(stmt) != SQL_NO_DATA)

{

SQLGetData(stmt, 1, SQL_C_LONG, &id, 0, 0);

SQLGetData(stmt, 2, SQL_C_CHAR, &name, 1024, 0);

SQLGetData(stmt, 3, SQL_C_LONG, &age, 0, 0);

printf(“id=%d, name=%s, age=%d\n”, id, name, age);

}

SQLFreeHandle(SQL_HANDLE_STMT, stmt);

SQLDisconnect(dbc);

SQLFreeHandle(SQL_HANDLE_DBC, dbc);

SQLFreeHandle(SQL_HANDLE_ENV, env);

}

“`

以上程序使用了ODBC API,通过SQLDriverConnect函数连接了Access2023数据库,并执行了一条查询语句,从t1表中获取所有数据,并逐行输出。

在编译运行时,需要加上ODBC库的依赖项,在VS中可以在项目属性中的链接器->输入->附加依赖项中加入odbc32.lib文件。

Access2023数据库操作实例程序

下面,我们来看一个更完整的例子。

假设现在有一个存储学生信息的Access2023数据库,包含一张名为student的表:

id | name | age

—|——|—

1 | John | 18

2 | Amy | 20

3 | Peter| 19

我们可以用以下的C语言代码,实现对该表的查询、插入、修改、删除等操作。

“`c

#include

#include

#include

#include

void insert_student(SQLHENV env, SQLHDBC dbc, SQLCHAR name[], int age)

{

SQLHSTMT stmt;

SQLRETURN ret;

SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);

SQLPrepare(stmt, (SQLCHAR*)”insert into student(name, age) values(?, ?)”, SQL_NTS);

SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 1024, 0, name, 0, NULL);

SQLBindParameter(stmt, 2, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &age, 0, NULL);

SQLExecute(stmt);

SQLFreeHandle(SQL_HANDLE_STMT, stmt);

}

void update_student(SQLHENV env, SQLHDBC dbc, int id, SQLCHAR name[], int age)

{

SQLHSTMT stmt;

SQLRETURN ret;

SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);

SQLPrepare(stmt, (SQLCHAR*)”update student set name=?, age=? where id=?”, SQL_NTS);

SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 1024, 0, name, 0, NULL);

SQLBindParameter(stmt, 2, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &age, 0, NULL);

SQLBindParameter(stmt, 3, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &id, 0, NULL);

SQLExecute(stmt);

SQLFreeHandle(SQL_HANDLE_STMT, stmt);

}

void delete_student(SQLHENV env, SQLHDBC dbc, int id)

{

SQLHSTMT stmt;

SQLRETURN ret;

SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);

SQLPrepare(stmt, (SQLCHAR*)”delete from student where id=?”, SQL_NTS);

SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &id, 0, NULL);

SQLExecute(stmt);

SQLFreeHandle(SQL_HANDLE_STMT, stmt);

}

void print_student(SQLHENV env, SQLHDBC dbc, SQLHSTMT stmt)

{

SQLRETURN ret;

int id, age;

char name[1024] = “”;

printf(“id | name | age\n”);

printf(“—|——|—\n”);

while (SQLFetch(stmt) != SQL_NO_DATA)

{

SQLGetData(stmt, 1, SQL_C_LONG, &id, 0, 0);

SQLGetData(stmt, 2, SQL_C_CHAR, &name, 1024, 0);

SQLGetData(stmt, 3, SQL_C_LONG, &age, 0, 0);

printf(“%2d | %4s | %2d\n”, id, name, age);

}

}

void select_all_students(SQLHENV env, SQLHDBC dbc)

{

SQLHSTMT stmt;

SQLRETURN ret;

SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);

SQLExecDirect(stmt, (SQLCHAR*)”select * from student”, SQL_NTS);

print_student(env, dbc, stmt);

SQLFreeHandle(SQL_HANDLE_STMT, stmt);

}

void select_students_by_name(SQLHENV env, SQLHDBC dbc, char name[])

{

SQLHSTMT stmt;

SQLRETURN ret;

SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);

SQLPrepare(stmt, (SQLCHAR*)”select * from student where name=?”, SQL_NTS);

SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 1024, 0, name, 0, NULL);

SQLExecute(stmt);

print_student(env, dbc, stmt);

SQLFreeHandle(SQL_HANDLE_STMT, stmt);

}

void select_students_by_age(SQLHENV env, SQLHDBC dbc, int age)

{

SQLHSTMT stmt;

SQLRETURN ret;

SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);

SQLPrepare(stmt, (SQLCHAR*)”select * from student where age=?”, SQL_NTS);

SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &age, 0, NULL);

SQLExecute(stmt);

print_student(env, dbc, stmt);

SQLFreeHandle(SQL_HANDLE_STMT, stmt);

}

int mn()

{

SQLHENV env;

SQLHDBC dbc;

SQLRETURN ret;

SQLCHAR *dsn = (SQLCHAR*) “Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=F:\\test.accdb”;

SQLCHAR user[1024] = “”;

SQLCHAR pswd[1024] = “”;

SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);

SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);

SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);

SQLDriverConnect(dbc, NULL, dsn, SQL_NTS, user, sizeof(user), pswd, sizeof(pswd));

insert_student(env, dbc, (SQLCHAR*)”Lucy”, 19);

update_student(env, dbc, 1, (SQLCHAR*)”Tom”, 20);

delete_student(env, dbc, 2);

select_all_students(env, dbc);

select_students_by_name(env, dbc, “Tom”);

select_students_by_age(env, dbc, 19);

SQLDisconnect(dbc);

SQLFreeHandle(SQL_HANDLE_DBC, dbc);

SQLFreeHandle(SQL_HANDLE_ENV, env);

return 0;

}

“`

以上程序实现了与Access2023数据库的连接、查询、添加、修改、删除等操作。其中,insert_student、update_student、delete_student三个函数分别实现了将学生信息加入数据库、修改学生信息、根据学生id删除学生信息的功能。同时,select_all_students、select_students_by_name、select_students_by_age三个函数则实现了获取所有学生信息、根据学生姓名、年龄查询学生信息的功能。

对于select_all_students、select_students_by_name、select_students_by_age三个函数,它们首先通过SQLExecDirect或SQLPrepare和SQLExecute函数执行一条查询语句,然后调用print_student函数输出结果。print_student函数在指针stmt所指向的结果集中获取每一行的数据,逐行输出到屏幕上。

本文介绍了如何使用。通过使用ODBC API和ODBC数据存取库,可以在C语言程序中连接Access2023数据库,执行各种增删改查操作。在编写程序时,需要熟悉ODBC的基本语法和API函数,熟悉数据库的结构和操作语句。同时,需要注意内存泄漏问题,通过SQLFreeHandle函数释放已经分配的ODBC句柄。


数据运维技术 » C语言编程实现Access2023数据库操作 (c access2023数据库操作)