1、北京邮电大学实验报告课程名称 数据库系统原理实验内容 实验四数据库接口实验班级 2012211314 姓名 韩植/吴梦指导老师 卢向群 成绩_2015 年 4 月 26 日实验目的1通过实验了解通用数据库应用编程接口 ODBC 的基本原理和实现机制,熟悉主要的 ODBC 接口的语法和使用方法;2利用 C 语言(或其它支持 ODBC 接口的高级程序设计语言)编程实现简单的数据库应用程序,掌握基于 ODBC 的数据库访问的基本原理和方法。3尝试使用 SQL Server 上的工具以特定格式导出数据,初步了解现代程序设计辅助工具的使用,加深对接口和数据库与外界的联系的认识。实验内容本实验内容主要是如
2、何通过数据库接口访问(包括增、删、改)数据库中的数据。要求能够通过编写程序或者使用 SQL Server 工具访问到数据。该实验的重点在于 ODBC 数据源配置和工具使用,而不在于编写有一定复杂度的程序。实验环境C/S 结构,SQL Server 企业版服务器及客户端。数据库存储在服务器上,表和视图定义也存储在服务器上,但同学通过网络使用客户端连接到服务器上进行操作。实验步骤1. 实验准备:(a) 以教科书第四章关于 SQL 语言相关内容为基础,课后查阅、自学 ODBC 接口有关内容,包括 ODBC 的体系结构、工作原理、数据访问过程、主要 API 接口的语法和使用方法等。(b) 以实验二建立
3、的数据库为基础,编写 C 语言(或其它支持ODBC 接口的高级程序设计语言) 数据库应用程序,按照如下步骤访问数据库i. Step1. ODBC 初始化,为 ODBC 分配环境句柄ii. Step2. 建立应用程序与 ODBC 数据源的连接iii. Step3. 利用 SQLExecDirect 语句,实现数据库应用程序对数据库中表(有数据)进行数据查询、修改、删除、插入等操作。要求先打印出所有记录,然后删除一行,再打印一次,进行修改,再打印一次,最后插入,再打印一次。iv. Step4. 结束数据库应用程序 因为这不是程序设计练习,所以只针对一张表就可以了。我们也不要求做出很好的界面,和允许
4、用户选择如何操作数据,只要是完成基本功能就可以了。2. 在 Windows 控制面板中通过管理工具下的 ODBC 数据源工具在客户端新建连接到 SQL Server 服务器的 ODBC 数据源,测试通过后保存,注意名字要和应用程序中引用的数据源一样。3. 编译程序并调试通过。4. 利用数据库管理工具中的 Web 向导,创建一个查询 MS 表的信息网页。实验要求1要求所编写的数据库访问应用程序中使用到以下主要的 ODBC API 函数:(1)SQLALLocEnv:初始化 ODBC 环境,返回环境句柄(2)SQLALLocConnect:为连接句柄分配内存并返回连接句柄(3)SQLConnect
5、:连接一个 SQL 数据资源 (4) SQLDriverConnect连接一个 SQL 数据资源,允许驱动器向用户询问信息 (5) SQLALLocStmt为语句句柄分配内存, 并返回语句句柄(6) SQLExecDirect把 SQL 语句送到数据库服务器,请求执行由 SQL 语句定义的数据库访问(7) SQLFetchAdvances将游标移动到到查询结果集的下一行(或第一行)(8) SQLGetData 按照游标指向的位置,从查询结果集的特定的一列取回数据(9) SQLFreeStmt释放与语句句柄相关的资源(10) SQLDisconnect 切断连接(11) SQLFreeConne
6、ct 释放与连接句柄相关的资源(12) SQLFreeEnv 释放与环境句柄相关的资源实验结果与分析1、数据源的设置数据源测试成功2、用编译器进行程序编写PC 为 win8.1 系统,因兼容问题使用 VS2012 编译器代码如下:#include #include #include #include “sql.h“ #include “sqltypes.h“ #include “sqlext.h“ RETCODE retcode;/结果返回集 SQLHDBC hdbc;/定义链接句柄 void print();/打印子程序 void SQL(unsigned char);/执行 SQL 语句子
7、程序 int main() SQLHANDLE henv; /定义环境句柄 unsigned char SY=“hz“;/ODBC 数据源名称 /unsigned char db2=“sa“;/用户名 /unsigned char pass=“HZ1994 “;/密码 /分配 ODBC 环境retcode=SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, if(retcode=SQL_SUCCESS|retcode=SQL_SUCCESS_WITH_INFO) /声明环境 retcode=SQLSetEnvAttr(henv, SQL_ATTR_O
8、DBC_VERSION,(void*)SQL_OV_ODBC3, 0); if(retcode = SQL_SUCCESS | retcode = SQL_SUCCESS_WITH_INFO) retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, /分配连接句柄 if(retcode = SQL_SUCCESS | retcode = SQL_SUCCESS_WITH_INFO) retcode=SQLConnect(hdbc,SY,SQL_NTS,NULL,0,NULL,0);/链接 if(retcode = SQL_SUCCESS | retcode
9、 = SQL_SUCCESS_WITH_INFO) print(); unsigned char insert=“insert into dbo.course values(dep00_a001,体育,dep00_a001_01,4,5,7)“;SQL(insert);print(); unsigned char update=“update dbo.course set credit=10 where course_name=体育“; SQL(update); print(); unsigned char del=“delete from dbo.course where course_na
10、me=体育“; SQL(del); print(); SQLFreeConnect(hdbc); /释放链接句柄 SQLFreeEnv(henv); / 释放 ODBC 环境句柄 system(“pause“); return 0; void print() unsigned char yuju=“select * from dbo.course“;SQLHSTMT hstmt;/定义语句句柄char L120;char L220;char L320;char L420;char L520; char L620;long lenOut1,lenOut2,lenOut3,lenOut4,lenO
11、ut5,lenOut6;retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, /分配语句句柄if(retcode=SQL_SUCCESS) retcode=SQLExecDirect(hstmt,yuju,SQL_NTS); if(retcode = SQL_SUCCESS|retcode = SQL_SUCCESS_WITH_INFO) /将结果集中的属性列一一绑定至变量 retcode=SQLBindCol(hstmt,1,SQL_C_CHAR,L1,sizeof(L1), retcode=SQLBindCol(hstmt,2,SQL_C_CHAR
12、,L2,sizeof(L2), retcode=SQLBindCol(hstmt,3,SQL_C_CHAR,L3,sizeof(L3), retcode=SQLBindCol(hstmt,4,SQL_C_CHAR,L4,sizeof(L4), retcode=SQLBindCol(hstmt,5,SQL_C_CHAR,L5,sizeof(L5),/把所有捆绑过的数据字段的数据拷贝到相应的缓冲区 retcode=SQLBindCol(hstmt,6,SQL_C_CHAR,L6,sizeof(L6),retcode=SQLFetch(hstmt); while(retcode = SQL_SUCC
13、ESS|retcode = SQL_SUCCESS_WITH_INFO) printf(“%st%st%st%st%st%sn“,L1,L2,L3,L4,L5,L6);retcode=SQLFetch(hstmt); SQLFreeStmt(hstmt,SQL_DROP); void SQL(unsigned char aaa) printf(“n%sn“,aaa);SQLHSTMT hstmt;/定义语句句柄 retcode=SQLAllocHandle(SQL_HANDLE_STMT, hdbc, /分配语义句柄 if(retcode=SQL_SUCCESS) retcode=SQLExe
14、cDirect(hstmt,aaa,SQL_NTS); SQLFreeStmt(hstmt,SQL_DROP); /释放语句句柄 3、编译运行运行结果因为之前数据库中,导入表数据重复了一次,所以有输出 2 遍 course。实验总结:在这次实验里我们了解了 ODBC 的原理和用途。它是微软公司开放服务结构中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准应用程序编程接口。在编写代码的过程中,因为使用了全新的编译器 VS2012,起初没有在工程内建立 C+文件导致一直出错,最终在同学的帮助下学会了使用方法才编译成功。参考了一些 odbc 访问数据库的代码,对代码的编写有了一定提高。