通过编程访问数据库
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 //以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 实验报告 《数据库系统概论》实验报告 题目: 实验内容完成情况:(注明源程序的名字) 出现的问题: 解决方案(不能解决的将问题列出): 姓名 日期 因篇幅问题不能全部显示,请点此查看更多更全内容