您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 实验七:通过ODBC方式访问数据库
题目:实验七通过ODBC访问数据库姓名Vivian日期2006-1-1实验内容:一.配置数据源配置数据源共有两种方法:方法一:运用数据源管理工具来进行配置。方法二:使用DriverManager提供的ConfigDsn函数来增加、修改或删除数据源。这种方法特别适用于在应用程序中创建的临时使用的数据源。在本实验中,我们采用第一种方法创建数据源。实验中需要同时用到KingbaseES和SQLServer,因此需要分别建立两个数据源,我们将其取名为KingbaseESODBC和SQLServer。下面是建立这两个数据源的具体步骤。选择『开始』│『设置』│『控制面板』菜单,在弹出窗口中双击“管理工具”图标进入管理工具界面,双击“数据源(ODBC)”图标。1.建立KingbaseES数据源。(1)选择“系统DSN”选项,单击【添加(D)…】按钮,系统弹出“创建新数据源”对话框,如图1所示:图1数据源管理器(2)如图2所示,在ODBC驱动器程序列表中,选择“KingbaseODBCDriver”,单击【完成】按钮,系统弹出“KingbaseODBC数据源配置”对话框,如图3所示。图2创建新数据源(3)输入数据源名称、数据库名称以及数据库IP地址。图中数据源的名称为KingbaseESODBC,连接的数据库为“学生课程数据库”,服务器为localhost,用户名和口令分别为SYSTEM和MANAGER。注意:KingbaseES区别大小写。图3KingbaseODBC数据源配置(4)单击【保存】按钮,这样就创建了一个名为“KingbaseESODBC”的KingbaseESODBC数据源。(5)如果要测试和数据源的连接是否成功,可以单击“测试连接”,系统会根据测试的结果反馈相应的消息框,如图4和图5所示。图4连接成功图5连接失败以上五步就建立了一个名为KingbaseESODBC的数据源。2.建立SQLServer数据源。(1)选择“系统DSN”选项,单击【添加(D)…】按钮,系统弹出“创建新数据源”对话框,如图6所示:图6数据源管理器(2)如图7所示,在ODBC驱动器程序列表中,选择“SQLServer”,单击【完成】按钮,系统弹出“CreateNewDataSourcetoSQLServer”对话框,如图8所示。图7创建数据源配置(3)如图8,输入数据源名称和服务器,单击【下一步】按钮。图中数据源的名称为SQLServer,服务器为(local)。如图9,选择身份认证方式,输入用户名和密码,用户名和口令分别为sa和sa(请根据实际情况进行修改,并对源代码进行相应的修改)。图8SQLServer数据源配置(1)图9SQLServer数据源配置(2)(4)连续单击【下一步】按钮,这样就创建了一个名为“SQLServer”的SQLServerODBC数据源。如图10所示,将弹出一个提示框,提示即将创建一个新的ODBC数据源。图10提示框(5)如果要测试和数据源的连接是否成功,可以单击“TestDataSource”,如果连接成功,系统将会显示一个连接成功的消息框,如图11所示。图11连接成功以上五步就建立了一个名为SQLServer的数据源。注:在创建数据源,测试连接是否成功时,如果KingbaseES和SQLServer未启动服务,则将显示连接失败。启动服务后,再进行测试,连接成功。二.通过ODBC访问异构数据库,并且对异构数据库进行操作。1.实验环境介绍。实验七是在之前完成的实验一基础上进行的。系统配置为:CPU:P3800内存:512MB硬盘:30G软件系统:WINDOWS2000SERVERFAMILY在实验一中,我们已经成功安装了KingbaseESV4.1,自动建立的“学生课程数据库”中含有基本表Student,其中安装路径为C:\ProgramFiles目录下。我们还需要在SQLServer中预先建立基本表STUDENT。在本实验中,我们将编写程序连接两个不同RDBMS的数据源,将KingbaseES数据库中的STUDENT表中的数据备份到SQLServer数据库的STUDENT中。2.在VC++6.0环境中编程实现访问数据库。(1)实验预备。本实验源程序名为ODBCTest。下面我们将在VC++6.0环境下对该程序进行编译。(2)实验源代码。以下为本实验实际程序的源码,并给出了一些注释,供参考。#includestdlib.h#includestdio.h#includewindows.h#includesql.h#includesqlext.h#includesqltypes.h#defineSNO_LEN30#defineNAME_LEN50#defineDEPART_LEN100#defineSSEX_LEN5intmain(){/*Step1定义句柄和变量*///以king开头的表示的是连接KINGBASEES的变量//以server开头的表示的是连接SQLSERVER的变量SQLHENVkinghenv,serverhenv;//环境句柄SQLHDBCkinghdbc,serverhdbc;//连接句柄SQLHSTMTkinghstmt,serverhstmt;//语句句柄SQLRETURNret;//结果返回集SQLCHARsName[NAME_LEN],sDepart[DEPART_LEN],sSex[SSEX_LEN],sSno[SNO_LEN];SQLINTEGERsAge;SQLINTEGERcbAge=0,cbSno=SQL_NTS,cbSex=SQL_NTS,cbName=SQL_NTS,cbDepart=SQL_NTS;/*Step2初始化环境*///分配环境句柄ret=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&kinghenv);ret=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&serverhenv);//设置管理环境的属性ret=SQLSetEnvAttr(kinghenv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);ret=SQLSetEnvAttr(serverhenv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);/*Step3:建立连接*///分配连接句柄ret=SQLAllocHandle(SQL_HANDLE_DBC,kinghenv,&kinghdbc);ret=SQLAllocHandle(SQL_HANDLE_DBC,serverhenv,&serverhdbc);ret=SQLConnect(kinghdbc,//连接KingbaseESKingbaseESODBC,SQL_NTS,SYSTEM,SQL_NTS,MANAGER,SQL_NTS);if(!SQL_SUCCEEDED(ret))//连接失败时返回错误值return-1;ret=SQLConnect(serverhdbc,//连接SQLServerSQLServer,SQL_NTS,sa,SQL_NTS,sa,SQL_NTS);if(!SQL_SUCCEEDED(ret))//连接失败时返回错误值return-1;/*Step4:初始化语句句柄*/ret=SQLAllocHandle(SQL_HANDLE_STMT,kinghdbc,&kinghstmt);ret=SQLSetStmtAttr(kinghstmt,SQL_ATTR_ROW_BIND_TYPE,(SQLPOINTER)SQL_BIND_BY_COLUMN,SQL_IS_INTEGER);//设置语句选项ret=SQLAllocHandle(SQL_HANDLE_STMT,serverhdbc,&serverhstmt);/*Step5:两种方式执行语句*//*预编译带有参数的语句*///需要多次执行插入,因此预先声明插入语句ret=SQLPrepare(serverhstmt,INSERTINTOSTUDENT(SNO,SNAME,SSEX,SAGE,SDEPT)VALUES(?,?,?,?,?),SQL_NTS);if(ret==SQL_SUCCESS||ret==SQL_SUCCESS_WITH_INFO){//绑定参数ret=SQLBindParameter(serverhstmt,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,SNO_LEN,0,sSno,0,&cbSno);ret=SQLBindParameter(serverhstmt,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,NAME_LEN,0,sName,0,&cbName);ret=SQLBindParameter(serverhstmt,3,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,2,0,sSex,0,&cbSex);ret=SQLBindParameter(serverhstmt,4,SQL_PARAM_INPUT,SQL_C_LONG,SQL_INTEGER,0,0,&sAge,0,&cbAge);ret=SQLBindParameter(serverhstmt,5,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,DEPART_LEN,0,sDepart,0,&cbDepart);}/*执行SQL语句*/ret=SQLExecDirect(kinghstmt,SELECT*FROMSTUDENT,SQL_NTS);if(ret==SQL_SUCCESS||ret==SQL_SUCCESS_WITH_INFO){//将结果集中的属性列一一绑定至变量ret=SQLBindCol(kinghstmt,1,SQL_C_CHAR,sSno,SNO_LEN,&cbSno);ret=SQLBindCol(kinghstmt,2,SQL_C_CHAR,sName,NAME_LEN,&cbName);ret=SQLBindCol(kinghstmt,3,SQL_C_CHAR,sSex,SSEX_LEN,&cbSex);ret=SQLBindCol(kinghstmt,4,SQL_C_LONG,&sAge,0,&cbAge);ret=SQLBindCol(kinghstmt,5,SQL_C_CHAR,sDepart,DEPART_LEN,&cbDepart);}/*Step6:处理结果集并执行预编译后的语句*/while((ret=SQLFetch(kinghstmt))!=SQL_NO_DATA_FOUND){if(ret==SQL_ERROR)//错误处理printf(Fetcherror\n);elseret=SQLExecute(serverhstmt);//执行语句}/*Step7中止处理*/SQLFreeHandle(SQL_HANDLE_STMT,kinghstmt);//释放Kingbase语句句柄SQLDisconnect(kinghdbc);//断开与KingbaseES的连接SQLFreeHandle(SQL_HANDLE_DBC,kinghdbc);//释放Kingbase连接句柄SQLFreeHandle(SQL_HANDLE_ENV,kinghenv);//释放Kingbase环境句柄SQLFreeHandle(SQL_HANDLE_STMT,serverhstmt);//释放SQLServer语句句柄SQLDisconnect(serverhdbc);//断开与SQLServer的连接SQLFreeHandle(SQL_HANDLE_DBC,serverhdbc);//释放SQLServer连接句柄SQLFreeHan
本文标题:实验七:通过ODBC方式访问数据库
链接地址:https://www.777doc.com/doc-4227342 .html