您好,欢迎来到爱go旅游网。
搜索
您的当前位置:首页《数据库系统概论》课程之实验四

《数据库系统概论》课程之实验四

来源:爱go旅游网
《数据库系统概论》课程之实验四

通过编程访问数据库

1 实验目的

熟悉通过编程的方式嵌入SQL语言对数据库进行操作: 1. 熟悉通过嵌入式SQL编程访问数据库 2. 熟悉通过ODBC接口访问数据库

2 实验工具

通过C语言编写访问数据库的应用程序来对数据库进行各种数据操作。编程工具自选。

3 实验内容和要求

所有的SQL操作均在自己建立的新库里进行,分别在SQL Server 2000和Kingbase中建立一个名为TEMP的库进行各种操作。

根据以下要求认真填写实验报告,并且提交源程序,保证可正确编译运行。

3.1 嵌入式SQL

将一段连续的SQL操作写成嵌入到C程序中的程序,调试程序,使得程序能完成一项复杂的数据访问功能。

要求:提交程序

嵌入式SQL由SQL语句和C/C++代码组成。其中SQL语句由预处理器翻译成C或C++的源代码。对预处理后的源代码进行编译、连接生成可执行程序后方可运行。

 SQL预处理器

SQLServer的预处理程序是nsqlprep.exe。其常用的语法格式如下: Nsqlprep 程序文档名 –nosqlaccess

 Nsqlprep详细的语法格式以及参数意义,请看联机帮助。  要求程序文档名的后缀为.sqc,可以省略。

 预编译后得到的文档,与程序文档同名,后缀为.c;放在与程序文档名同一个

路径下

nsqlprep.exe在SQLServer的安装目录的 MSSQL\\Binn下。例如,如果SQLServer的安装目录是D:\\Program Files\\Microsoft SQL Server,那么nsqlprep.exe则在D:\\Program Files\\Microsoft SQL Server\\MSSQL\\Binn。但是,默认的安装方式(典型安装)并没有安装应用程序nsqlprep.exe,因此,需要把binn.rar的内容拷贝到该目录下。

后面的设置,假设SQLServer安装在D:\\Program Files\\Microsoft SQL Server

 连接方式

经预处理后的c文件就可以用c的编译器进行编译连接了。

使用Visual C++ 6.0进行编译连接,连接方式是动态连接,用到动态链接库SQLakw32.dll,SQLaiw32.dll;此两文件已经随同binn.rar的其他内容,被拷贝到D:\\Program Files\\Microsoft SQL Server\\MSSQL\\Binn下;但仍然需要把该路径加到系统的路径变量中,以使得程序运行时能找到这两个文件。

方法1:把该两文件拷贝到操作系统目录下的子目录system32中

方法2:把D:\\Program Files\\Microsoft SQL Server\\MSSQL\\Binn加到系统环境变量path中。“我的电脑”->“属性”->“高级”->“环境变量”->“path,编辑”,如下图所示:

在变量值中加入该路径值;注意,路径间用分号”;”分开。

3.1.1 初始化环境:

1. SQL Server2000为其嵌入式SQL提供了一些特殊的接口;默认的安装方式(典型

安装)并没有安装这些接口;因此,需要把devtools.rar解压到SQLServer的系统目录下(注意,不是安装目录);例如操作系统安装在C盘,则SQLServer的系统目录则是C:\\Program Files\\Microsoft SQL Server。后面的设置,假设操作系统安装在C盘。

2. 初始化SQL Server的预编译环境。

 初始化Visual C++ 6.0 编译器环境,运行文件:\\Microsoft Visual

Studio\\VC98\\Bin\\VCVARS32.BAT  初始化SQLServer的预编译环境,运行文件:\\devtools\\samples\\esqlc\\setenv.bat。

3. 初始化Visual C++ 6.0环境。

 Tools->options->directories->Include

Files: C:\\Program Files\\Microsoft SQL Server\\devtools\\include  Tools->options->directories->Lib

Files:C:\\Program Files\\Microsoft SQL Server\\devtools\\x86lib

最好把上面添加的两个路径,放在各自的列表首位,以防名字冲突。

 Project->Settings->Link->Object/Library Modules,添加库文件:

SQLakw32.lib,Caw32.lib

注意,两个文件之间用空格分开。

3.2 通过ODBC方式访问数据库

预备知识:

 配置ODBC数据源,通过什么方式配置?(提示:两种方式)  通过ODBC的标准函数访问数据库,并且对数据库进行操作 要求:提交程序

注:请提交设计文档,尽可能清楚明白地说明程序的功能,实现的方法,关键数据结构、变量、函数的定义。对于有关问题需要回答和说明的请另附文档。另附的文档和源程序也可以提交到ftp上或者发邮件给我 例子:

#include #include #include #include #include #define SNO_LEN 30 #define NAME_LEN 50 #define DEPART_LEN 100 #define SSEX_LEN 5 int main() {

//以king开头的表示的是连接KINGBASEES的变量 //以server开头的表示的是连接SQLSERVER的变量

SQLHENV SQLHDBC

kinghenv, serverhenv; //环境句柄 kinghdbc,serverhdbc; //连接句柄 kinghstmt,serverhstmt; //语句句柄 ret;

SQLHSTMT SQLRETURN

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 = SQLAllocEnv(&kinghenv); ret = SQLAllocEnv(&serverhenv);

/* Step 3 :建立连接 */

ret = SQLAllocHandle(SQL_HANDLE_DBC, kinghenv, &kinghdbc);

ret = SQLConnect(kinghdbc,\"KINGBASE\ret = SQLAllocHandle(SQL_HANDLE_DBC, serverhenv, &serverhdbc); ret

=

SQLConnect(serverhdbc,\"KINGBASE2\

/* 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 ); /* Step 5 :两种方式执行语句 */

/* 预编译带有参数的语句 */

ret = SQLPrepare(serverhstmt,\"INSERT INTO STUDENT (SNO,SNAME,SEX,AGE,DEPARTMENT) if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) { }

/*执行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); SQLBindCol(kinghstmt, 3, SQL_C_CHAR, sSex, SSEX_LEN, &cbSex); ret=SQLBindCol(kinghstmt, 4, SQL_C_LONG, &sAge, 0, &cbAge);

SQLBindCol(kinghstmt, 5, SQL_C_CHAR, sDepart, DEPART_LEN, &cbDepart); SQLBindParameter(serverhstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, SNO_LEN, 0, sSno, 0, &cbSno);

SQLBindParameter(serverhstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, NAME_LEN, 0, sName, 0, &cbName);

SQLBindParameter(serverhstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 2, 0, sSex, 0, &cbSex);

SQLBindParameter(serverhstmt, 4, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &sAge, 0, &cbAge);

SQLBindParameter(serverhstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, DEPART_LEN, 0, sDepart, 0, &cbDepart);

VALUES (?, ?, ?, ?, ?)\

/* Step 6 :处理结果集并执行预编译后的语句*/

while ((ret=SQLFetch(kinghstmt)) !=SQL_NO_DATA_FOUND) if(ret== SQL_ERROR) printf(\"Fetch error\\n\"); else ret=SQLExecute(serverhstmt);

}

/* Step 7 中止处理*/

SQLFreeStmt(kinghstmt,SQL_DROP); SQLDisconnect(kinghdbc); SQLFreeConnect(kinghdbc); SQLFreeEnv(kinghenv);

SQLFreeStmt(serverhstmt,SQL_DROP); SQLDisconnect(serverhdbc); SQLFreeConnect(serverhdbc); SQLFreeEnv(serverhenv);

4 实验报告

《数据库系统概论》实验报告 题目: 实验内容完成情况:(注明源程序的名字) 出现的问题: 解决方案(不能解决的将问题列出):

姓名 日期

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

Copyright © 2019- igat.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务