实验四 数据库接口实验.docx

上传人:牧羊曲112 文档编号:5175297 上传时间:2023-06-11 格式:DOCX 页数:12 大小:280.06KB
返回 下载 相关 举报
实验四 数据库接口实验.docx_第1页
第1页 / 共12页
实验四 数据库接口实验.docx_第2页
第2页 / 共12页
实验四 数据库接口实验.docx_第3页
第3页 / 共12页
实验四 数据库接口实验.docx_第4页
第4页 / 共12页
实验四 数据库接口实验.docx_第5页
第5页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《实验四 数据库接口实验.docx》由会员分享,可在线阅读,更多相关《实验四 数据库接口实验.docx(12页珍藏版)》请在三一办公上搜索。

1、实验四数据库接口实验一11. 实验目的1. 通过实验了解通用数据库应用编程接口 ODBC的基本原理和实现机制,熟悉主要的 ODBC接口的语法和使用方法。2. 利用C语言(或其它支持ODBC接口的高级程序设计语言)编程实现简单的数据库应用 程序,掌握基于ODBC的数据库访问的基本原理和方法。3. 学习java语言,并采用JDBC接口方式对数据库进行访问。2. 实验内容1. 以教科书第四章关于SQL语言相关内容为基础,课后查阅、自学ODBC接口有关内容, 包括ODBC的体系结构、工作原理、数据访问过程、主要API接口的语法和使用方法 等。2. 以实验二建立的学生数据库为基础,编写C语言(或其它支持

2、ODBC接口的高级程序设 计语言)数据库应用程序,按照如下步骤访问数据库(a) Stepl. ODBC初始化,为ODBC分配环境句柄(b) Step2,建立应用程序与ODBC数据源的连接(c) Step3.利用SQLExecDirect语句,实现数据库应用程序对数据库的建立、查询、 修改、删除等操作(d) Step4.检索查询结果集(e) Step5.结束数据库应用程序3. 实验要求1.要求所编写的数据库访问应用程序中使用到以下主要的ODBC API函数:(1) SQLALLocEnv:初始化ODBC环境,返回环境句柄(2) SQLALLocConnect:为连接句柄分配内存并返回连接句柄(3

3、) SQLConnect:连接一个SQL数据资源,连接一个SQL数据资源,允许驱动器向用户询 问信息(4) SQLDriverConnect:(5) SQLALLocStmt:为语句句柄分配内存,并返回语句句柄(6) SQLExecDirect:把SQL语句送到数据库服务器,请求执行由SQL语句定义的数据库访 问(7) SQLFetchAdvances :将游标移动到到查询结果集的下一行(或第一行)(8) SQLGetData:按照游标指向的位置,从查询结果集的特定的一列取回数据(9) SQLFreeStmt:释放与语句句柄相关的资源(10) SQLDisconnect :切断连接(11) S

4、QLFreeConnect :释放与连接句柄相关的资源(12) SQLFreeEnv :释放与环境句柄相关的资源4. 实验环境操作系统:Microsoft Windows 7旗舰版(32位)。数据库版本:MySQL 6.2。ODBC 连接:mysql-connector-odbc-5.3.4-win32.msi5. 实验步骤5.1 ODBC数据源配置(2)系统DSN下,点击“添加”,从“创建新数据源”列表中选择刚安装的驱动。(1)安装mysql-connector-odbc-5.1.11-win32.msi后,在控制面板-管理工具-ODBC数据源管 理器-驱动程序可以看到刚刚装好的mysql驱

5、动。T d 口bc娜速管坦奇Mi eraEoft j l cukL ravrra Dr3v*r WicroEoft Visual FowFra-Ireiber(3)填写数据源的相关配置信息,填好后点击“Test”进行测试,提示connection successful表示连接数据库成功。MySQL Con ncto r/OD BC Dta Source Cun+iguratianConnector/ODBCCancelDEtaih 5.2 ODBC实现方法5.2.1初始化ODBC,获取ODBC环境句柄HENV env;定义环境句柄retcode = SQLAllocEnv(&env);/初始化

6、 ODBC 环境,分配环境句柄 env无论程序将建立多少个ODBC连接,这个过程只需执行一次即可。5.2.2与ODBC数据源建立连接 调用SQLAllocConnect函数获取连接句柄HDBC hdbc;/定义连接句柄retcode = SQLAllocConnect(env, &hdbc); 为连接句柄分配内存并返回连接句柄hdbc 调用SQLConnect函数建立连接/*系统数据源为mysql ODBC,登录用户名为root,密码为krms/retcode = SQLConnect(hdbc, (SQLCHAR*)mysql ODBC, SQL_NTS, (SQLCHAR*)root”,

7、SQL_NTS, (SQLCHAR*), SQL_NTS); 连接一个数据库5.2.3通过连接向ODBC数据库提交SQL语句,实现存取数据 调用SQLAllocStmt函数获取语句句柄。HSTMT hstmt;定义语句句柄retcode = SQLAllocStmt(hdbc, &hstmt);为语句句柄分配内存,并返回语句句柄 调用SQLExecDirect函数执行SQL语句retcode = SQLExecDirect(hstmt, sql_dolisti, SQL_NTS);/把SQL语句送到数据库服务器,请求执行由SQL语句定义的数据库访问5.2.4结束应用程序在应用程序完成数据库操作

8、,退出运行之前,必须释放程序中使用的系统资源。这些系 统资源包括:语句句柄、连接句柄和ODBC环境句柄。完成这个过程的步骤如下: 调用SQLFreeStmt函数释放语句句柄及其相关的系统资源。SQLFreeStmt(hstmt, SQL_DROP);释放与语句句柄相关的资源 调用SQLDisconnect函数关闭连接。SQLDisconnect(hdbc);/切断连接 调用SQLFreeConnect函数释放连接句柄及其相关的系统资源。SQLFreeConnect(hdbc);释放与连接句柄相关的资源 调用SQLFreeEnv函数释放环境句柄及其相关的系统资源,停止ODBC操作。SQLFree

9、Env(env);释放与环境句柄相关的资源5.3程序代码#define _CRT_SECURE_NO_DEPRECATE#include#include#includewindows.h”#includesql.h”#includesqlext.h”#includesqltypes.h”#includeodbcinst.h”#pragma comment(lib,odbc32.lib”)struct course_cellchar cno5;char cname20;int Ihour;int credit;char semester5;struct student_cellchar sno5

10、;char sname20;char sex4;char bdate20;char dept20;char classno10;struct sc_cellchar sno5;char cno5;int grade;unsigned char sql_select3100 = select * from db.course, select * from db.student, select* from db.sc ; /SQL 查询语句unsigned char sql_dolist3100 = insert into db.course values(C10,软件工程,32,2,秋), up

11、date db.course set credit=4 where cno=C10, delete from db.course where cno=C10 ;/插入、修改、删除语句unsigned char do_name310 = insert, update, delete ;unsigned char buff100;void show_course(HDBC hdbc) HSTMT hstmt;RETCODE retcode;long lenOutl, lenOut2, lenOut3, lenOut4, lenOut5; struct course_cell* ccell;ccel

12、l = (struct course_cell*)malloc(sizeof(struct course_cell);retcode = SQLAllocStmt(hdbc, &hstmt);if (retcode = SQL_SUCCESS | retcode = SQL_SUCCESS_WITH_INFO)/SQLBindCol将应用程序的数据缓冲绑定到结果集的各列(语句句柄,结果集绑定的 列号,目标类型,目标值,缓冲区长度,(输入/输出)指向绑定列的长度) retcode = SQLBindCol(hstmt, 1, SQL_C_CHAR, ccell-cno, 5, &lenOut1)

13、;retcode = SQLBindCol(hstmt, 2, SQL_C_CHAR, ccell-cname, 20, &lenOut2);retcode=SQLBindCol(hstmt, 3,SQL_C_SLONG,&ccell-lhour,sizeof(int),&lenOut3);retcode=SQLBindCol(hstmt, 4,SQL_C_SLONG,&ccell-credit,sizeof(int),&lenOut4);retcode = SQLBindCol(hstmt, 5, SQL_C_CHAR, ccell-semester, 5, &lenOut5);retcod

14、e = SQLExecDirect(hstmt, sql_select0, SQL_NTS);/把SQL语句送到数据库服务器,请求执行由SQL语句定义的数据库访问 if (retcode = SQL_SUCCESS | retcode = SQL_SUCCESS_WITH_INFO) printf(db.course is as following:n);printf(n);printf(cnocnamelhourcreditsemestern); retcode = SQLFetch(hstmt); /*SQLFetch fetches the next rowset of data fro

15、m the result set and returns data for all bound columns.相当与 SQLFetchAdvances 和 SQLGetData 两个函数*/ while (retcode = SQL_SUCCESS | retcode = SQL_SUCCESS_WITH_INFO) printf(%-10s%-20s%-15d%-16d%-5sn, ccell-cno, ccell-cname, ccell-lhour, ccell-credit, ccell-semester); retcode = SQLFetch(hstmt); printf(nn)

16、; SQLFreeStmt(hstmt, SQL_DROP);/释放语句句柄 void show_student(HDBC hdbc) char sno5;char sname20;char sex2;char bdate20;char dept20;char classno10;HSTMT hstmt;RETCODE retcode;long lenOut1, lenOut2, lenOut3, lenOut4, lenOut5, lenOut6;struct student_cell* ccell;ccell = (struct student_cell*)malloc(sizeof(st

17、ruct student_cell);retcode = SQLAllocStmt(hdbc, &hstmt);if (retcode = SQL_SUCCESS | retcode = SQL_SUCCESS_WITH_INFO)/SQLBindCol将应用程序的数据缓冲绑定到结果集的各列retcode = SQLBindCol(hstmt, 1, SQL_C_CHAR, ccell-sno, 5, &lenOut1);retcode = SQLBindCol(hstmt, 2, SQL_C_CHAR, ccell-sname, 20, &lenOut2);retcode = SQLBind

18、Col(hstmt, 3, SQL_C_CHAR, &ccell-sex, 4, &lenOut3);retcode = SQLBindCol(hstmt, 4, SQL_C_CHAR, &ccell-bdate, 20, &lenOut4);retcode = SQLBindCol(hstmt, 5, SQL_C_CHAR, ccell-dept, 20, &lenOut5);retcode = SQLBindCol(hstmt, 6, SQL_C_CHAR, ccell-classno, 10, &lenOut6);retcode = SQLExecDirect(hstmt, sql_se

19、lect1, SQL_NTS);/把SQL语句送到数据库服务器,请求执行由SQL语句定义的数据库访问 if (retcode = SQL_SUCCESS | retcode = SQL_SUCCESS_WITH_INFO) printf(db.student is as following:n);printf(n);printf(snosnamesexbdatedept classnon); retcode = SQLFetch(hstmt); /*SQLFetch fetches the next rowset of data from the result set and returns

20、data for all bound columns.相当与 SQLFetchAdvances 和 SQLGetData 两个函数*/ while (retcode = SQL_SUCCESS | retcode = SQL_SUCCESS_WITH_INFO) printf(%-10s%-15s%-10s%-25s%-10s%-15sn, ccell-sno, ccell-sname, ccell-sex, ccell-bdate, ccell-dept,ccell-classno);retcode = SQLFetch(hstmt); printf(nn);SQLFreeStmt(hstm

21、t, SQL_DROP);/释放语句句柄 int main()/1.初始化ODBC,获取ODBC环境句柄HENV env;定义环境句柄HDBC hdbc;定义连接句柄HSTMT hstmt;定义语句句柄RETCODE retcode;/定义返回代码变量int choice = -1;int i = 0;retcode = SQLAllocEnv(&env); /初始化ODBC环境,分配环境句柄/2.与ODBC数据源建立连接if (retcode = SQL_SUCCESS | retcode = SQL_SUCCESS_WITH_INFO)retcode = SQLAllocConnect(e

22、nv, &hdbc); 为连接句柄分配内存并返回连接句柄, 获取连接句柄if (retcode = SQL_SUCCESS | retcode = SQL_SUCCESS_WITH_INFO)retcode = SQLConnect(hdbc, (SQLCHAR*)mysql ODBC, SQL_NTS, (SQLCHAR*)root”, SQL_NTS, (SQLCHAR*), SQL_NTS); 连接一个数据库if (retcode = SQL_SUCCESS | retcode = SQL_SUCCESS_WITH_INFO) while (choice != 0)printf(-请输入

23、操作选项:1.查看课程信息2.查看学生信息3.插入 操作4.修改操作5.删除操作0.退出n);scanf(%d”, &choice);switch (choice)case 1:show_course(hdbc);break;case 2:show_student(hdbc);break;case 3:case 4: case 5:i = choice - 3;retcode = SQLAllocStmt(hdbc, &hstmt); /3.通过连接向 ODBC 数 据库提交SQL语句,实现存取数据为语句句柄分配内存,并返回语句句柄retcode = SQLExecDirect(hstmt,

24、sql_dolisti, SQL_NTS);/把SQL语句送到数据库服务器,请求执行由SQL语句定义的 数据库访问printf(%s , do_namei);if (retcode = SQL_SUCCESS | retcode = SQL_SUCCESS_WITH_INFO) printf(success!nn);else printf(fail!nn);SQLFreeStmt(hstmt, SQL_DROP); 释放与语句句柄相关的资 源show_course(hdbc);/显示操作后的新course内容 break;default:break;SQLDisconnect(hdbc); /

25、切断连接SQLFreeConnect(hdbc);/释放与连接句柄相关的资源 SQLFreeEnv(env);释放与环境句柄相关的资源 system(pause); return 0; 6. 实验结果6.1.查看课程信息I C:U se r5Admin istrato rDe5ktopProject2Deb u gPrqiect2. exe曰.cuuirse土谷侦与 f cllinwirigrs理li成 e屋有机 m译荒UA算 cn编誓JA计Uio ur5151514636富曜入伊魅巩1 置看谋天呈隹息 L查看学上信息 3.插入操作 牝廖小操作 L删纭.主i谚风1 一查看评程信息 一查看学生信

26、息l括A那作 虻修改操作 删馀6.2插入操作执行语句:insert into db.course values(C10,软件工程,32,2,秋)|A:棋膺顶.查看课程信息A查看学生信息3 一插入操作4一修改操作删除 B insert success?ah.course is as follouing:Ihoui*51516.3修改操作执行语句:update db.course set credit=4 where cno=C10,将 cno 为 C10 的课程学分更改为4分。Liudftte6.4删除操作执行语句:delete from db.course where cno=C10,将 cn

27、o 为 C10 的课程删除编径原理皿看课程信息蠢*生信息私插入腓件改操作硼除delete success?db.coui*se is as following:cnok i r乎h虬 半置满霖理Iho ui、semestei*6.5退出请按任意键批续.黔辱魅巩 L查看理程信息A查看学生信息3.插入兼作4修改操作 顽除6.6解决问题第一次运行成功时的汉字显示为?,原因为导入的是txt格式,不是sql。解决方法是 更改ODBC数据源的编码格式。MQL Conrecto7OD5C Data Source ConfigLirationMljSQL?.Connector/0 DBCCanneciion

28、FaranietErsDq-j Sou-ze None;脚叩 CCECDMCTlpOon: MysqD CDBCijaj ICPilP Server! loEalbcitPart: 3306 Nand Pipe:Lleer: rwtPassword:Ddtdtrae: db/ TestComstiwi Mradata | CirsQrKiJtE; | Debug sa_ | Mec|P| Allow lag result sets Can Handle Expired PweewoE-1 Lte corrprEssionHEr-dble Cleartext iVithenbcation.亍由e

29、 automatic recannectI | Dant prDTipt when aonnecngAlhrt multide statementsIrjlnreradive clientCharacter Set: qb2312/Initial Statement!DetailsOKCancelHelp7. 实验小结首先创建了 ODBC数据源,与数据库进行连接,然后按照以下步骤进行代码编写:1. 初始化ODBC,获取ODBC环境句柄2. 与ODBC数据源建立连接3. 通过连接向ODBC数据库提交SQL语句,实现存取数据4. 结束应用程序,释放连接需要提交的SQL语句实现存放在数组中,在第三步通过语句句柄提交执行,也可以仅 分配内存空间,输入sql语句,再执行。通过这次实验,我了解了数据库应用编程接口 ODBC的基本原理和实现机制,并对 MySQL中的ODBC的使用和ODBC接口的语法和函数等有了进一步的了解。还通过在VS 中编写C语言程序实现简单的数据库应用程序,较好地掌握基于ODBC的数据库访问的基 本原理和方法,在实践中较好的掌握ODBC相关知识。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号