数据库实验报告_第1页
数据库实验报告_第2页
数据库实验报告_第3页
数据库实验报告_第4页
数据库实验报告_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数据库 地理与生物信息学院2012 / 2013 学年第 一 学期实 验 报 告 课程名称: 数据库 实验名称: 嵌入式SQL、存储过程及ODBC等访问数据库 班 级 学 号 学 生 姓 名 周炳威 , 指 导 教 师 日 期: 2013 年 5 月一、实验题目及实验环境:嵌入式SQL、存储过程及ODBC等访问数据库 操作系统:Windows 7 数据库管理系统:SQL SERVER2000个人版Compiler:Visual C+ 6.02、 实验内容:1. 通过C语言编写访问数据库的应用程序来对数据库进行操作嵌入式SQL、ODBC2. 用SQL Server编写存储过程, 对数据库进行操作

2、3. 通过嵌入式SQL,对学生课程数据库中的表,完成下面功能:4. 依次检查某个系的学生记录,交互式更新学生年龄。5. 对学生课程数据库,编写存储过程,完成下面功能:6. 统计某一门课程的成绩分布情况,即按照各分数段统计人数。7. 使用ODBC编写应用程序,对学生课程数据库中的表,完成下面功能:8. 查询选修某一门课程的选课信息,要查询的课程号由用户在程序运行过程中指定,放在主变量中3、 实验过程及完成情况:建立数据库表:1.嵌入式sql嵌入式SQL的C语言应用程序在VC+6.0、SQL Server 2000环境下的调试可分为五步:第一步 环境初始化;第二步 预编译;第三步 编译;第四步 连

3、接;第五步 运行。1、环境初始化        (1) 将文件夹devtools复制到SQL Server的系统目录C:Program FilesMicrosoft SQL Server(或 在安装Microsoft SQL Server 2000时选择安装Development Tools,为使用嵌入式SQL语言准备必要的头文件和库文件。)       (2)初始化Visual C+ 6.0编译器环境。在命令行方式下运行文件Microsoft Visual Stu

4、dioVC98Binvcvars32.bat。运行文件Microsoft Visual StudioVC98Binvcvars32.bat。       (3)初始化SQL Server的预编译环境。在命令行方式下运行文件: C:Program FilesMicrosoft SQL ServerDEVTOOLSSAMPLESESQLCsetenv.bat。直接是由附件里的运行程序直接运行        ( 4) VC+6.0环境配置。具体配置分为如下三步: 

5、0;         单击菜单中Tools(工具)->options(选择)->directories(目录)->Include Files:添加 C:Program FilesMicrosoft SQL Serverdevtoolsinclude。将SQL server自带的用于数据库开发的头文件包含到工程环境中。          Tools(工具)->options(选择)->directo

6、ries(目录)->Lib Files:添加C:Program FilesMicrosoft SQL Serverdevtoolsx861ib。将开发用到的包包含到工程中。project(工程)->Settings(设置)->Link->Object(对象)/Library Modules(库模块),添加库文件:SQLakw32.lib, Caw32.lib。这两个文件之间用空格分开。 注意:在VC+6.0中要先创建一个 "WIN32 Console Application"的Proiect,才可以做该设置。2、预编译1)复制ESQL预编译文件及库文

7、件C语言编译程序不能识别应用程序中的SQL语句,需要经过预处理程序将其转换成C语句。SQL Server的预处理程序是nsqlprep.exe。 nsqlprep.exe在SQL Server安装日录的MSSQLBinn下。若SQL Server数据库采用的是默任安装方式,则需要把nsqlprep.exe、SQLAIW32.DLL、SQLAKW32.DLL三个文件拷贝到MSSQLBinn目录下。 2) 将动态链接库SQLAKW32.dll,SQLAIW32.dll文件拷贝到操作系统目录下的子目录C:WINDOWSsystem32中。预编译nsqlprep.exe配置生成:tess.c3)tes

8、s.c加入工程Esql创建嵌入式SQL的C源文件Esql.cess.sqc文件#include<stdio.h> void main() EXEC SQL BEGIN DECLARE SECTION; char first_name40; char last_name="White" EXEC SQL END DECLARE SECTION; EXEC SQL CONNECT TO SONGYNTAO-PC.pubs USER sa.since1992; EXEC SQL SELECT au_fname INTO :first_name from authors

9、 WHERE au_lname =:last_name; EXEC SQL DISCONNECT ALL; printf("first name: %s n", first_name); 4)编译,连接与运行      在VC+6.0中创建一个 "WIN32 Console Application"的Proiect,然后将预编译生成的c文件加入Proiect,编译连接即可生成访问SQL Server的可执行程序。 3. 出现的问题:实验上机前,因为个人电脑安装C+在D盘,所以实验初始化Visual C+

10、6.0编译器环境以及初始化SQL Server的预编译环境时,利用附件里的运行程序直接浏览编译再运行文件。在联系到数据库时需要建立一个数据库名首字母不为数字的标示符,以便运行。在实验上机时不能运用附件的运行程序运行文件。故所有的运行程序必须在在命令行方式下运行。编写程序:#include <stdio.h>#include <stdlib.h>EXEC SQL BEGIN DECLARE SECTION; /*主变量说明开始*/ char deptname22;char HSno10;char HSname22; char HSsex4;int HSage;int NE

11、WAGE;long SQLCODE;EXEC SQL END DECLARE SECTION; EXEC SQL INCLUDE sqlca; /*/int main(void) int count = 0;char yn; printf("Please choose the department name(CS/MA/IS): "); scanf("%s", deptname); EXEC SQL CONNECT TO Student; EXEC SQL DECLARE SX CURSOR FOR SELECT Sno, Sname, Ssex, Sa

12、ge FROM StudentWHERE SDept = :deptname;EXEC SQL OPEN SX; for (;) EXEC SQL FETCH SX INTO :HSno, :HSname, :HSsex,:HSage;if (sqlca->sqlcode != 0) printf("数据处理结束!");break; if(count+ = 0) printf("n%-10s %-22s %-4s %-10sn", "Sno", "Sname", "Ssex", "

13、;Sage");printf("%-10s %-22s %-4s %-10dn", HSno, HSname, HSsex, HSage); printf("UPDATE AGE(y/n)?"); /*询问用户是否要更新该学生的年龄*/do scanf("%c",&yn);while(yn != 'N' && yn != 'n' && yn != 'Y' && yn != 'y');if (yn = 

14、9;y' | yn = 'Y') /*如果选择更新操作*/ printf("INPUT NEW AGE:"); scanf("%d",&NEWAGE); /*用户输入新年龄到主变量中*/ EXEC SQL UPDATE Student /*嵌入式SQL*/ SET Sage = :NEWAGE WHERE CURRENT OF SX ; /*对当前游标指向的学生年龄进行更新*/EXEC SQL CLOSE SX; /*关闭游标SX不再和查询结果对应*/EXEC SQL COMMIT WORK; /*提交更新*/EXEC S

15、QL DISCONNECT TEST; /*断开数据库连接*/4. 解决方案(列出遇到的问题和解决办法,列出没有解决的问题):实验如下所示:运行结果如下所示:2存储过程:实验内容与完成情况:新建存储过程:CREATE PROCEDURE Count_r (HCname char(40) as select Count(sno) as 优秀人数from course,stc where o=o and cname=HCname and score between 90 and 100; select Count(sno) as 良好人数from course,stc where o=o and

16、cname=HCname and score between 80 and 90 ; select Count(sno) as 一般人数from course,stcwhere o=o and cname=HCname and score between 70 and 80 ; select Count(sno) as 及格人数from course,stc where o=o and cname=HCname and score between 60 and 70 ; select Count(sno) as 不及格人数from course,stc where o=o and cname=

17、HCname and score between 0 and 60;GOexec Count_rHCname='java'2. 出现的问题 在新建存储过程中如果在执行之后再修改存储过程,数据库会提示存储过程xxx已经存在,无法完成修改,并且会在查询中报错。3. 解决的办法:执行指令drop proc XXX;将存储过程删除后重新输入。就能正常解决,实现上述的的查询结果。3. ODBC链接数据库:实验内容与完成情况1、配置ODBC,为SQL Server添加数据源2.ODBC应用程序流程a.初始化阶段分配环境句柄分配连接句柄在分配连接句柄前,最好先设置环境句柄所用的ODBC参数b

18、.建立连接 分配语句句柄程序主体c.结束部分释放语句句柄 断开数据源连接释放连接句柄 释放环境句柄 二:编写程序查询stc的数据#include<windows.h> #include<stdio.h> #include<stdlib.h> #include<string.h> #include <sql.h> #include <sqlext.h> #include <iostream> #include <odbcinst.h> using namespace std; char hosts =

19、 "127.0.0.1" #define isSuc(result) (result) = SQL_SUCCESS | (result) = SQL_SUCCESS_WITH_INFO) int main(void) short sret; /返回代码 HENV henv; /环境句柄 HDBC hdbc; /连接句柄 HSTMT hstmt;/sql语句执行句柄,相当于游标 /动态创建系统DSN数据源,需要包含odbcinst.h,SQL Server不需要添加用户名密码 /在使用某个数据库的ODBC管理器之前,首先要查看是否安装了这个数据库的ODBC驱动,如果没有先安装

20、再使用,比如DB2就没有默认安装 /SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN,"SQL Server","DSN=trantest0 UID=sa0 PWD=1234560 SERVER=192.168.100.540 DATABASE=warehouse0"); bool sucess = SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN,"SQL Server","DSN=stu0 SERVER=127.0.0.10 DATABASE=stu0&

21、quot;); if (sucess) printf("DSN created sucessfully!n"); else exit(0); /* 申请环境句柄*/ sret = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv); if(!isSuc(sret) printf("申请环境句柄出错n"); SQLFreeHandle(SQL_HANDLE_ENV, henv); /* 设置环境属性,注册ODBC版本*/ sret = SQLSetEnvAttr(henv,SQL_ATTR_OD

22、BC_VERSION,(void*)SQL_OV_ODBC3,0); if(!isSuc(sret) printf("注册ODBC版本出错n"); /* 申请连接句柄*/ sret = SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc); if(!isSuc(sret) printf("申请连接句柄出错n"); SQLFreeHandle(SQL_HANDLE_DBC, hdbc); /* 设置连接属性,此处设置为手动提交*/ sret = SQLSetConnectAttr(hdbc,SQL_ATTR_AUTOC

23、OMMIT,(void*)SQL_AUTOCOMMIT_OFF,SQL_IS_POINTER); if(!isSuc(sret)printf("设置连接属性出错n"); /* 连接数据源,这里的数据源使用的是动态创建的数据源*/ sret = SQLConnect(hdbc,(SQLCHAR *)"stu",SQL_NTS,(SQLCHAR *)"sa",SQL_NTS,(SQLCHAR *)"zhoubingwei",SQL_NTS); if(!isSuc(sret)printf("连接%s出错n&qu

24、ot;, hosts); else printf("连接%s成功n", hosts); /* 申请执行语句句柄*/ sret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); if(!isSuc(sret) printf("申请执行语句句柄时出错n"); SQLFreeHandle(SQL_HANDLE_STMT, hstmt); /记录更新语句影响的行数 SQLINTEGER row_count; SQLExecDirect(hstmt,(SQLCHAR*)"insert into od

25、bctest values(100,'name','2011-11-30')",SQL_NTS); /执行sql语句后影响的行数,select查询语句返回-1 SQLRowCount(hstmt,&row_count); printf("affcted count is: %dn",row_count); SQLExecDirect(hstmt,(SQLCHAR*)"insert into odbctest values(200,'name','2011-11-30')",

26、SQL_NTS); SQLRowCount(hstmt,&row_count); printf("affcted count is: %dn",row_count); SQLExecDirect(hstmt,(SQLCHAR*)"delete from odbctest where a=200",SQL_NTS); SQLRowCount(hstmt,&row_count); printf("affcted count is: %dn",row_count); /对更新类的sql执行后进行提交或者回滚 sret = S

27、QLEndTran(SQL_HANDLE_DBC,hdbc,SQL_COMMIT); /sret = SQLEndTran(SQL_HANDLE_DBC,hdbc,SQL_ROLLBACK); if (sret != SQL_SUCCESS) printf("服务器%s执行查询出错n", hosts); else printf("服务器%s执行查询成功n", hosts); SQLExecDirect(hstmt,(SQLCHAR*)"select * from odbctest",SQL_NTS); int set_num = 0;

28、 SQLINTEGER ID; SQLSMALLINT col_num; SQLCHAR szId50,szName50,szTime50; SQLINTEGER cbID,cbName,cbTime; /得到结果集中列数 SQLNumResultCols(hstmt,&col_num); printf("column number is: %dn",col_num); /要遍历所有的结果集可以利用下面的方法: while(SQL_NO_DATA != SQLFetch(hstmt) /移动光标,一直到集合末尾 /得到光标处某列的值 SQLGetData(hstmt

29、,1,SQL_C_ULONG,&ID,0,&cbID); SQLGetData(hstmt,2,SQL_C_CHAR,szName,50,&cbName); SQLGetData(hstmt,3,SQL_C_CHAR,szTime,50,&cbTime); /有与ODBC没有MoveNext和MoveLast API所以这样获取数据集行数 set_num+; printf("%d, %s, %sn",ID,szName,szTime); printf("the numbers of set is: %dn",set_num); /* 释放各个句柄,注意顺序,不要改变*/ SQLFreeHandle(SQL_HANDLE_STMT, hstmt); SQLDisconnect(hdbc); SQLFreeHandle(SQL_HANDLE_DBC,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论