数据库原理-实验7-通过ODBC访问数据库

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

一、实验目的:1.理解ODBC的相关概念:ODBC、句柄等;2.理解ODBC的工作原理;3.掌握ODBC的工作流程;4.掌握通过ODBC访问数据库的方法二、实验环境:SQLServer2008、VC++6.0三、实验学时:2学时四、实验内容和步骤:(一)配置数据源配置数据源共有两种方法:方法一:运用数据源管理工具来进行配置。方法二:使用DriverManager提供的ConfigDsn函数来增加、修改或删除数据源。这种方法特别适用于在应用程序中创建的临时使用的数据源。在本实验中,我们采用第一种方法创建数据源。我们将其取名为SQLServer。下面是建立这数据源的具体步骤。选择『开始』│『设置』│『控制面板』菜单,在弹出窗口中双击“管理工具”图标进入管理工具界面,双击“数据源(ODBC)”图标。建立SQLServer数据源。(1)选择“系统DSN”选项,单击【添加(D)…】按钮,系统弹出“创建新数据源”对话框,如下图所示:图1数据源管理器(2)如图2所示,在ODBC驱动器程序列表中,选择“SQLServer”,单击【完成】按钮,系统弹出“CreateNewDataSourcetoSQLServer”对话框,如图2所示:图2创建数据源配置(3)如图3,输入数据源名称和服务器,单击【下一步】按钮。图中数据源的名称为SQLServer,服务器为(local)。如图4,选择身份认证方式,输入用户名和密码,用户名和口令分别为sa和sa(请根据实际情况进行修改,并对源代码进行相应的修图3SQLServer数据源配置(1)图4SQLServer数据源配置(2)(4)连续单击【下一步】按钮,这样就创建了一个名为“SQLServer”的SQLServerODBC数据源。如图5所示,将弹出一个提示框,提示即将创建一个新的ODBC数据源。图5提示框(5)如果要测试和数据源的连接是否成功,可以单击“TestDataSource”,如果连接成功,系统将会显示一个连接成功的消息框,如图6所示。图6连接成功以上五步就建立了一个名为SQLServer的数据源。注:在创建数据源,测试连接是否成功时,如果KingbaseES和SQLServer未启动服务,则将显示连接失败。启动服务后,再进行测试,连接成功。(二)通过ODBC访问数据库,并且对数据库进行操作。1.实验环境介绍。在本实验中,我们将编写程序连接到RDBMS的数据源,将数据录入到SQLServer数据库的STUDENT中。2.在VC++6.0环境中编程实现访问数据库。(1)实验预备。本实验源程序名为odbc,代码在《数据库系统概论》书中已经给出。下面我们将在VC++6.0环境下对该程序进行编译。(2)实验步骤。首先,在VC++6.0中新建一个Win32ConsoleApplication的项目,并将项目命名为ODBC03。然后,将已经写好的ODBC.c文件加入到该项目的SourceFiles中,编译并且执行。(3)实验源代码。以下为本实验实际程序的源码,并给出了一些注释,供参考。#includestdio.h#includeiostream.h#includestring.h#includewindows.h#includesql.h#includesqlext.h#includeodbcss.h#defineMAXBUFLEN255#defineMaxNameLen20//下面这句是预处理语句,使程序在编译时分别编译绑定段或SQLGetdata段#defineSQLBINDCOLSQLHENVhenv=SQL_NULL_HENV;//定义环境句柄SQLHDBChdbc1=SQL_NULL_HDBC;//定义数据库连接句柄SQLHSTMThstmt1=SQL_NULL_HSTMT;//定义语句句柄intmain(){RETCODEretcode;//错误返回码//AllocatetheODBCEnvironmentandsavehandle.retcode=SQLAllocHandle(SQL_HANDLE_ENV,NULL,&henv);if(retcode0)//错误处理{coutallocateODBCEnvironmenthandleerrors.endl;return-1;}//NotifyODBCthatthisisanODBC3.0application.retcode=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);if(retcode0)//错误处理{couttheODBCisnotversion3.0endl;return-1;}//AllocateanODBCconnectionandconnect.retcode=SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc1);if(retcode0)//错误处理{coutallocateODBCconnectionhandleerrors.endl;return-1;}//DataSourceNamemustbeoftypeUserDNSorSystemDNSchar*szDSN=sql_37;char*szUID=sa;//lognamechar*szAuthStr=1234321;//passward//connecttotheDataSourceretcode=SQLConnect(hdbc1,(SQLCHAR*)szDSN,(SWORD)strlen(szDSN),(SQLCHAR*)szUID,(SWORD)strlen(szUID),(SQLCHAR*)szAuthStr,(SWORD)strlen(szAuthStr));if(retcode0)//错误处理{coutconnecttoODBCdatasourceerrors.endl;return-1;}//Allocateastatementhandle.retcode=SQLAllocHandle(SQL_HANDLE_STMT,hdbc1,&hstmt1);if(retcode0)//错误处理{coutallocateODBCstatementhandleerrors.endl;return-1;}//ExecuteanSQLstatementdirectlyonthestatementhandle.每一句后面都跟了一个错误处理,当发生错误时可以很方便的判断错在哪里retcode=SQLExecDirect(hstmt1,(SQLCHAR*)createtables(snochar(5)primarykey,snamechar(10)notnull,ssexchar(2),sageint,sdeptchar(10)),SQL_NTS);if(retcode0){coutcreaterrors.endl;return-1;}retcode=SQLExecDirect(hstmt1,(SQLCHAR*)insertintosvalues('95001','郝红','女',20,'计科'),SQL_NTS);if(retcode0){couts1inserterrors.endl;return-1;}retcode=SQLExecDirect(hstmt1,(SQLCHAR*)insertintosvalues('95002','秦沛','男',21,'计科'),SQL_NTS);if(retcode0){couts2inserterrors.endl;return-1;}retcode=SQLExecDirect(hstmt1,(SQLCHAR*)insertintosvalues('95003','刘蓉','女',22,'网络'),SQL_NTS);if(retcode0){couts3inserterrors.endl;return-1;}retcode=SQLExecDirect(hstmt1,(SQLCHAR*)insertintosvalues('95004','张超','男',20,'网络'),SQL_NTS);if(retcode0){couts4inserterrors.endl;return-1;}retcode=SQLExecDirect(hstmt1,(SQLCHAR*)insertintosvalues('95005','王珂','男',20,'软件'),SQL_NTS);if(retcode0){couts5inserterrors.endl;return-1;}retcode=SQLExecDirect(hstmt1,(SQLCHAR*)insertintosvalues('95006','计划','男',21,'软件'),SQL_NTS);if(retcode0){couts6inserterrors.endl;return-1;}retcode=SQLExecDirect(hstmt1,(SQLCHAR*)SElECTsname,sdeptFROMs,SQL_NTS);if(retcode0){coutExecutingstatementthroughtODBCerrors.endl;return-1;}//SQLBindColvariablesSQLCHARsdept[MaxNameLen+1];SQLCHARsname[MaxNameLen+1];SQLINTEGERcolumnLen=0;//数据库定义中该属性列的长度#ifdefSQLBINDCOL//游标已被封装在其中,一开始把两个列号分别写为s中的列号2(sname),5(sdept),第二个参数应为游标中的列号,而不是表中的列号,retcode=SQLBindCol(hstmt1,1,SQL_C_CHAR,sname,MaxNameLen,&columnLen);retcode=SQLBindCol(hstmt1,2,SQL_C_CHAR,sdept,MaxNameLen,&columnLen);while((retcode=SQLFetch(hstmt1))!=SQL_NO_DATA){if(columnLen0)printf(sname=%ssdept=%s\n,sname,sdept);elseprintf(sname=%ssdept=NULL\n,sname,sdept);}#elsewhile(1){retcode=SQLFetch(hstmt1);if(retcode==SQL_NO_DATA)break;retcode=SQLGetData(hstmt1,1,SQL_C_CHAR,sname,MaxNameLen,&columnLen);retcode=SQLGetData(hstmt1,2,SQL_C_CHAR,sdept,MaxNameLen,&columnLen);if(columnLen0)printf(sname=%ssdept=%s\n,sname,sdept);elseprintf(sname=%ssdept=NULL\n,sname,sdept);}#endif/*Cleanup.*/SQLFreeHandle(SQL_HANDLE_STMT,hstmt1);SQLDisconnect(hdbc1);SQLFreeHandle(SQL_HANDLE_DBC,hdbc1);SQLFreeHandle(SQL_HANDLE_ENV,henv);return(0);}执行后得到如下结果:在编写程序的时候,请注意ODBC1.0和ODBC2.x、ODBC3.x函数使用上的差异,很多函数在3.x上已经被替换或丢弃了,因此,必须注意实验使用的

1 / 10
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功