《数据库系统概论》实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验内容:
一.配置数据源
配置数据源共有两种方法:
方法一:运用数据源管理工具来进行配置。
方法二:使用Driver Manager 提供的ConfigDsn函数来增加、修改或删除数据源。
这种方法特别适用于在应用程序中创建的临时使用的数据源。
在本实验中,我们采用第一种方法创建数据源。
实验中需要同时用到KingbaseES和SQL Server,因此需要分别建立两个数据源,我们将其取名为KingbaseES ODBC和SQLServer。
下面是建立这两个数据源的具体步骤。
选择『开始』│『设置』│『控制面板』菜单,在弹出窗口中双击“管理工具”图标进入管理工具界面,双击“数据源(ODBC)”图标。
1.建立KingbaseES数据源。
(1)选择“系统DSN”选项,单击【添加(D)…】按钮,系统弹出“创建新数据源”
对话框,如图1所示:
图1 数据源管理器
(2)如图2所示,在ODBC驱动器程序列表中,选择“Kingbase ODBC Driver”,单击【完成】按钮,系统弹出“Kingbase ODBC数据源配置”对话框,如图3所示。
图2 创建新数据源
(3)输入数据源名称、数据库名称以及数据库IP地址,单击【确定】按钮。
图中数据源的名称为Kingbase ODBC,连接的数据库为TEST,服务器为localhost,用户名和口令分别为SYSTEM和MANAGER。
注意:Kingbase区别大小写。
图3 Kingbase ODBC数据源配置
(4)单击【保存】按钮,这样就创建了一个名为“Kingbase ODBC”的Kingbase ES ODBC数据源。
(5)如果要测试和数据源的连接是否成功,可以单击“测试连接”,系统会根据测试的结果反馈相应的消息框,如图4和图5所示。
图4 连接成功图5 连接失败
以上五步就建立了一个名为KingbaseES ODBC的数据源。
2.建立SQLServer数据源。
(1)选择“系统DSN”选项,单击【添加(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 SQLServer数据源配置(1)
图9 SQLServer数据源配置(2)
(4)连续单击【下一步】按钮,这样就创建了一个名为“SQLServer”的SQL Server ODBC数据源。
如图10所示,将弹出一个提示框,提示即将创建一个新的ODBC 数据源。
图10 提示框
(5)如果要测试和数据源的连接是否成功,可以单击“Test Data Source”,如果连接成功,系统将会显示一个连接成功的消息框,如图11所示。
图11 连接成功
以上五步就建立了一个名为SQLServer的数据源。
注:在创建数据源,测试连接是否成功时,如果KingbaseES和SQL Server未启动服务,则将显示连接失败。
启动服务后,再进行测试,连接成功。
二. 通过ODBC访问数据库,并且对数据库进行操作。
1.实验环境介绍。
实验四是在之前完成的实验一和实验二的基础上进行的。
机器配置为:CPU: P3 800 内存:512MB 硬盘:30G
软件系统:WINDOWS 2000 SERVER FAMIL Y。
在实验一中,我们已经成功安装了KingbaseES V4.1,安装路径为C:\program files;建立了数据库TEST,其中用户名为SYSTEM,口令为MANAGER。
实验二中,我们利用查询交互工具isqlw,在数据库TEST中建立起基本表STUDENT。
我们还需要在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。
然后,将已经写好的ODBCTest.c文件加入到该项目的Source Files中,编译并且执行。
执行完成后,SQL Server中Student表的数据即为Kingbase中Student表的数据备份。
(3)实验源代码。
以下为本实验实际程序的源码,并给出了一些注释,供参考。
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <Sqltypes.h>
#define SNO_LEN 30
#define NAME_LEN 50
#define DEPART_LEN 100
#define SSEX_LEN 5
int main()
{
/* Step 1 定义句柄和变量*/
//以king开头的表示的是连接KINGBASEES的变量
//以server开头的表示的是连接SQLSERVER的变量
SQLHENV kinghenv, serverhenv; //环境句柄
SQLHDBC kinghdbc,serverhdbc; //连接句柄
SQLHSTMT kinghstmt,serverhstmt; //语句句柄
SQLRETURN ret;
SQLCHAR sName[NAME_LEN],
sDepart[DEPART_LEN],sSex[SSEX_LEN],sSno[SNO_LEN];
SQLINTEGER sAge;
SQLINTEGER cbAge = 0, cbSno = SQL_NTS, cbSex = SQL_NTS,cbName = SQL_NTS,cbDepart = SQL_NTS;
/* Step 2 初始化环境*/
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);
/* Step 3 :建立连接*/
ret = SQLAllocHandle(SQL_HANDLE_DBC, kinghenv, &kinghdbc);
ret = SQLAllocHandle(SQL_HANDLE_DBC, serverhenv, &serverhdbc);
ret = SQLConnect(kinghdbc,
"KingbaseES ODBC",SQL_NTS,
"SYSTEM",SQL_NTS,
"MANAGER",SQL_NTS);
if (!SQL_SUCCEEDED(ret)) //连接失败时返回错误值
return -1;
ret = SQLConnect(serverhdbc,
"SQLServer",SQL_NTS,
"sa",SQL_NTS,
"sa",SQL_NTS);
if (!SQL_SUCCEEDED(ret)) //连接失败时返回错误值
return -1;
/* Step 4 :初始化语句句柄*/
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);
/* Step 5 :两种方式执行语句*/
/* 预编译带有参数的语句*/
ret = SQLPrepare(serverhstmt,"INSERT INTO STUDENT (SNO,SNAME,SSEX,SAGE,SDEPT) V ALUES (?, ?, ?, ?, ?)", 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 * FROM STUDENT",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);
}
/* Step 6 :处理结果集并执行预编译后的语句*/
while ((ret=SQLFetch(kinghstmt)) !=SQL_NO_DA TA_FOUND)
{
if(ret== SQL_ERROR)
printf("Fetch error\n");
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上已经被替换或丢弃了,因此,必须注意实验使用的版本带来的不同之处。