实验七:通过ODBC方式访问数据库_第1页
实验七:通过ODBC方式访问数据库_第2页
实验七:通过ODBC方式访问数据库_第3页
实验七:通过ODBC方式访问数据库_第4页
实验七:通过ODBC方式访问数据库_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

题目:实验七通过ODBC访问数据库姓名Vivian日期2006-1-1实验内容:一.配置数据源配置数据源共有两种方法:方法一:运用数据源管理工具来进行配置。方法二:使用DriverManager提供的ConfigDsn函数来增加、修改或删除数据源。这种方法特别适用于在应用程序中创建的临时使用的数据源。在本实验中,我们采用第一种方法创建数据源。实验中需要同时用到KingbaseES和SQLServer,因此需要分别建立两个数据源,我们将其取名为KingbaseESODBC和SQLServer0下面是建立这两个数据源的具体步骤。选择『开始』I『设置』I『控制面板』菜单,在弹出窗口中双击“管理工具”图标进入管理工具界面,双击“数据源(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”,单击【完成】按钮,系统弹出“CCreateNewDataSourcetoSQLServer”对话框,如图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访问异构数据库,并且对异构数据库进行操作。实验环境介绍。实验七是在之前完成的实验一基础上进行的。系统配置为:CPU:P3800内存:512MB硬盘:30G软件系统:WINDOWS2000SERVERFAMILY在实验一中,我们已经成功安装了KingbaseESV4.1,自动建立的“学生课程数据库”中含有基本表Student,其中安装路径为C:\ProgramFiles目录下。我们还需要在SQLServer中预先建立基本表STUDENTo在本实验中,我们将编写程序连接两个不同RDBMS的数据源,将KingbaseES数据库中的STUDENT表中的数据备份到SQLServer数据库的STUDENT中。在VC++6.0环境中编程实现访问数据库。实验预备。本实验源程序名为ODBCTest。下面我们将在VC++6.0环境下对该程序进行编译。实验源代码。以下为本实验实际程序的源码,并给出了一些注释,供参考。#include<stdlib.h>#include<stdio.h>#include<windows.h>#include<sql.h>#include<sqlext.h>#include<sqltypes.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_ENVSQL_NULL_HANDLE,&kinghenv);ret=SQLAllocHandle(SQL_HANDLE_ENVSQL_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,//连接KingbaseES"KingbaseESODBC”,SQL_NTS,"SYSTEM”,SQL_NTS,"MANAGER",SQL_NTS);if(!SQL_SUCCEEDED(ret))〃连接失败时返回错误值return-1;ret=SQLConnect(serverhdbc,〃连接SQLServer"SQLServer”,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_SUCCESSIIret==SQL_SUCCESS_WITH_INFO){〃绑定参数retSQLBindParameter(serverhstmt,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,SNO_LEN,0,sSno,0,&cbSno);retSQLBindParameter(serverhstmt,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,NAME_LEN,0,sName,0,&cbName);retSQLBindParameter(serverhstmt,3,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,2,0,sSex,0,&cbSex);retSQLBindParameter(serverhstmt,4,SQL_PARAM_INPUT,SQL_C_LONGSQL_INTEGER,0,0,&sAge,0,&cbAge);retSQLBindParameter(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_ENVkinghenv);〃释放Kingbase环境句柄SQLFreeHandle(SQL_HANDLE_STMT,serverhstmt);〃释放SQLServer语句句柄SQLDisconnect(serverhdbc);〃断开与SQLServer的连接SQLFreeHandle(SQL_HANDLE_DBC,serverhdbc);〃释放SQLServer连接句柄SQLFreeHandle(SQL_HANDLE_ENVserverhenv);〃释放SQLServer环境句柄return0;}在编写程序的时候,请注意ODBC1.0和ODBC2.x、ODBC3.x函数使用上的差异,彳

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论