您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > 实验四数据库接口实验
实验四数据库接口实验-11.实验目的1.通过实验了解通用数据库应用编程接口ODBC的基本原理和实现机制,熟悉主要的ODBC接口的语法和使用方法。2.利用C语言(或其它支持ODBC接口的高级程序设计语言)编程实现简单的数据库应用程序,掌握基于ODBC的数据库访问的基本原理和方法。3.学习java语言,并采用JDBC接口方式对数据库进行访问。2.实验内容1.以教科书第四章关于SQL语言相关内容为基础,课后查阅、自学ODBC接口有关内容,包括ODBC的体系结构、工作原理、数据访问过程、主要API接口的语法和使用方法等。2.以实验二建立的学生数据库为基础,编写C语言(或其它支持ODBC接口的高级程序设计语言)数据库应用程序,按照如下步骤访问数据库(a)Step1.ODBC初始化,为ODBC分配环境句柄(b)Step2.建立应用程序与ODBC数据源的连接(c)Step3.利用SQLExecDirect语句,实现数据库应用程序对数据库的建立、查询、修改、删除等操作(d)Step4.检索查询结果集(e)Step5.结束数据库应用程序3.实验要求1.要求所编写的数据库访问应用程序中使用到以下主要的ODBCAPI函数:(1)SQLALLocEnv:初始化ODBC环境,返回环境句柄(2)SQLALLocConnect:为连接句柄分配内存并返回连接句柄(3)SQLConnect:连接一个SQL数据资源,连接一个SQL数据资源,允许驱动器向用户询问信息(4)SQLDriverConnect:(5)SQLALLocStmt:为语句句柄分配内存,并返回语句句柄(6)SQLExecDirect:把SQL语句送到数据库服务器,请求执行由SQL语句定义的数据库访问(7)SQLFetchAdvances:将游标移动到到查询结果集的下一行(或第一行)(8)SQLGetData:按照游标指向的位置,从查询结果集的特定的一列取回数据(9)SQLFreeStmt:释放与语句句柄相关的资源(10)SQLDisconnect:切断连接(11)SQLFreeConnect:释放与连接句柄相关的资源(12)SQLFreeEnv:释放与环境句柄相关的资源4.实验环境操作系统:MicrosoftWindows7旗舰版(32位)。数据库版本:MySQL6.2。ODBC连接:mysql-connector-odbc-5.3.4-win32.msi5.实验步骤5.1ODBC数据源配置(1)安装mysql-connector-odbc-5.1.11-win32.msi后,在控制面板-管理工具-ODBC数据源管理器-驱动程序可以看到刚刚装好的mysql驱动。(2)系统DSN下,点击“添加”,从“创建新数据源”列表中选择刚安装的驱动。(3)填写数据源的相关配置信息,填好后点击“Test”进行测试,提示connectionsuccessful表示连接数据库成功。5.2ODBC实现方法5.2.1初始化ODBC,获取ODBC环境句柄HENVenv;//定义环境句柄retcode=SQLAllocEnv(&env);//初始化ODBC环境,分配环境句柄env无论程序将建立多少个ODBC连接,这个过程只需执行一次即可。5.2.2与ODBC数据源建立连接①调用SQLAllocConnect函数获取连接句柄HDBChdbc;//定义连接句柄retcode=SQLAllocConnect(env,&hdbc);//为连接句柄分配内存并返回连接句柄hdbc②调用SQLConnect函数建立连接/*系统数据源为mysqlODBC,登录用户名为root,密码为krms/retcode=SQLConnect(hdbc,(SQLCHAR*)mysqlODBC,SQL_NTS,(SQLCHAR*)root,SQL_NTS,(SQLCHAR*),SQL_NTS);//连接一个数据库5.2.3通过连接向ODBC数据库提交SQL语句,实现存取数据①调用SQLAllocStmt函数获取语句句柄。HSTMThstmt;//定义语句句柄retcode=SQLAllocStmt(hdbc,&hstmt);//为语句句柄分配内存,并返回语句句柄②调用SQLExecDirect函数执行SQL语句retcode=SQLExecDirect(hstmt,sql_dolist[i],SQL_NTS);//把SQL语句送到数据库服务器,请求执行由SQL语句定义的数据库访问5.2.4结束应用程序在应用程序完成数据库操作,退出运行之前,必须释放程序中使用的系统资源。这些系统资源包括:语句句柄、连接句柄和ODBC环境句柄。完成这个过程的步骤如下:①调用SQLFreeStmt函数释放语句句柄及其相关的系统资源。SQLFreeStmt(hstmt,SQL_DROP);//释放与语句句柄相关的资源②调用SQLDisconnect函数关闭连接。SQLDisconnect(hdbc);//切断连接③调用SQLFreeConnect函数释放连接句柄及其相关的系统资源。SQLFreeConnect(hdbc);//释放与连接句柄相关的资源④调用SQLFreeEnv函数释放环境句柄及其相关的系统资源,停止ODBC操作。SQLFreeEnv(env);//释放与环境句柄相关的资源5.3程序代码#define_CRT_SECURE_NO_DEPRECATE#includestdio.h#includestdlib.h#includewindows.h#includesql.h#includesqlext.h#includesqltypes.h#includeodbcinst.h#pragmacomment(lib,odbc32.lib)structcourse_cell{charcno[5];charcname[20];intlhour;intcredit;charsemester[5];};structstudent_cell{charsno[5];charsname[20];charsex[4];charbdate[20];chardept[20];charclassno[10];};structsc_cell{charsno[5];charcno[5];intgrade;};unsignedcharsql_select[3][100]={select*fromdb.course,select*fromdb.student,select*fromdb.sc};//SQL查询语句unsignedcharsql_dolist[3][100]={insertintodb.coursevalues('C10','软件工程',32,2,'秋'),updatedb.coursesetcredit='4'wherecno='C10',deletefromdb.coursewherecno='C10'};//插入、修改、删除语句unsignedchardo_name[3][10]={insert,update,delete};unsignedcharbuff[100];voidshow_course(HDBChdbc)//显示course的内容{HSTMThstmt;RETCODEretcode;longlenOut1,lenOut2,lenOut3,lenOut4,lenOut5;structcourse_cell*ccell;ccell=(structcourse_cell*)malloc(sizeof(structcourse_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);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);retcode=SQLExecDirect(hstmt,sql_select[0],SQL_NTS);//把SQL语句送到数据库服务器,请求执行由SQL语句定义的数据库访问if(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO){printf(db.courseisasfollowing:\n);printf(----------------------------------------------------------------\n);printf(cnocnamelhourcreditsemester\n);retcode=SQLFetch(hstmt);/*SQLFetchfetchesthenextrowsetofdatafromtheresultsetandreturnsdataforallboundcolumns.相当与SQLFetchAdvances和SQLGetData两个函数*/while(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO){printf(%-10s%-20s%-15d%-16d%-5s\n,ccell-cno,ccell-cname,ccell-lhour,ccell-credit,ccell-semester);retcode=SQLFetch(hstmt);}printf(----------------------------------------------------------------\n\n);}}SQLFreeStmt(hstmt,SQL_DROP);//释放语句句柄}voidshow_student(HDBChdbc)//显示course的内容{charsno[5];charsname[20];charsex[2];charbdate[20];chardept[20];charclassno[10];HSTMThstmt;RETCODEretcode;longlenOut1,lenOut2,lenOut3,lenOut4,lenOut5,lenOut6;structstudent_cell*ccell;ccell=(structstudent_cell*)malloc(sizeof(structstudent_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=SQLBindCol(hstmt,3,SQL_C_CHAR,&ccell-sex,4,&lenOut3);
本文标题:实验四数据库接口实验
链接地址:https://www.777doc.com/doc-2459792 .html