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的预编译环境时,利用附件里的运行程序直接浏览编译再运行文件。

在联系到数据库时需要建立一个数据库名首字母不为数字的标示符,以便运行。在实验上机时不能运用附件的运行程序运行文件。故所有的运行程序必须在在命令行方式下运行。