您的当前位置:首页正文

ODBC

来源:画鸵萌宠网
《数据库系统概论》课程之实验六 ------通过ODBC访问数据库

1 实验目的

1. 2. 3. 4. 5.

学会配置ODBC数据源.

熟悉使用ODBC来进行数据库应用程序的设计.

熟悉通过ODBC接口访问(异构)数据库并对(异构)数据库进行操作. 熟悉ODBC数据源的概念及数据源的创建方法. 完成作业的上机练习。

2 实验平台和实验工具

实验平台:在实验1中安装的RDBMS及其ODBC Driver. 通过C语言编写访问数据库的应用程序。编程工具自选。

3 实验内容和要求

1. 配置两个不同的数据源,编写程序连接两个不同RDBMS的数据源,对异构数据库进行

操作。 例如,将KingbaseES数据库的某个表中的数据转移到SQL Sever数据库的表中。 2. 使用ODBC编写应用程序来对异构数据库进行各种数据操作。

3. 要求: 给出配置两个不同数据源的过程。提交原程序并标识必要的注释。保证程序能

正确编译和运行,认真填写实验报告。

4 实验报告

《数据库系统概论》实验报告 题目: 通过ODBC访问数据库 姓名 王 朔 日期 2014/4/24 实验环境:操作系统:Windows 7 ; 数据库管理系统: SQL Server 2008 实验内容与完成情况: 一、配置数据源 (运用数据源管理工具来进行配置。) 实验中需要同时用到 KingbaseES 和 SQLServer,因此需要分别建立两个数据源,我们将其取名为 KingbaseES ODBC 和 SQLServer。 下面是建立这两个数据源的具体步骤。 选择『开始』│『设置』│『控制面板』菜单,在弹出窗口中双击“管理工具”图标进 入管理工具界面,双击“数据源(ODBC)”图标。 1.建立 KingbaseES 数据源。 (1) 选择“系统 DSN”选项,单击【添加(D)„】按钮,系统弹出“创建新数据源” 对话框,如图 1 所示: 图 1 数据源管理器 (2) 如图 2 所示,在 ODBC 驱动器程序列表中,选择“Kingbase ODBC Driver”,单 击【完成】按钮,系统弹出“Kingbase ODBC 数据源配置”对话框,如图 3 所示。 图 2 创建新数据源 (3) 输入数据源名称、数据库名称以及数据库 IP 地址。图中数据源的名称为 KingbaseES ODBC,连接的数据库为“学生课程数据库”,服务器为 localhost,用 户名和口令分别为 SYSTEM 和 MANAGER。注意:KingbaseES 区别大小写。 图 3 Kingbase ODBC 数据源配置 (4) 单击【保存】按钮,这样就创建了一个名为“KingbaseES ODBC”的 KingbaseES 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)我们还需要在 SQL Server中预先建立基本表 STUDENT。 在本实验中,我们将编写程序连接两个不同 RDBMS 的数据源,将 KingbaseES 数据库中的 STUDENT 表中的数据备份到 SQL Server 数据库的 STUDENT 中。 (2)在 VC++6.0 环境中编程实现访问数据库。 本实验源程序名为 ODBCTest。下面我们将在 VC++6.0 环境下对该程序进行编译。 实验源代码: #include #include #include #include #include #include #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 \"KingbaseES ODBC\\"SYSTEM\\"MANAGER\if (!SQL_SUCCEEDED(ret)) //连接失败时返回错误值 return -1; ret = SQLConnect(serverhdbc, //连接 SQLServer \"SQLServer\\"sa\\"sa\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_BI ND_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) 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 * FROM STUDENT\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_DATA_FOUND) { if(ret== SQL_ERROR) //错误处理 printf(\"Fetch error\\n\"); else ret=SQLExecute(serverhstmt); //执行语句 } /* Step 7 中止处理*/ 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 连接句柄 SQLFreeHandle(SQL_HANDLE_ENV, serverhenv); //释放 SQLServer 环境句柄 return 0; } (3)实验步骤。 首先,在 VC++6.0 中新建一个 Win32 Console Application 的项目,并将项目命名为 ODBCTest。 然后,将已经写好的 ODBCTest.c 文件加入到该项目的 Source Files 中,编译并且执行。 执行完成后,进入 SQL Server 查询分析器,对原来为空的 Student 表进行查询(SELECT * FROM Student),可以看见 SQL Server 中 Student 表的数据即为 KingbaseES 中 Student 表的数据备份。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top