基于C语言与SQLServer2000的嵌入式SQL编程技术
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
择,请重新选择!”); break; } if (choice==5) break; //结束处理
} printf(“/n/n 谢谢使用!/n/n”); } else { printf(“数据库或网络错误!”); } return(0); } (2)插入模块 void insert() //该函数提示输入学生的基本信息,然 后将其插入数据库表中 { EXEC SQL BEGIN DECLARE SECTION; //开始定义主变量 char Msno[6]; char Msname[8]; char Msex[2]; int Mage;
1.SQL 通信区 SQL Server 数据库管理系统提供了一个通信区 SQLCA, 作为 SQL Server2000 和应用程序的一个接口,该结构变量是 为诊断错误和事件处理而设置的。SQL 语句执行后,系统将当 前工作状态和运行环境的各种参数送到通信区 SQLCA 中,主 语言的应用程序从 SQLCA 中取出这些状态信息以决定其语句 的执行。在 C 语言中定义 SQL 通信区的语句为: EXEC SQL INCLUDE SQLCA; 2.变量的说明与引用 嵌入式 SQL 中有两种变量:主变量和指示变量。SQL 语句 中使用的主语言程序定义的变量称为主变量,主要完成嵌入 式 SQL 语句的数据输入与输出。指示变量是与主语言相关联 的一类 SQL 变量,被用于监督和管理与其相关联的主变量。 每个主变量都可以定义一个指示器变量。指示其变量的具体 作用是:向数据库表列输入 NULL 值,检查从数据库表列中选 取的数据是否是 NULL 值或者是否发生截断问题。 SQL 变量在引用之前要先说明,在说明段内使用 C 语言的 类型说明语句为每个 SQL 变量指定一个 SQL Server 能支持的 C 数据类型。如: EXEC SQL BEGIN DECLARE SECTION; //开始定义
【中图分类号】
【文献标识码】
【文章编号】1008-1151(2011)02-0042-03
(一)概述
结构化查询语言(Structured Query Language, SQL)是 最普遍使用的关系数据库语言,它具有表达能力强,功能丰 富,语言简洁,使用灵活等特点,在许多数据库系统环境中, 它作为独立语言由用户在交互环境下使用。
(二)基于 C 语言和 SQL Server2000 的嵌入式 SQL 的形式
对于嵌入式 SQL 语句,数据库管理系统可采用两种方法 处理:一种是预编译方法;另一种是修改和扩充主语言使其 能识别处理 SQL 语句。本文采用的是 SQL Server2000 预编译 方法,由 DBMS 的预编译器(NSQLPREP 文件)扫描识别处理源 程序中的 SQL 语句,把 SQL 语句转换成主语言(C 语言)调用 语句,以使主语言编译程序(这里采用 VC++编译程序)能识 别它并将整个源程序编译成目标代码,连接后形成可执行文 件。
嵌入式 SQL 语句分为可执行语句和说明性语句,可执行 语句可出现在主语言中任何允许高级语言的执行语句出现的 地方,它完成在交互式环境下的 SQL 语句能完成的任务,包
括数据定义、数据控制和数据操纵三种语句。说明性语句用 于声明通信区和 SQL 变量等。位于主语言中任何允许出现说 明性的语句的地方。
Leabharlann Baidu
类型 CHAR CHAR CHAR
INT CHAR CHAR
长度 6 8 2
20 30
图 1 学生基本信息表 S 的结构
3.程序模块结构 该 C 程序主要由一个 MAIN 函数及四个子函数构成,通过 对四个子函数的调用来完成对学生基本信息表的操作,其模 块结构如图 2 所示。
图 2 程序模块结构图
4.部分程序清单 (1)主程序模块 #include<stdio.h> void insert(),delete(), update(),query(); //外部 函数说明 main() //总控程序 {
printf(“/n**1)插入 2)删除 3)更新 4)查询
- 43 -
5)退出**”); //菜单 printf(“/n 请选择:/n”); scanf(“%d”,&choice); switch(choice) { case 1: insert (); break; case 2: delete (); break; case 3: update(); break; case 4: query (); break; case 5: break; default: printf(“/n/n 不 合 法 的 选
2011 年第 2 期 (总第 138 期)
大众科技 DA ZHONG KE JI
No.2,2011 (Cumulatively No.138)
基于 C 语言与 SQL Server2000 的嵌入式 SQL 编程技术
吴璟莉 1 刘仁辉 2
(1.广西师范大学,广西 桂林 541004;2.桂林空军学院,广西 桂林 541003)
2.数据库表结构 本文设计了一个包含数据插入、删除、更新和查询的例子。 在 SQL Server2000 DBMS 中 设 计 了 一 个 学 生 信 息 数 据 库 student,用户名和密码均为“ww”,其中的学生基本信息表 S 的结构如图 1 所示。
字段名 SNO SNAME SEX AGE DEPT ADDR
由于 SQL 语言是一种面向集合运算的描述性语言,本身 不具有过程性结构,而许多实际事物处理应用都是过程性的, 需要根据不同的条件来执行不同的任务,因此单纯用 SQL 语 言在交互式环境中执行很难满足应用的需求。为了解决这一 问题,将 SQL 语言嵌入到某种高级语言中使用,利用高级语 言的过程性结构来弥补 SQL 语言实现复杂应用方面的不足, 相辅相成,发挥各自优势。这种方式下使用的 SQL 语言称为 嵌入式 SQL,而嵌入 SQL 的高级语言称为主语言或宿主语言。
char Mdept[20]; char Maddr[30]; int num; EXEC SQL END DECLARE SECTION; //结束定义主变量 printf(“/n/n 开始输入请键入 1,结束输入请键入 0: ”); scanf(“%d/n”, &num); while(num==1) {
【摘 要】文章旨在研究用嵌入式 SQL 语言开发 SQL Server 数据库应用的方法。首先介绍了 C 语言与 SQL Server2000 的
嵌入式 SQL 的形式,然后给出嵌入式 SQL 语句与 C 宿主语言之间的通信方式及程序结构,最后给出了代码实例。
【关键词】嵌入式 SQL;宿主语言;SQL Server2000 数据库
(四)程序结构
嵌入式 SQL 语句在 C 语言中的编程结构一般分为以下四 步:
1.定义通信区域。 2.定义主变量。 3.连接所要访问的数据库。 4.访问数据库。
(五)实例说明
1.软件安装及环境设置 安装 SQL Server2000 时,使用客户自定义模式,选中“头 文件和库文件、MAC、SDK、备份/还原 API 和调试程序界面” 进行安装。 在 VC++6.0 中 新 建 名 为 STU 的 WIN32 Console Application 工程文件。在“工具”菜单项下选择“选择”, 再选择“目录”以设置工作区的的运行环境。 (1)在“S 显示目录为”下拉框中选择“Include files”, 在路径编辑框中输入 SQL Server 开发工具的头文件路径 “C:\PROGRAM FILES\MICROSOFT SQL SERVER\80\TOOLS\ DEVTOOLS\INCLUDE”;同理,新增“Library files”的路径 “ C:\PROGRAM FILES\MICROSOFT SQL SERVER\80\TOOLS\ DEVTOOLS\LIB”和“Executable files”的路径“C:\PROGRAM FILES\MICROSOFT SQL SERVER\ MSSQL\BINN”。 ( 2 ) 在 STU 工 程 的 源 文 件 目 录 下 创 建 并 添 加 文 件 student.sqc,编写嵌入式 SQL 的 C 源程序,程序部分代码见 (5)。 (3)在 student.sqc 文件上单击右键,选择 settings, 在命令编辑框中输入“NSQLPREP student.sqc”,在输出编辑 框中输入“student.c”。编译 student.sqc,将其预编译成 student.c。再将 student.c 加到源文件目录下,将其编译成 目标文件。
(三)嵌入式 SQL 语句与 C 宿主语言之间的通信
C 语言是一种过程性的、与运行环境有关的语言,SQL 语 言是面向集合的描述性、非过程性语言,将两者混合编程, 目的在于发挥各自的优势,SQL 语句负责操纵 SQL Server2000 数据库,C 语言负责控制程序流程。程序执行过程中,两者之 间需要进行通信,过程如下: SQL 语句将执行状态信息传给 C 语言;C 语言给 SQL 语句提供一些变量参数;将 SQL 语句查 询结果返回给 C 语言做进一步处理。
(4)单击“工程”菜单项下的“设置”命令,在 link 页 下 的 object/library modules 中 加 入 “ caw32.lib 和 sqlakw32.lib”两个库,并将“MICROSOFT SQL SERVER\MSSQL\ BINN”下的 sqlakw.32.dll 复制到当前目录或工程目录中, 并 保 证 windows 的 system 目 录 下 有 Ntwdblib.dll 和 Dbnmpntw.dll,则可连接成功。
INTO :grade:gradeid FROM SC WHERE SNO=:sno and CNO=:cno; if (gradeid=-1) //指示器变量 gradeid 为-1,表示 GRADE 字段的值为 NULL printf(“对不起,该生这门课没有成绩!”); 3.连接 SQL Server 数据库 C 程序的主函数中应包含一条登录语句,向预编译程序提 供用户名和口令,以与 SQL Server 数据库管理系统建立连接, 其命令语法为: EXEC SQL CONNECT TO 服务器名.数据库名 AS 连接名 USER 用户名.口令
EXEC SQL INCLUDE SQLCA; //定义通信区 int choice; EXEC SQL CONNECT to student USER ww.ww; //登录 到 SQL Server 上 if (SQLCODE==0) {
printf(“连接到 SQL Server2000 数据库上!”); for( ; ; ) {
为了在嵌入式 SQL 中区别 SQL 语句与主语言语句,须在 所有的 SQL 语句前加前缀 EXEC SQL,而 SQL 语句的结束标志 随宿主语言的不同而不同,C 语言中以分号结束,一般形式为 “EXEC SQL <SQL 语句>;”。例如一条交互形式的 SQL 语句 “SELECT sno, cno, grade FROM course;”,嵌入到 C 程序 中,应写作“EXEC SQL SELECT sno, cno, grade FROM course;”
Char sno[8];
【收稿日期】2010-12-18 【作者简介】吴璟莉(1978-),女(满族),广西博白人,广西师范大学计算机科学与信息工程学院副教授;刘仁辉(1980 -),男,山西运城人,桂林空军学院训练部讲师。
- 42 -
Char cno[8]; Int grade:gradeid; // gradeid 为 grade 的指示 变量 EXEC SQL END DECLARE SECTION; //结束定义 在 SQL 语句中使用 SQL 变量时,必须在其之前加一个冒 号以与字段名相区别,但是在 C 语句中引用时,不需加冒号。 指示器变量引用时必须附在其相关联的主变量之后。例如: EXEC SQL SELECT GRADE
} printf(“/n/n 谢谢使用!/n/n”); } else { printf(“数据库或网络错误!”); } return(0); } (2)插入模块 void insert() //该函数提示输入学生的基本信息,然 后将其插入数据库表中 { EXEC SQL BEGIN DECLARE SECTION; //开始定义主变量 char Msno[6]; char Msname[8]; char Msex[2]; int Mage;
1.SQL 通信区 SQL Server 数据库管理系统提供了一个通信区 SQLCA, 作为 SQL Server2000 和应用程序的一个接口,该结构变量是 为诊断错误和事件处理而设置的。SQL 语句执行后,系统将当 前工作状态和运行环境的各种参数送到通信区 SQLCA 中,主 语言的应用程序从 SQLCA 中取出这些状态信息以决定其语句 的执行。在 C 语言中定义 SQL 通信区的语句为: EXEC SQL INCLUDE SQLCA; 2.变量的说明与引用 嵌入式 SQL 中有两种变量:主变量和指示变量。SQL 语句 中使用的主语言程序定义的变量称为主变量,主要完成嵌入 式 SQL 语句的数据输入与输出。指示变量是与主语言相关联 的一类 SQL 变量,被用于监督和管理与其相关联的主变量。 每个主变量都可以定义一个指示器变量。指示其变量的具体 作用是:向数据库表列输入 NULL 值,检查从数据库表列中选 取的数据是否是 NULL 值或者是否发生截断问题。 SQL 变量在引用之前要先说明,在说明段内使用 C 语言的 类型说明语句为每个 SQL 变量指定一个 SQL Server 能支持的 C 数据类型。如: EXEC SQL BEGIN DECLARE SECTION; //开始定义
【中图分类号】
【文献标识码】
【文章编号】1008-1151(2011)02-0042-03
(一)概述
结构化查询语言(Structured Query Language, SQL)是 最普遍使用的关系数据库语言,它具有表达能力强,功能丰 富,语言简洁,使用灵活等特点,在许多数据库系统环境中, 它作为独立语言由用户在交互环境下使用。
(二)基于 C 语言和 SQL Server2000 的嵌入式 SQL 的形式
对于嵌入式 SQL 语句,数据库管理系统可采用两种方法 处理:一种是预编译方法;另一种是修改和扩充主语言使其 能识别处理 SQL 语句。本文采用的是 SQL Server2000 预编译 方法,由 DBMS 的预编译器(NSQLPREP 文件)扫描识别处理源 程序中的 SQL 语句,把 SQL 语句转换成主语言(C 语言)调用 语句,以使主语言编译程序(这里采用 VC++编译程序)能识 别它并将整个源程序编译成目标代码,连接后形成可执行文 件。
嵌入式 SQL 语句分为可执行语句和说明性语句,可执行 语句可出现在主语言中任何允许高级语言的执行语句出现的 地方,它完成在交互式环境下的 SQL 语句能完成的任务,包
括数据定义、数据控制和数据操纵三种语句。说明性语句用 于声明通信区和 SQL 变量等。位于主语言中任何允许出现说 明性的语句的地方。
Leabharlann Baidu
类型 CHAR CHAR CHAR
INT CHAR CHAR
长度 6 8 2
20 30
图 1 学生基本信息表 S 的结构
3.程序模块结构 该 C 程序主要由一个 MAIN 函数及四个子函数构成,通过 对四个子函数的调用来完成对学生基本信息表的操作,其模 块结构如图 2 所示。
图 2 程序模块结构图
4.部分程序清单 (1)主程序模块 #include<stdio.h> void insert(),delete(), update(),query(); //外部 函数说明 main() //总控程序 {
printf(“/n**1)插入 2)删除 3)更新 4)查询
- 43 -
5)退出**”); //菜单 printf(“/n 请选择:/n”); scanf(“%d”,&choice); switch(choice) { case 1: insert (); break; case 2: delete (); break; case 3: update(); break; case 4: query (); break; case 5: break; default: printf(“/n/n 不 合 法 的 选
2011 年第 2 期 (总第 138 期)
大众科技 DA ZHONG KE JI
No.2,2011 (Cumulatively No.138)
基于 C 语言与 SQL Server2000 的嵌入式 SQL 编程技术
吴璟莉 1 刘仁辉 2
(1.广西师范大学,广西 桂林 541004;2.桂林空军学院,广西 桂林 541003)
2.数据库表结构 本文设计了一个包含数据插入、删除、更新和查询的例子。 在 SQL Server2000 DBMS 中 设 计 了 一 个 学 生 信 息 数 据 库 student,用户名和密码均为“ww”,其中的学生基本信息表 S 的结构如图 1 所示。
字段名 SNO SNAME SEX AGE DEPT ADDR
由于 SQL 语言是一种面向集合运算的描述性语言,本身 不具有过程性结构,而许多实际事物处理应用都是过程性的, 需要根据不同的条件来执行不同的任务,因此单纯用 SQL 语 言在交互式环境中执行很难满足应用的需求。为了解决这一 问题,将 SQL 语言嵌入到某种高级语言中使用,利用高级语 言的过程性结构来弥补 SQL 语言实现复杂应用方面的不足, 相辅相成,发挥各自优势。这种方式下使用的 SQL 语言称为 嵌入式 SQL,而嵌入 SQL 的高级语言称为主语言或宿主语言。
char Mdept[20]; char Maddr[30]; int num; EXEC SQL END DECLARE SECTION; //结束定义主变量 printf(“/n/n 开始输入请键入 1,结束输入请键入 0: ”); scanf(“%d/n”, &num); while(num==1) {
【摘 要】文章旨在研究用嵌入式 SQL 语言开发 SQL Server 数据库应用的方法。首先介绍了 C 语言与 SQL Server2000 的
嵌入式 SQL 的形式,然后给出嵌入式 SQL 语句与 C 宿主语言之间的通信方式及程序结构,最后给出了代码实例。
【关键词】嵌入式 SQL;宿主语言;SQL Server2000 数据库
(四)程序结构
嵌入式 SQL 语句在 C 语言中的编程结构一般分为以下四 步:
1.定义通信区域。 2.定义主变量。 3.连接所要访问的数据库。 4.访问数据库。
(五)实例说明
1.软件安装及环境设置 安装 SQL Server2000 时,使用客户自定义模式,选中“头 文件和库文件、MAC、SDK、备份/还原 API 和调试程序界面” 进行安装。 在 VC++6.0 中 新 建 名 为 STU 的 WIN32 Console Application 工程文件。在“工具”菜单项下选择“选择”, 再选择“目录”以设置工作区的的运行环境。 (1)在“S 显示目录为”下拉框中选择“Include files”, 在路径编辑框中输入 SQL Server 开发工具的头文件路径 “C:\PROGRAM FILES\MICROSOFT SQL SERVER\80\TOOLS\ DEVTOOLS\INCLUDE”;同理,新增“Library files”的路径 “ C:\PROGRAM FILES\MICROSOFT SQL SERVER\80\TOOLS\ DEVTOOLS\LIB”和“Executable files”的路径“C:\PROGRAM FILES\MICROSOFT SQL SERVER\ MSSQL\BINN”。 ( 2 ) 在 STU 工 程 的 源 文 件 目 录 下 创 建 并 添 加 文 件 student.sqc,编写嵌入式 SQL 的 C 源程序,程序部分代码见 (5)。 (3)在 student.sqc 文件上单击右键,选择 settings, 在命令编辑框中输入“NSQLPREP student.sqc”,在输出编辑 框中输入“student.c”。编译 student.sqc,将其预编译成 student.c。再将 student.c 加到源文件目录下,将其编译成 目标文件。
(三)嵌入式 SQL 语句与 C 宿主语言之间的通信
C 语言是一种过程性的、与运行环境有关的语言,SQL 语 言是面向集合的描述性、非过程性语言,将两者混合编程, 目的在于发挥各自的优势,SQL 语句负责操纵 SQL Server2000 数据库,C 语言负责控制程序流程。程序执行过程中,两者之 间需要进行通信,过程如下: SQL 语句将执行状态信息传给 C 语言;C 语言给 SQL 语句提供一些变量参数;将 SQL 语句查 询结果返回给 C 语言做进一步处理。
(4)单击“工程”菜单项下的“设置”命令,在 link 页 下 的 object/library modules 中 加 入 “ caw32.lib 和 sqlakw32.lib”两个库,并将“MICROSOFT SQL SERVER\MSSQL\ BINN”下的 sqlakw.32.dll 复制到当前目录或工程目录中, 并 保 证 windows 的 system 目 录 下 有 Ntwdblib.dll 和 Dbnmpntw.dll,则可连接成功。
INTO :grade:gradeid FROM SC WHERE SNO=:sno and CNO=:cno; if (gradeid=-1) //指示器变量 gradeid 为-1,表示 GRADE 字段的值为 NULL printf(“对不起,该生这门课没有成绩!”); 3.连接 SQL Server 数据库 C 程序的主函数中应包含一条登录语句,向预编译程序提 供用户名和口令,以与 SQL Server 数据库管理系统建立连接, 其命令语法为: EXEC SQL CONNECT TO 服务器名.数据库名 AS 连接名 USER 用户名.口令
EXEC SQL INCLUDE SQLCA; //定义通信区 int choice; EXEC SQL CONNECT to student USER ww.ww; //登录 到 SQL Server 上 if (SQLCODE==0) {
printf(“连接到 SQL Server2000 数据库上!”); for( ; ; ) {
为了在嵌入式 SQL 中区别 SQL 语句与主语言语句,须在 所有的 SQL 语句前加前缀 EXEC SQL,而 SQL 语句的结束标志 随宿主语言的不同而不同,C 语言中以分号结束,一般形式为 “EXEC SQL <SQL 语句>;”。例如一条交互形式的 SQL 语句 “SELECT sno, cno, grade FROM course;”,嵌入到 C 程序 中,应写作“EXEC SQL SELECT sno, cno, grade FROM course;”
Char sno[8];
【收稿日期】2010-12-18 【作者简介】吴璟莉(1978-),女(满族),广西博白人,广西师范大学计算机科学与信息工程学院副教授;刘仁辉(1980 -),男,山西运城人,桂林空军学院训练部讲师。
- 42 -
Char cno[8]; Int grade:gradeid; // gradeid 为 grade 的指示 变量 EXEC SQL END DECLARE SECTION; //结束定义 在 SQL 语句中使用 SQL 变量时,必须在其之前加一个冒 号以与字段名相区别,但是在 C 语句中引用时,不需加冒号。 指示器变量引用时必须附在其相关联的主变量之后。例如: EXEC SQL SELECT GRADE