您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 北邮大三下第4次数据库实验报告--mysql
Catherine1实验四数据库接口实验-1一、实验内容以教科书第四章关于SQL语言相关内容为基础,课后查阅、自学ODBC接口有关内容,包括ODBC的体系结构、工作原理、数据访问过程、主要API接口的语法和使用方法等。以实验二建立的学生数据库为基础,编写C语言(或其它支持ODBC接口的高级程序设计语言)数据库应用程序,按照如下步骤访问数据库a)Step1.ODBC初始化,为ODBC分配环境句柄b)Step2.建立应用程序与ODBC数据源的连接c)Step3.利用SQLExecDirect语句,实现数据库应用程序对数据库的建立、查询、修改、删除等操作d)Step4.检索查询结果集e)Step5.结束数据库应用程序二、实验要求要求所编写的数据库访问应用程序中使用到以下主要的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)SQLFreeEnv;三、实验环境Windows7系统mysql数据库管理平台visualstudioC++编程平台(codeblocks或者devc++)四、实验步骤1、ODBC的体系结构、工作原理、数据访问过程、主要API接口的语法和使用方法等。以实验二建立的学生数据库为基础,编写C语言(或其它支持ODBC接口的高级程序设计语Catherine2言)数据库应用程序,按照如下步骤访问数据库。a)Step1.ODBC初始化,为ODBC分配环境句柄安装mysql-connector-odbc-5.3.4-winx64再转到系统DSN,点击“添加”,从“创建数据源”列表中选择刚安装的驱动。b)Step2.建立应用程序与ODBC数据源的连接。DSN:数据源名称用户DSN:对当前用户可见,只能用于当前计算机上的数据源。系统DSN:对当前计算机上所有的用户可见,包括NT服务器。文件DSN:可有安装了相同驱动程序的用户共享的数据源。设置用户DSN,连接到本地mysql的数据库。Catherine3为了防止在程序运行后中文数据乱码,请将设置中的编码格式“characterset”设置为gb2312.如下图:Catherine4连接成功。c)Step3:配置VS环境:1、新建一个工程,随便写一个helloworld,目的是就是让工程下的“debug”文件夹出现2、把D:\ProgramFiles\MySQL\MySQLServer5.6\lib下面的libmysql.dll复制到工程的debug文件夹里面3、接下来要设置一些引用文件的环境变量,首先,点击项目-属性-vc++目录。然后“include目录”那把“C:\ProgramFiles\MySQL\MySQLServer5.6\include”给加进来再然后“lib目录”那里把“C:\ProgramFiles\MySQL\MySQLServer5.6\lib”也一起加进来d)Step4.利用SQLExecDirect语句,实现数据库应用程序对数据库的建立、查询、修改、删除等操作、检索查询结果集。Catherine5实验代码:#includestdio.h#includestdlib.h#includewindows.h#includesql.h#includesqlext.h#includesqltypes.h#includeodbcinst.h#pragmacomment(lib,odbc32.lib)#pragmacomment(lib,libmysql.lib)structcourse_cell{charcno[5];charcname[20];intlhour;intcredit;charsemester[5];};unsignedcharsql_select[]=select*fromstudent.course;//SQL查询语句unsignedcharsql_dolist[3][100]={insertintostudent.coursevalues('C06','数据库原理',48,3,''),updatestudent.coursesetsemester='#'wherecno='C06',deletefromstudent.coursewherecno='C06'};//插入、修改、删除语句unsignedchardo_name[3][10]={insert,update,delete};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);//SQLALLocStmt;为语句句柄分配内存,Catherine6if(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO){//SQLBindCol将应用程序的数据缓冲绑定到结果集的各列SQLBindCol(hstmt,1,SQL_C_CHAR,ccell-cno,5,&lenOut1);//将数据缓冲绑定到结果集的列SQLBindCol(hstmt,2,SQL_C_CHAR,ccell-cname,20,&lenOut2);SQLBindCol(hstmt,3,SQL_C_SLONG,&ccell-lhour,sizeof(int),&lenOut3);SQLBindCol(hstmt,4,SQL_C_SLONG,&ccell-credit,sizeof(int),&lenOut4);SQLBindCol(hstmt,5,SQL_C_CHAR,ccell-semester,5,&lenOut5);retcode=SQLExecDirect(hstmt,sql_select,SQL_NTS);//把SQL语句送到数据库服务器,请求执行由SQL语句定义的数据库访问if(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO){printf(student.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);}printfCatherine7(*************************************************************************\n\n);}}SQLFreeStmt(hstmt,SQL_DROP);//释放语句句柄}intmain(){HENVenv;//定义环境句柄HDBChdbc;//定义链接句柄HSTMThstmt;//定义语句句柄RETCODEretcode;retcode=SQLAllocEnv(&env);//初始化ODBC环境,返回环境句柄if(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO){retcode=SQLAllocConnect(env,&hdbc);//为连接句柄分配内存并返回链接句柄if(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO){retcode=SQLConnect(hdbc,(SQLCHAR*)mysql,SQL_NTS,(SQLCHAR*)root,SQL_NTS,(SQLCHAR*),SQL_NTS);//连接一个SQL数据资料if(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO){show_course(hdbc);//显示初始的course内容for(inti=0;i3;i++)//依次执行插入、修改、删除操作{retcode=SQLAllocStmt(hdbc,&hstmt);//为语句句柄分配内存,并返回语句句柄Catherine8retcode=SQLExecDirect(hstmt,sql_dolist[i],SQL_NTS);//把SQL语句送到数据库服务器,请求执行由SQL语句定义的数据库访问printf(%s,do_name[i]);if(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO)printf(success!\n);elseprintf(fail!\n);SQLFreeStmt(hstmt,SQL_DROP);//释放与语句句柄相关的资源show_course(hdbc);//显示操作后的新course内容}SQLDisconnect(hdbc);//切断连接}SQLFreeConnect(hdbc);//释放与连接句柄相关的资}SQLFreeEnv(env);//释放与环境句柄相关的资源}system(pause);return0;}五、结果分析对数据库的操作为:(1)insertintostudent.coursevalues('C06','数据库原理',48,3,'春'),(2)updatestudent.coursesetsemester='#'wherecno='C06',(3)deletefromstudent.coursewherecno='C06Catherine9代码中成功执行了查询、修改、删除等操作并打印了操作之后数据库的数据。六、实验总结遇到的错误1:“errorC2664:“SQLBindCol”:不能将参数6从“long*”转换为“SQLLEN*”。“errorC2664:“SQLExecDirectW”:不能将参数2从“unsignedchar[100]”转换为“SQLWCHAR*””,解决的时候,可以直接将出错行的变量强制转换为“SQLLEN*”和“SQLWCHAR*”。遇到的错误2:insert、delete、se
本文标题:北邮大三下第4次数据库实验报告--mysql
链接地址:https://www.777doc.com/doc-2582766 .html