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句柄。