1、实验内容:一.配置数据源配置数据源共有两种方法:方法一:运用数据源管理工具来进行配置。方法二:使用 Driver Manager 提供的 ConfigDsn 函数来增加、修改或删除数据源。这种方法特别适用于在应用程序中创建的临时使用的数据源。在本实验中,我们采用第一种方法创建数据源。实验中需要同时用到 KingbaseES 和SQL Server,因此需要分别建立两个数据源,我们将其取名为 KingbaseES ODBC 和SQLServer。下面是建立这两个数据源的具体步骤。选择开始设置控制面板菜单,在弹出窗口中双击“管理工具”图标进入管理工具界面,双击“数据源(ODBC) ”图标。1.建立
2、 KingbaseES 数据源。(1) 选择“系统 DSN”选项,单击【添加(D) 】按钮,系统弹出“创建新数据源”对话框,如图 1 所示:图 1 数据源管理器(2) 如图 2 所示,在 ODBC 驱动器程序列表中,选择“Kingbase ODBC Driver”,单击【完成】按钮,系统弹出“Kingbase ODBC 数据源配置”对话框,如图 3 所示。数据库系统概论实验报告题目:实验四 通过 ODBC 访问数据库 姓名图 2 创建新数据源(3) 输入数据源名称、数据库名称以及数据库 IP 地址,单击【确定】按钮。图中数据源的名称为 Kingbase ODBC,连接的数据库为 TEST,服务
3、器为 localhost,用户名和口令分别为 SYSTEM 和 MANAGER。注意:Kingbase 区别大小写。图 3 Kingbase ODBC 数据源配置(4) 单击【保存】按钮,这样就创建了一个名为“Kingbase ODBC”的 Kingbase ES ODBC 数据源。(5) 如果要测试和数据源的连接是否成功,可以单击“测试连接” ,系统会根据测试的结果反馈相应的消息框,如图 4 和图 5 所示。图 4 连接成功 图 5 连接失败以上五步就建立了一个名为 KingbaseES ODBC 的数据源。2.建立 SQLServer 数据源。(1) 选择“系统 DSN”选项,单击【添加(
4、D) 】按钮,系统弹出“创建新数据源”对话框,如图 6 所示:图 6 数据源管理器(2) 如图 7 所示,在 ODBC 驱动器程序列表中,选择“SQL Server” ,单击【完成】按钮,系统弹出“Create New Data Source to SQL Server”对话框,如图 8 所示。图 7 创建数据源配置(3) 如图 8,输入数据源名称和服务器,单击【下一步】按钮。图中数据源的名称为 SQLServer,服务器为 (local)。如图 9,选择身份认证方式,输入用户名和密码,用户名和口令分别为 sa 和 sa(请根据实际情况进行修改,并对源代码进行相应的修改) 。图 8 SQLSe
5、rver 数据源配置( 1)图 9 SQLServer 数据源配置(2)(4) 连续单击【下一步】按钮,这样就创建了一个名为“SQLServer”的 SQL Server ODBC 数据源。如图 10 所示,将弹出一个提示框,提示即将创建一个新的ODBC 数据源。图 10 提示框(5) 如果要测试和数据源的连接是否成功,可以单击“Test Data Source”,如果连接成功,系统将会显示一个连接成功的消息框,如图 11 所示。图 11 连接成功以上五步就建立了一个名为 SQLServer 的数据源。注:在创建数据源,测试连接是否成功时,如果 KingbaseES 和 SQL Server
6、未启动服务,则将显示连接失败。启动服务后,再进行测试,连接成功。二. 通过 ODBC 访问数据库,并且对数据库进行操作。1.实验环境介绍。实验四是在之前完成的实验一和实验二的基础上进行的。机器配置为:CPU: P3 800 内存:512MB 硬盘:30G 软件系统:WINDOWS 2000 SERVER FAMILY。在实验一中,我们已经成功安装了 KingbaseES V4.1,安装路径为 C:program files;建立了数据库 TEST,其中用户名为 SYSTEM,口令为 MANAGER。实验二中,我们利用查询交互工具 isqlw,在数据库 TEST 中建立起基本表 STUDENT。
7、我们还需要在 SQL Server中预先建立基本表 STUDENT。在本实验中,我们将编写程序连接两个不同 RDBMS 的数据源,将 Kingbase 数据库中的 STUDENT 表中的数据备份到 SQL Server 数据库的 STUDENT 中。2.在 VC+6.0 环境中编程实现访问数据库。(1) 实验预备。本实验源程序名为 ODBCTest,代码在数据库系统概论书中已经给出。下面我们将在 VC+6.0 环境下对该程序进行编译。(2) 实验步骤。首先,在 VC+6.0 中新建一个 Win32 Console Application 的项目,并将项目命名为ODBCTest。然后,将已经写好
8、的 ODBCTest.c 文件加入到该项目的 Source Files 中,编译并且执行。执行完成后,SQL Server 中 Student 表的数据即为 Kingbase 中 Student 表的数据备份。(3) 实验源代码。以下为本实验实际程序的源码,并给出了一些注释,供参考。#include #include #include #include #include #include #define SNO_LEN 30#define NAME_LEN 50#define DEPART_LEN 100#define SSEX_LEN 5int main()/* Step 1 定义句柄和变量
9、 */以 king 开头的表示的是连接 KINGBASEES 的变量/以 server 开头的表示的是连接 SQLSERVER 的变量SQLHENV kinghenv, serverhenv; /环境句柄SQLHDBC kinghdbc,serverhdbc; /连接句柄SQLHSTMT kinghstmt,serverhstmt; /语句句柄SQLRETURN ret;SQLCHAR sNameNAME_LEN, sDepartDEPART_LEN,sSexSSEX_LEN,sSnoSNO_LEN;SQLINTEGER sAge;SQLINTEGER cbAge = 0, cbSno = S
10、QL_NTS, cbSex = SQL_NTS,cbName = SQL_NTS,cbDepart = SQL_NTS;/* Step 2 初始化环境 */ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, ret = SQLSetEnvAttr(kinghenv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);ret = SQLSetEnvAttr(serverhenv, SQL_A
11、TTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);/* Step 3 :建立连接 */ret = SQLAllocHandle(SQL_HANDLE_DBC, kinghenv, ret = SQLAllocHandle(SQL_HANDLE_DBC, serverhenv, ret = SQLConnect(kinghdbc,“KingbaseES ODBC“,SQL_NTS,“SYSTEM“,SQL_NTS,“MANAGER“,SQL_NTS);if (!SQL_SUCCEEDED(ret) /连接失败时返回错误值return -1;ret = SQLCo
12、nnect(serverhdbc,“SQLServer“,SQL_NTS,“sa“,SQL_NTS,“sa“,SQL_NTS);if (!SQL_SUCCEEDED(ret) /连接失败时返回错误值return -1;/* Step 4 :初始化语句句柄 */ret = SQLAllocHandle(SQL_HANDLE_STMT, kinghdbc, ret = SQLSetStmtAttr(kinghstmt,SQL_ATTR_ROW_BIND_TYPE,(SQLPOINTER)SQL_BIND_BY_COLUMN,SQL_IS_INTEGER );ret = SQLAllocHandle
13、(SQL_HANDLE_STMT, serverhdbc, /* Step 5 :两种方式执行语句 */* 预编译带有参数的语句 */ret = SQLPrepare(serverhstmt,“INSERT INTO STUDENT (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,S
14、QL_CHAR, SNO_LEN, 0, sSno, 0, ret = SQLBindParameter(serverhstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR,SQL_CHAR, NAME_LEN, 0, sName, 0, ret = SQLBindParameter(serverhstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR,SQL_CHAR, 2, 0, sSex, 0, ret = SQLBindParameter(serverhstmt, 4, SQL_PARAM_INPUT, SQL_C_LONG,SQL_INTEGER
15、, 0, 0, ret = SQLBindParameter(serverhstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR,SQL_CHAR, DEPART_LEN, 0, sDepart, 0, /*执行 SQL 语句*/ret = SQLExecDirect(kinghstmt,“SELECT * FROM STUDENT“,SQL_NTS);if (ret = SQL_SUCCESS | ret = SQL_SUCCESS_WITH_INFO) ret = SQLBindCol(kinghstmt, 1, SQL_C_CHAR,sSno,SNO_LEN, ret
16、 = SQLBindCol(kinghstmt, 2, SQL_C_CHAR, sName, NAME_LEN, ret = SQLBindCol(kinghstmt, 3, SQL_C_CHAR, sSex, SSEX_LEN, ret = SQLBindCol(kinghstmt, 4, SQL_C_LONG, ret = SQLBindCol(kinghstmt, 5, SQL_C_CHAR, sDepart, DEPART_LEN, /* Step 6 :处理结果集并执行预编译后的语句*/while (ret=SQLFetch(kinghstmt) !=SQL_NO_DATA_FOUN
17、D) if(ret= SQL_ERROR)printf(“Fetch errorn“);else ret=SQLExecute(serverhstmt); /* Step 7 中止处理*/SQLFreeHandle(SQL_HANDLE_STMT,kinghstmt);SQLDisconnect(kinghdbc);SQLFreeHandle(SQL_HANDLE_DBC, kinghdbc);SQLFreeHandle(SQL_HANDLE_ENV,kinghenv);SQLFreeHandle(SQL_HANDLE_STMT, serverhstmt);SQLDisconnect(serverhdbc);SQLFreeHandle(SQL_HANDLE_DBC, serverhdbc);SQLFreeHandle(SQL_HANDLE_ENV, serverhenv);return 0;在编写程序的时候,请注意 ODBC 1.0 和 ODBC 2.x、ODBC 3.x 函数使用上的差异,很多函数在 3.x 上已经被替换或丢弃了,因此,必须注意实验使用的版本带来的不同之处。