您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 北邮计科大三下数据库实验3
实验报告学院:计算机学院课程名称:数据库系统原理实验名称:实验四数据库接口实验1班级:2013211306姓名:白若飞学号:2013211335一.实验目的1.通过实验了解通用数据库应用编程接口ODBC的基本原理和实现机制,熟悉主要的ODBC接口的语法和使用方法;2.利用C语言(或其它支持ODBC接口的高级程序设计语言)编程实现简单的数据库应用程序,掌握基于ODBC的数据库访问的基本原理和方法3.学习java语言,并采用jdbc接口方式对数据库进行访问二.实验内容1.以教科书第四章关于SQL语言相关内容为基础,课后查阅、自学ODBC接口有关内容,包括ODBC的体系结构、工作原理、数据访问过程、主要API接口的语法和使用方法等。2..以实验二建立的学生数据库为基础,编写C语言(或其它支持ODBC接口的高级程序设计语言)数据库应用程序,按照如下步骤访问数据库(a)Step1.ODBC初始化,为ODBC分配环境句柄(b)Step2.建立应用程序与ODBC数据源的连接(c)Step3.利用SQLExecDirect语句,实现数据库应用程序对数据库的建立、查询、修改、删除等操作(d)Step4.检索查询结果集(e)Step5.结束数据库应用程序三.实验要求1.要求所编写的数据库访问应用程序中使用到以下主要的ODBCAPI函数:(1)SQLALLocEnv:初始化ODBC环境,返回环境句柄(2)SQLALLocConnect:为连接句柄分配内存并返回连接句柄(3)SQLConnect:连接一个SQL数据资源(4)SQLDriverConnect连接一个SQL数据资源,允许驱动器向用户询问信息(5)SQLALLocStmt为语句句柄分配内存,(6)SQLExecDirect把SQL语句送到数据库服务器,请求执行由SQL语句定义的数据库访问(7)SQLFetchAdvances将游标移动到到查询结果集的下一行(或第一行)(8)SQLGetData按照游标指向的位置,从查询结果集的特定的一列取回数据(9)SQLFreeStmt释放与语句句柄相关的资源(10)SQLDisconnect切断连接(11)SQLFreeConnect释放与连接句柄相关的资源(12)SQLFreeEnv2.四.实验环境(1)MicrosoftWindows8旗舰版(64位)(2)Devc++(3)Xampp(4)五.实验步骤a)Step1.ODBC初始化,为ODBC分配环境句柄转到系统DSN,点击“添加”,从“创建数据源”列表中选择刚安装的驱动。b)Step2.建立应用程序与ODBC数据源的连接。DSN:数据源名称用户DSN:对当前用户可见,只能用于当前计算机上的数据源。系统DSN:对当前计算机上所有的用户可见,包括NT服务器。文件DSN:可有安装了相同驱动程序的用户共享的数据源。设置用户DSN,连接到本地mysql的数据库。为了防止在程序运行后中文数据乱码,请将设置中的编码格式“characterset”设置为gb2312.、连接成功。b)Step3.利用SQLExecDirect语句,实现数据库应用程序对数据库的建立、查询、修改、删除等操作、检索查询结果集。源代码及注释如下:#includewindows.h#includestdio.h#includestdlib.h#includeiostream#includestring#includesql.h#includesqltypes.h#includesqlext.h#includesqlucode.h#includeodbcinst.husingnamespacestd;RETCODEretcode;//定义结果返回集SQLHDBChdbc;//定义链接句柄voidSQL(string);//执行SQL语句子程序intmain(){stringstr;SQLHANDLEhenv;//定义环境句柄unsignedcharSY[]=mysql;//mysql为ODBC数据源名称unsignedchardb2[]=root;//root为用户名//unsignedcharpass[]=;//密码//分配ODBC环境retcode=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);if(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO)retcode=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);//声明环境if(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO)retcode=SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);//分配连接句柄if(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO)retcode=SQLConnect(hdbc,(SQLCHAR*)jack,SQL_NTS,(SQLCHAR*)root,SQL_NTS,(SQLCHAR*),SQL_NTS);//进行链接if(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO){while(1){coutPleaseinputthesqlquery:endl;getline(cin,str);if(str==exit)return0;SQL(str);}}SQLFreeConnect(hdbc);////释放链接句柄SQLFreeEnv(henv);//释放ODBC环境句柄system(pause);return0;}voidSQL(stringstr1){charL1[50]={'\0'};charL2[50]={'\0'};charL3[50]={'\0'};charL4[50]={'\0'};charL5[50]={'\0'};charL6[50]={'\0'};longlongintlenOut1,lenOut2,lenOut3,lenOut4,lenOut5,lenOut6;SQLHSTMThstmt;//定义语句句柄retcode=SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt);//分配语义句柄if(retcode==SQL_SUCCESS){retcode=SQLExecDirect(hstmt,(SQLCHAR*)(str1.c_str()),SQL_NTS);if(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO){//将结果集中的属性列逐次绑定至变量retcode=SQLBindCol(hstmt,1,SQL_C_CHAR,L1,sizeof(L1),&lenOut1);retcode=SQLBindCol(hstmt,2,SQL_C_CHAR,L2,sizeof(L2),&lenOut2);retcode=SQLBindCol(hstmt,3,SQL_C_CHAR,L3,sizeof(L3),&lenOut3);retcode=SQLBindCol(hstmt,4,SQL_C_CHAR,L4,sizeof(L4),&lenOut4);retcode=SQLBindCol(hstmt,5,SQL_C_CHAR,L5,sizeof(L5),&lenOut5);//SQLBindCol将应用程序的数据缓冲绑定到结果集的各列retcode=SQLBindCol(hstmt,6,SQL_C_CHAR,L6,sizeof(L6),&lenOut6);//把所有捆绑过的数据字段的数据拷贝到相应的缓冲区retcode=SQLFetch(hstmt);while(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO){if(L2[0]=='\0')cout(string)L1endl;elseif(L3[0]=='\0')cout(string)L1\t(string)L2endl;elseif(L4[0]=='\0')cout(string)L1(string)L2(string)L3endl;elseif(L5[0]=='\0')cout(string)L1(string)L2(string)L3(string)L4endl;elseif(L6[0]=='\0')cout(string)L1(string)L2(string)L3(string)L4(string)L5endl;elsecout(string)L1(string)L2(string)L3(string)L4(string)L5(string)L6endl;retcode=SQLFetch(hstmt);}}}SQLFreeStmt(hstmt,SQL_DROP);//释放语句句柄}六.实验结果注:连接的数据库test,其中的三个表的,模式如下:course=(cno,cname,lhour,credit,semester)sc=(sno,cno,grade)student=(sno,sname,sex,bdate,dept,classno)七.实验总结(1)当一条路在一定时间内走不通时,果断放弃,开辟新路,即使原来的路是别人走成功的;最先因为听了做成功人的建议,下载了生sqlserver和vs,vs不仅占地方,而且安装太麻烦。通过自己摸索,百度和与同学讨论,经历了一整天也无法正常连接数据源,第二天,果断换成devc++和mysql,很顺利就连接成功了。(2)编码阶段比较顺利;学习了各个ODBCAPI函数的作用和用法,例如:retcode=SQLConnect(hdbc,(SQLCHAR*)jack,SQL_NTS,(SQLCHAR*)root,SQL_NTS,(SQLCHAR*),SQL_NTS);//进行链接jack为数据源名root为用户名密码为空(3)“errorC2664:“SQLBindCol”:不能将参数6从“long*”转换为“SQLLEN*”。“errorC2664:“SQLExecDirectW”:不能将参数2从“unsignedchar[100]”转换为“SQLWCHAR*””,解决的时候,可以直接将出错行的变量强制转换为“SQLLEN*”和“SQLWCHAR*”就ok啦。(4)还有一个问题是查询结果的列数不相同,所以用了一个最大的数6,然后再判断到第几列有数据,再进行输出。(5)通过这次实验,我了解了通用数据库应用编程接口ODBC的基本原理和实现机制,并对MySQL中的ODBC的使用和ODBC接口的语法和函数等有了进一步的了解。较好地掌握基于ODBC的数据库访问的基本原理和方法,在实践中较好的掌握ODBC相关知识。
本文标题:北邮计科大三下数据库实验3
链接地址:https://www.777doc.com/doc-2582875 .html