数据库实验报告六--通过嵌入式SQL访问数据库
Word文档:传送门
嵌入式SQL的C语言应用程序在VC++6.0、SQL Server 2000环境下的调试可分为五步:
第一步 环境初始化;
第二步 预编译;
第三步 编译;
第四步 连接;
第五步 运行。
一、软件安装及环境配置
1.将“DEVTOOLS”文件夹复制到“C:\Program Files\Microsoft SQL Server”。
2.初始化VC++编译器环境。在命令行方式下运行文件“\VC98\Bin\vcvars32.bat”。
3.初始化SQLServer预编译环境。命令行运行“\Devtools\samples\esqlc\setenv.bat”。
4.将“binn”文件夹内容复制到“C:\Program Files\Microsoft SQL Server\MSSQL\Binn”。
5.VC6.0环境配置。具体配置分为如下三步:
①Tools->options->directories->Include Files:添加 C:\Program Files\Microsoft SQL Server\devtools\include。将SQL server自带的用于数据库开发的头文件包含到工程环境中。
②Tools->options->directories->Lib Files:添加C:\Program Files\Microsoft SQL Server\devtools\x861ib。将开发用到的包包含到工程中。
③Tools->options->directories->Executable Files:添加 C:\Program Files\ Microsoft SQL Server\MSSQL\Binn。
6.以管理员身份打开CMD进行注册,regsvr32 "VC6\Common\MSDev98 \AddIns\FileTool.dll",
7.提示成功,打开VC6.0,右击工具栏,选择 自定义--->附加项和宏文件,选中FileTool Developer Studio Add-in附加项
2、预编译
1)复制ESQL预编译文件及库文件
C语言编译程序不能识别应用程序中的SQL语句,需要经过预处理程序将其转换成C语句。SQL Server的预处理程序是nsqlprep.exe。 nsqlprep.exe在SQL Server安装日录的MSSQL\Binn下。若SQL Server数据库采用的是默任安装方式,则需要把nsqlprep.exe、SQLAIW32.DLL、SQLAKW32.DLL三个文件拷贝到MSSQL\Binn目录下。
2)将动态链接库SQLAKW32.dll,SQLAIW32.dll文件拷贝到操作系统目录下的子目录C:\WINDOWS\system32中。
3)创建嵌入式SQL的C源文件Esql.c
#include <stdio.h>
#include <stdlib.h>
EXEC SQL BEGIN DECLARE SECTION; /*主变量说明开始*/
char deptname[22];
char HSno[10];
char HSname[22];
char HSsex[4];
int HSage;
int NEWAGE;
long SQLCODE;
EXEC SQL END DECLARE SECTION; /*主变量说明结束*/
EXEC SQL INCLUDE sqlca; /*定义SQL通信区*/
/*************************************************************************/
int main(void) /*C语言主程序开始*/
{
int count = 0;
char yn; /*变量yn代表yes或no*/
printf("Please choose the department name(CS/MA/IS): ");
scanf("%s", deptname); /*为主变量deptname赋值*/
EXEC SQL CONNECT TO Student; /*连接数据库STUDENTDb*/
EXEC SQL DECLARE SX CURSOR FOR /*定义游标*/
SELECT Sno, Sname, Ssex, Sage /*SX对应语句的执行结果*/
FROM Student
WHERE SDept = :deptname;
EXEC SQL OPEN SX; /*打开游标SX便指向查询结果的第一行*/
for (;;) /*用循环结构逐条处理结果集中的记录*/
{
EXEC SQL FETCH SX INTO :HSno, :HSname, :HSsex,:HSage;
/*推进游标,将当前数据放入主变量*/
if (sqlca->sqlcode != 0) /* sqlcode != 0,表示操作不成功*/
{printf("数据处理结束!");
break; /*利用SQLCA中的状态信息决定何时退出循环*/}
if(count++ == 0) /*如果是第一行的话,先打出行头*/
printf("\n%-10s %-22s %-4s %-10s\n", "Sno", "Sname", "Ssex", "Sage");
printf("%-10s %-22s %-4s %-10d\n", HSno, HSname, HSsex, HSage);
/*打印查询结果*/
printf("UPDATE AGE(y/n)?"); /*询问用户是否要更新该学生的年龄*/
do{
scanf("%c",&yn);
}
while(yn != 'N' && yn != 'n' && yn != 'Y' && yn != 'y');
if (yn == '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 SQL DISCONNECT TEST; /*断开数据库连接*/
}
4)关闭C源文件MyEsql.c,并将其备份,然后更改源文件的扩展名为“.sqc”。
5)在命令行下运行ESQL预编译程序nsqlprep.exe程序:
nsqlprep MyEsql.sqc 若运行成功,则生成MyEsql.c,将该文件添加到VC工程中编译即可。
6)编译,连接与运行
在VC++6.0中创建一个 "WIN32 Console Application"的Proiect,然后将预编译生成的c文件加入Proiect,编译连接即可生成访问SQL Server的可执行程序。
6. 出现的问题:
实验上机前,因为个人电脑安装C++在D盘,所以实验初始化Visual C++ 6.0编译器环境以及初始化SQL Server的预编译环境时,利用附件里的运行程序直接浏览编译再运行文件。
在联系到数据库时需要建立一个数据库名首字母不为数字的标示符,以便运行。在实验上机时不能运用附件的运行程序运行文件。故所有的运行程序必须在在命令行方式下运行。