实验五通过嵌入式SQL访问数据库
- 格式:pdf
- 大小:295.68 KB
- 文档页数:6
嵌入式SQL编程和通过ODBC访问数据库预备知识(供大家学习参考)1)嵌入式SQL编程:嵌入式SQL由SQL语句和C/C++代码组成。
其中SQL语句由预处理器翻译成C或C++的源代码。
对预处理后的源代码进行编译、连接生成可执行程序后方可运行。
●SQL预处理器SQLServer的预处理程序是nsqlprep.exe。
其常用的语法格式如下:nsqlprep 程序文档名⏹nsqlprep详细的语法格式以及参数意义,请看联机帮助。
nsqlprep的语法格式如下:nsqlprep program_file_name [/SQLACCESS | /NOSQLACCESS][/FLAGGER {ENTRY | NONE}] [/DB [server_name.]database_name/PASS {login[.password] | $INTEGRATED}] [/BIND file_name][/MSG file_name] [/NOLOGO] [/PLAN name] [/NOLINES][/user_defined_option]⏹要求程序文档名的后缀为.sqc,可以省略。
⏹预编译后得到的文档,与程序文档同名,后缀为.c;放在与程序文档名同一个路径下nsqlprep.exe在SQLServer的安装目录的 MSSQL\Binn下。
在本机中SQLServer的安装目录是C:\Program Files\Microsoft SQL Server,nsqlprep.exe在C:\Program Files\Microsoft SQL Server\MSSQL\Binn。
由于默认的安装方式(典型安装)并没有安装应用程序nsqlprep.exe,因此,需要拷贝到该目录下。
●连接方式经预处理后的c文件就可以用c的编译器进行编译连接了。
使用Visual C++ 6.0进行编译连接,连接方式是动态连接,用到动态链接库SQLakw32.dll,sqlaiw32.dll;此两文件已经随同binn.rar的其他内容,被拷贝到C:\Program Files\Microsoft SQL Server\MSSQL\Binn下;但仍然需要把该路径加到系统的路径变量中,以使得程序运行时能找到这两个文件。
实验报告一、实验内容数据库的嵌套查询实验二、实验目的进一步掌握SQL Server的使用方法,学会利用Transact-SQL语言表达嵌套查询语句,理解相关的SQL语句。
三、实验内容用Transact-SQL表达嵌套查询操作,包括使用IN、比较符、ANY 或ALL和EXISTS等操作符,通过SQL Server查询分析器输入、分析并显示正确结果。
四、实验前准备Courses表:Reports表:Students表:五、实验结果1)求选修了高等数学的学生学号和姓名2)求C1课程的成绩高于张三的学生学号和成绩3)求其他系中比计算机系某一学生年龄小的学生4)求其他系中比计算机系学生年龄都小的学生5)求选修了C2课程的学生姓名6)求没有选修C2课程的学生姓名7)查询选修了全部课程的学生的姓名8)求至少选修了学号为“S2”的学生所选修的全部课程的学生学号和姓名六、主要实验步骤1)求选修了高等数学的学生学号和姓名select sno,snamefrom students awhere sno in(select snofrom reports bwhere sno=a.sno and cno in(select cnofrom courseswhere cno=o and cname='高等数学'))2)求C1课程的成绩高于张三的学生学号和成绩select sno,gradefrom reportswhere cno=1 and grade>(select gradefrom reportswhere cno=1 and sno=(select snofrom studentswhere sname='张三'))3)求其他系中比计算机系某一学生年龄小的学生select sno,snamefrom studentswhere sdept<>'计算机' and 2012-year(birthday)<any (select 2012-year(birthday)from studentswhere sdept='计算机')4)求其他系中比计算机系学生年龄都小的学生select sno 学号,sname 姓名from studentswhere sdept<>'计算机' and 2012-year(birthday)<all (select 2012-year(birthday)from studentswhere sdept='计算机')5)求选修了C2课程的学生姓名select snamefrom students awhere exists(select *from reportswhere cno=2 and sno=a.sno)6)求没有选修C2课程的学生姓名select snamefrom students awhere not exists(select *from reportswhere cno=2 and sno=a.sno)7)查询选修了全部课程的学生的姓名select snamefrom students awhere not exists(select *from courses bwhere not exists(select *from reportswhere cno=o and sno=a.sno))8)求至少选修了学号为“S2”的学生所选修的全部课程的学生学号和姓名select distinct sno,snamefrom students awhere not exists(select *from reports bwhere sno=2 and not exists(select *from reportswhere sno=a.sno and cno=o))七、实验出现的问题和解决办法出现的问题:查询文件关闭后开启执行出现“对象名无效”错误解决方法:(1)通过鼠标选择可用数据库为Teach数据库,即对象数据库;(2)利用SQL语句“USE Teach”即“USE ”+数据库名称指定对象数据库。
实验四:访问数据库一、实验目的利用ODBC和任意一种高级语言,编写一段访问数据库的程序。
要求该程序可以实现查询,插入、删除和更新功能。
二、实验代码这次试验是使用C#编写的,界面与代码如下:string connString = "Data Source=(local);Initial Catalog=Factory;Integrated Security=True;";SqlConnection connection = new SqlConnection(connString);connection.Open();string SCommand = "select * from 工作人员表;SqlDataAdapter adapter = new SqlDataAdapter(SCommand, connection);DataSet DSet = new DataSet();adapter.Fill(DSet, "工作人员表");dataGridView1.AutoGenerateColumns = true;dataGridView1.DataSource = DSet.Tables[0].DefaultView;connection.Close();string connString = "Data Source=(local);Initial Catalog=Factory;Integrated Security=True;";SqlConnection connection = new SqlConnection(connString);connection.Open();if (textBox1.Text.Length == 0){linkLabel1.Visible = true;}else if (textBox2.Text.Length == 0){linkLabel1.Visible = false;linkLabel2.Visible = true;}else{linkLabel1.Visible = false;linkLabel2.Visible = false; ;string data = string.Format("insert into 工作人员表values('" + textBox1.Text + "','" + textBox2.Text + "','" + comboBox1.Text + "','{0}','" + comboBox2.Text +"')",dateTimePicker1.Value.ToString("yyyy/MM/dd")); //写成comboBox1.SelectedText不行,记得区分SqlCommand com = new SqlCommand(data, connection);int m = com.ExecuteNonQuery();if (m != 0)MessageBox.Show("插入成功!");elseMessageBox.Show("不好意思,插入不成功,请重新插入!");}connection.Close();string connString = "Data Source=(local);Initial Catalog=Factory;Integrated Security=True;";SqlConnection connection = new SqlConnection(connString);connection.Open();string id = dataGridView2.CurrentRow.Cells["人员编号"].Value.ToString();//string data = "delete from 工作人员表where 人员编号? = '" + id + "'";SqlCommand com = new SqlCommand(data, connection);int m = com.ExecuteNonQuery();if (m != 0)MessageBox.Show("删¦除成功!");elseMessageBox.Show("不好意思,删除不成功,请重新删¦除!");this.dataGridView2.Rows.Remove(this.dataGridView2.CurrentRow);//connection.Close();string connString = "Data Source=(local);Initial Catalog=Factory;Integrated Security=True;";SqlConnection connection = new SqlConnection(connString);connection.Open();string人员编号= dataGridView3.CurrentRow.Cells["人员编号"].Value.ToString();//string姓名= dataGridView3.CurrentRow.Cells["姓名"].Value.ToString();string性别= dataGridView3.CurrentRow.Cells["性别"].Value.ToString();DateTime出生日期=Convert.ToDateTime(dataGridView3.CurrentRow.Cells["出生日期"].Value.ToString().Trim());// DateTime 出生日期= Convert.ToDateTime(dataGridView3.CurrentRow.Cells["出生日期"].Value.ToString()); ////this.dataGridView3.CurrentRow.Cells["出生日期"].Value.ToString();string职务= dataGridView3.CurrentRow.Cells["职务"].Value.ToString();string data = string.Format("update 工作Á人员表set 人员编À号= '" + 人员编À号+ "',姓名= '" + 姓名+ "',性别= '" + 性别+ "',出生日期={0},职务= '" + 职务?+ "' where 人员编号= '" + 人员编号+ "'",出生日期.ToString("yyyy/MM/dd"));SqlCommand com = new SqlCommand(data, connection);int m = com.ExecuteNonQuery();if (m != 0)MessageBox.Show("更新成功!");elseMessageBox.Show("不好意思,更新不成功,请重新更新!");this.dataGridView3.Update();connection.Close();三、运行结果查询:插入:四、实验总结要求个人填写(实验中发现的问题和解决的办法)这次实验是对嵌入式SQL的综合运用,我使用的是C#语言。
实验6 嵌入式SQL通过这个实验,我们首先熟悉了嵌入式SQL编程,并可以自己动手编写一个小型的数据库应用程序。
而且能够大体了解我们平时在日常生活中看到的一些数据库应用程序是如何开发出来的。
做完这个实验,你会发现那些数据库程序也并不是十分高深。
这是我们最后一个实验,也是工作量最大的一个实验,大约需要2-3次实验课的时间。
希望同学们认真完成。
实验平台1.OS:WindowsXP2.DBMS:SQLServer2000piler:Visual C++ 6.0(大家可能没有接触过VC++,但并不妨碍我们做这个实验,因为在这个实验中我们只利用它的编译功能。
)预备知识1)嵌入式SQL编程:嵌入式SQL由SQL语句和C/C++代码组成。
其中SQL语句由预处理器翻译成C或C++的源代码。
对预处理后的源代码进行编译、连接生成可执行程序后方可运行。
●SQL预处理器SQLServer的预处理程序是nsqlprep.exe。
其常用的语法格式如下:nsqlprep 程序文档名⏹要求程序文档名的后缀为.sqc,可以省略。
⏹预编译后得到的文档,与程序文档同名,后缀为.c;放在与程序文档名同一个路径下nsqlprep.exe在SQLServer的安装目录的MSSQL\Binn下。
在本机中SQLServer的安装目录是C:\Program Files\Microsoft SQL Server,nsqlprep.exe在C:\Program Files\Microsoft SQL Server\MSSQL\Binn。
由于默认的安装方式(典型安装)并没有安装应用程序nsqlprep.exe,因此,需要你把我提供的binn文件夹,拷贝到该目录下覆盖原来的Binn。
●连接方式经预处理后的c文件就可以用c的编译器进行编译连接了。
使用Visual C++ 6.0进行编译连接,连接方式是动态连接,用到动态链接库SQLakw32.dll,sqlaiw32.dll;此两文件已经随同binn.rar的其他内容,被拷贝到C:\Program Files\Microsoft SQL Server\MSSQL\Binn下;但仍然需要把该路径加到系统的路径变量中,以使得程序运行时能找到这两个文件。
实验五:通过嵌入式SQL访问数据库1 实验目的熟悉通过嵌入式SQL(主语言为C语言)编程访问数据库。
2 实验平台和实验工具在KingbaseES数据库管理系统上,通过C语言编写访问数据库的应用程序来对数据库进行各种数据操作。
编程工具自选。
3 实验内容和要求熟悉RDBMS的预编译程序。
通过嵌入式SQL编程访问数据库的基本步骤对学生课程数据库中的表,完成下面功能(你也可以自己给出功能要求):1. 查询某一门课程的信息。
要查询的课程由用户在程序运行过程中指定,放在主变量中。
2. 查询选修某一门课程的选课信息,要查询的课程号由用户在程序运行过程中指定,放在主变量中,然后根据用户的要求修改其中某些记录的成绩字段。
要求:提交源程序并标识必要的注释。
保证程序能正确编译和运行,认真填写实验报告。
3.1 嵌入式SQL要求:将一段连续的SQL操作写成嵌入到C程序中的程序,调试程序,使得程序能完成一项复杂的数据处理功能,并提交程序。
嵌入式SQL由SQL语句和C/C++代码组成。
其中SQL语句由预处理器翻译成C或C++的源代码。
对预处理后的源代码进行编译、链接生成可执行程序后方可运行。
3.2 KingbaseES预处理器KingbaseES的预处理程序是esqlc.exe。
其常用的语法格式如下:■esqlc详细的语法格式以及参数意义,请参阅联机帮助。
■要求程序文档名的后缀为.pc,可以省略。
■预编译后得到的文档,与程序文档同名,后缀为.c;放在与程序文档同一个路径下。
esqlc.exe存在KingbaseES的安装目录的Basesoft\KingbaseES\4.1\bin下。
例如,KingbaseES的安装目录是C:\Program Files,那么eslqc.exe则在C:\Program Files\Basesoft\KingbaseES\ 4.1\bin下。
注意:在安装SQL Server时并不会同时安装预编译应用程序nsqlprep.exe,需要将此文件另拷贝至安装目录下;而KingbaseES在安装时会同时安装此文件,因此不需要另外拷贝。
数据库系统概论课程实验报告班级计科二班学号2013221104210076 姓名曹力一,各种方式简介ESQL嵌入式sql(embedded sql)是将sql语句嵌入到程序设计语言中,如C、C++和java,这些称之为主语言。
将sql嵌入到高级语言中,sql负责数据的处理,高级语言负责程序的控制。
这时候程序会有两种不同的计算机模型语言,两者是如何通信呢?1、向主语言传递sql执行的状态信息,主语言通过此信息来控制程序流程。
主要通过SQL通信区(SQL Communication Area)SQLCA实现,SQLCA中有一个变量SQLCODE用来存放执行SQL所返回的代码,成功则返回预定义代码SUCCESS,否则返回错误代码。
2、主语言提供参数,主要用主变量(Host Variable)实现。
主变量按功能不同可以分为,输入主变量和输出主变量。
一个主变量附带一个指示变量,它可以检查变量是否为空值,是否被截断。
3、SQL将查询的结果交给主语言处理,主要通过主变量和游标实现。
SQL是面向集合的,一条sql可能产生多条记录。
而主语言是面向记录的,一组主变量只能处理一条记录。
所以游标的得来就是处理SQL得到的数据集合,让其指向某一条记录。
特点⏹⒈综合统一⏹ 2. 高度非过程化⏹ 3. 面向集合的操作方式⏹ 4. 同一种语法结构提供两种使用方式⏹ 5. 语言简捷,易学易用三、PL/SQLPL/SQL(procedural language/SQL)是编写数据库存储过程的一种过程语言。
它结合了SQL的数据操作能力和过程话语言的流程控制能力,是SQL的过程化扩展。
格式如下:create procedure 过程名(参数1,参数2,……)s<PL/SQL>块;优点:⏹a提供了在服务器端快速执行SQL语句的有效途径⏹降低了客户机和服务器间的通信量⏹有利于集中控制⏹方便维护四、ODBCODBC可以连接不同的RDBMS,是微软公司开放服务体系中有关数据库的一个组成部分,它建立了一组规范,并提供了一组访问数据库的标准API。
黄冈师范学院提高型实验报告实验课题嵌入式SQL访问数据库(实验类型:□综合性■设计性□应用性)实验课程数据库系统概论实验时间2012年5月25日学生姓名邵旭东专业班级信息1001班学号201021240106一、实验目的和要求1. 编写嵌入式C程序,编程实现了对“学生课程数据库”的访问和对Student表中年龄进行更新。
2. 装SQL Server2000和Visual C++程序。
3、将一段连续的SQL操作写成嵌入到C程序中的程序,调试程序,使得程序能完成一项复杂的数据处理功能,并提交程序。
二、实验条件R429三星笔记本电脑一台。
三、实验原理分析四、实验方案或步骤1.初始化编译环境将SQL安装光盘内的DEVTOOLS文件夹复制到SQL的安装目录下(!!默认下为C:\Program Files\Microsoft SQL Server\),执行.\DEVTOOLS\SAMPLES\ESQLC\目录中的UNZIP_ESQLC.EXE文件(!!点击finish,默认解压到当前目录下!!),解压预编译必要的头文件和库文件,然后运行解压出来的批处理文件setenv.bat初始化SQL预编译环境(这项操作实际上设置两个环境变量)。
接下来添加SQL预编译接口,将安装光盘中X86\BINN中的nsqlprep.exe,sqlaiw32.dll,sqlakw.32.dll复制到SQL安装目录(!!默认下为C:\Program Files\Microsoft SQL Server\)中的\MSSQL\Binn\(注:\MSSQL\Binn\改为:\MSSQL\Binn;)目录下,并将C:\Program Files\Microsoft SQL Server\MSSQL\Binn添加到环境变量中(方法是:右击我的电脑,点击我的电脑属性,点击高级,点击环境变量,点击path ,粘贴在‘;’号后)。
SQL设置完了,现在开始设置VC编译环境。
实验报告单院(系):计算机学院专业:计算机科学与技术(嵌入式方向)班级:12计科5班姓名:陶昕星学号:34同组人:实验室:S4305组号:日期: 4.25课程:数据库原理指导教师:邱长春成绩:实验项目编号:05 实验项目名称:嵌入式SQL 一、实验目的1.熟悉通信区、游标的概念;2.理解嵌入式SQL的处理过程;3.For personal use only in study and research; not for commercial use4.5.掌握SQL与主语言之间的通信机制;6.熟悉通过嵌入式SQL访问数据库二、实验环境For personal use only in study and research; not for commercial useSQL Server2000三、实验学时2学时四、实验内容及步骤1. 查看SQL Server的参考文献,找出嵌入式SQL编程所需的各种组件,如下图所示:2.通过自定义的方式安装SQL Server,确保上述组件安装成功,并找出这些组件所在的目录路径,如下面的图示:3.创建一个数据库,本例的数据库为stu,并将其密码设置为sa;4.使用文本编辑器编写一个嵌入式SQL程序,扩展名为sqc。
本例的嵌入式SQL程序名称为EmbedSql.sqc,程序如下:#include <stdio.h>#include <stdlib.h>EXEC SQL INCLUDE sqlca;{EXEC SQL BEGIN DECLARE SECTION;//主变量char lname[40];char fname[20];EXEC SQL END DECLARE SECTION;printf("This is my Embedded SQL for C application\n");EXEC SQL CONNECT TO WIN-CF7AKA VRCJA.pubs USER sa.sa;//连接到数据库if (SQLCODE == 0){printf("Connection to SQL Server established\n");}else{// 连接DBMS错误printf("ERROR: Connection to SQL Server failed\n");return (1);}EXEC SQL DECLARE selCursor CURSOR FORSELECT au_lname, au_fnameFROM authors;EXEC SQL OPEN selCursor ;for ( ; ; ) {/* Fetch next row of the result table */EXEC SQL FETCH selCursor INTO :lname,:fname;if (SQLCODE == 0){printf("lname:%s/n",lname);printf("fname:%s/n",fname);}elsebreak;/* display data */}printf ("SQL error %d\n",sqlca->sqlcode);//若照书上写sqlca.sqlcode编译报语法错done:/* Close the cursor before completing*/EXEC SQL WHENEVER SQLERROR continue;EXEC SQL CLOSE providerCursor;EXEC SQL COMMIT WORK RELEASE;//断开连接EXEC SQL DISCONNECT ALL;return 0;}5. 实例工程的构建:(1)打开VC6.0,新建名为esqlea1的WIN32 Console Application工程文件;(2)把EmbedSql.sqc拷贝到工程的目录文件夹下;(3)将上述组件拷贝到工程的目录文件夹下;(4)在工具菜单下选择Options,再选择Directories,在Show Directories for 下拉框中选择Include files,在Directories编辑框中输入SQLServer开发工具的头文件路径;选择library files,在Directories编辑框中输入SQLServer开发工具的库文件路径;选择可执行文件,在Directories编辑框中输入SQLServer开发工具的可执行文件路径。
数据库原理实验指导书实验名称:试验一:SQL语言嵌套查询和数据更新操作所属课程:数据库原理实验类型:设计型实验实验类别:基础□专业基础√专业□实验学时:4学时一、实验目的1.熟悉和掌握对数据表中数据的查询操作和SQL命令的使用,学会灵活熟练的使用SQL 语句的各种形式;2.加深理解关系运算的各种操作(尤其的关系的选择,投影,连接和除运算);3.熟悉和掌握数据表中数据的插入、修改、删除操作和命令的使用;4.加深理解表的定义对数据更新的作用二、预习与参考1.熟悉SQL SERVER 工作环境;2.连接到学生-课程数据库3.复习对表中数据查询的SQL语言命令;4.复习对表中数据的插入、修改和删除的SQL语言命令。
三、实验要求(设计要求)针对教材例子,通过SQL SERVER企业管理器和查询分析器两种模式,熟悉数据嵌套查询、更新操作。
四、实验方法及步骤1.在表S、C、SC上进行简单查询;2.在表S、C、SC上进行连接查询;3.在表S、C、SC上进行嵌套查询;4.使用聚合函数的查询;5.对数据的分组查询;6.对数据的排序查询。
7.将数据插入当前数据库的表S、C、SC中;A:用SQL命令形式B:用SQL SERVER提供的企业管理器以交互方式进行8.将以上插入的数据分别以.SQL文件和.txt文件的形式保存在磁盘上;9.修改表S、C、SC中的数据;A:用SQL命令形式B:用SQL SERVER提供的企业管理器以交互方式进行10.删除表S、C、SC中的数据。
A:用SQL命令形式B:用SQL SERVER提供的企业管理器以交互方式进行五、实验内容在表S,C,SC上完成以下操作:1.查询学生的基本信息;2.查询“CS”系学生的基本信息;3.查询“CS”系学生年龄不在19到21之间的学生的学号、姓名;4.找出最大年龄;5.找出“CS”系年龄最大的学生,显示其学号、姓名;6.找出各系年龄最大的学生,显示其学号、姓名;7.统计“CS”系学生的人数;8.统计各系学生的人数,结果按升序排列;9.按系统计各系学生的平均年龄,结果按降序排列;10.查询每门课程的课程名;11.查询无先修课的课程的课程名和学时数;12.统计无先修课的课程的学时总数;13.统计每位学生选修课程的门数、学分及其平均成绩;14.统计选修每门课程的学生人数及各门课程的平均成绩;15.找出平均成绩在85分以上的学生,结果按系分组,并按平均成绩的升序排列;16.查询选修了“1”或“2”号课程的学生学号和姓名;17.查询选修了“1”和“2”号课程的学生学号和姓名;18.查询选修了课程名为“数据库系统”且成绩在60分以下的学生的学号、姓名和成绩;19.查询每位学生选修了课程的学生信息(显示:学号,姓名,课程号,课程名,成绩);20.查询没有选修课程的学生的基本信息;21.查询选修了3门以上课程的学生学号;22.查询选修课程成绩至少有一门在80分以上的学生学号;23.查询选修课程成绩均在80分以上的学生学号;24.查询选修课程平均成绩在80分以上的学生学号;25.选做:针对SPJ数据库中的四个表S,P,J,SPJ,完成教材P74-75--习题5中的查询及教材P127--习题5中的查询。
Exec sql/c【嵌入SQL】概念:利用高级语言的过程性结构来弥补SQL语言实现复杂应用方面的不足。
嵌入SQL的高级语言称为主语言或宿主语言。
在混合编程中,SQL语句负责操作数据库,高级语言语句负责控制程序流程。
预编译方法由DBMS的预处理程序对源程序扫描,识别出SQL语句,把它们转换成主语言调用语句,以使主语言编译器能识别它,最后由主语言编译器将整个源程序编译成目标码。
☆嵌入式SQL的一般形式所有的嵌入式SQL语句都必须加前缀EXEC SQL在C语言中:EXEC SQL <SQL语句>例如:EXEC SQL DROP TABLE Student;☆嵌入式SQL与主语言的通信1:向主语言传递SQL语句执行状态信息【状态信息】,使语言能够据此信息控制程序流程,用SQL通信区(SQLCA【SQL Communication Area】)实现。
2:主语言向SQL语句提供参数,主要用主变量(Host Variable)实现;3:将SQL语句查询数据库的结果交主语言进一步处理,主要用主变量和游标(Cursor)实现。
☆SQL通信区SQLCA中有一个存放每次执行SQL语句后返回代码的变量SQLCODE。
每次执行完SQL语句后都应该测试一下SQLCODE的值,以了解该SQL语句执行情况并做相应处理,如果SQLCODE等于预定的常量SUCCESS,则表示SQL语句成功,否则在SQLCODE中存放错误代码。
SQLCA(SQL Communication Access) 系由系统提供之系统记录架构,作为back end与front end 之间沟通之用,当发生I/O 状态时,系统会记录该状态于SQLCA 中,front end 即可依据其其内容得知I/O 运作是否成功,再决定往后执行的步骤。
SQLCA 为系统定义之GLOBAL变量,以下为其架构并介绍其内容与用途:SQLCA结构DEFINE SQLCA RECORDSQLCODE INTEGER,SQLERRM CHAR(71),SQLERRP CHAR(8),SQLERRD ARRAY[6] OF INTEGER,SQLAWARN CHAR(8)END RECORD.SQLCODE 表示I/O 的结果;.SQLERRM :保留未用.SQLERRP :保留未用.SQLERRD :为一个含有6个INTEGER数组SQLERRD[1]:保留未用SQLERRD[2]:新增时SERIAL 字段所传回之值SQLERRD[3]:处理资料的笔数SQLERRD[4]:查询时预估的CPU COSTSQLERRD[5]:SQL指令之错误位移SQLERRD[6]:最后一个ROWID 值.SQLAWARN :含有8个字符记录I/O时产生的警告讯息为一个含有8个字符的字符串,以记录I/O时产生的警告讯息。
实验五连接查询、嵌套查询与联合查询实验指导实验五连接查询、嵌套查询与联合查询实验指导一、连接查询前面的查询都是在单个表中进行的查询。
在数据库的实际编程应用中,往往需要查询许多数据,有可能这些数据出现在两个或两个以上的表中,而我们希望这些数据出现在一个结果集中,这就要用到连接查询。
在SQL Server中,可以使用两种语法形式:一种是ANSI 连接语法形式,连接写在FROM子句中,使用JOIN…ON关键字。
另一种是早期SQL SERVER 连接语法形式,连接写在WHERE子句中。
在SQL SERER中可以设定兼容级别为80及以下(在对象资源管理器中展开相应的数据库,右击,选择“属性”,在弹出的“数据库属性”对话框中选择“选项”,有兼容级别设置)才能使用这种形式。
在SQLServer2008中推荐使用ANSI形式的连接。
两种连接的语法格式如下。
SQL Server连接的语法格式:SELECT <查询列表>FROM 表1,表2WHERE 表1.列1 <比较运算符> 表2.列2其中比较运算符可以是:=、>、<、>=、<=、<>等。
说明:●连接的列(属性)名可不相同,但数据类型必须兼容。
●当<比较运算符>是“=”时,称等值连接,否则为非等值连接。
ANSI连接的语法形式如下:SELECT 表名.列名[,…n]FROM {表名1 [连接类型] JOIN表名2 ON 连接条件} [,…n]WHERE 查询条件连接查询包括以下几种类型。
1. 内连接从两个或两个以上的表的组合中,挑选出符合连接条件的数据。
如果数据无法满足连接条件,则将其丢弃。
通常称这种方法为内部连接INNER JOIN。
在内部连接中,参与连接的表的地位是平等的。
它有两种形式:等值连接和自然连接。
等值连接会产生冗余列,因为它将连接条件中的共享列显示两次。
而自然连接则清除了等值连接产生的冗余列,因此我们所说的内连接在没有特殊说明时都指的是自然连接。
实验项目名称实验四:嵌入式SQL的使用一、实验目的1、明确嵌入式SQL的意义。
2、学会使用不用游标的DML语句。
3、学会使用使用游标的DML语句。
二、实验环境在Win7-32系统下,用Microsoft SQL Server Management Studio实现的三、实验内容以学生选课数据库为中心,使用PowerBuilder语言(Vb或Delphi),设计一个数据录入、查询窗口,进行练习。
1、不用游标语句2、使用游标的语句四、实验结果1、不用游标语句(1)查询结果为单记录的SELECT语句格式:SELECT 目标列INTO 主变量FROM 基本表(或视图)[WHERE 条件表达式];如:根据主变量GIVENS#的值找该学生的信息SELECT SN,SD,SAINTO :SNAME,:DEPT,:AGEFROM SWHERE S#=:GIVENS#;(2)UPDATE语句如:UPDATE SSET SA=NULLWHERE SD=”CS”(3)DELETE语句如:DELETEFROM SCWHERE :DEPT=(SELECT SDFROM SWHERE S.S#=SC.S#);2、使用游标的语句(1)查询结果为单记录的SELECT语句格式:SELECT 目标列INTO 主变量FROM 基本表(或视图)[WHERE 条件表达式];如:根据主变量GIVENS#的值找该学生的信息SELECT SN,SD,SAINTO :SNAME,:DEPT,:AGEFROM SWHERE S#=:GIVENS#;2.查询数据Update语句UPDATE SSET SA=NULLWHERE SD=”MA”(3)DELETE语句如:DELETEFROM SCWHERE :sd=(SELECT SDFROM SWHERE S.S#=SC.S#);已删除4)INSERT语句如:INSERTINTO S(S#,SN,SD,SG,SEX)V ALUES(:GIVENS#,:SNAME,:DEPT)使用C#操作的代码:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Data.SqlClient;namespace Sql{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){l1.Text = "请连接数据库!";}static SqlConnection sql = null;//创建连接对象static SqlCommand stu = new SqlCommand();//创建对象private void button1_Click(object sender, EventArgs e){if (textBox1.Text == ""){MessageBox.Show(null,"请输入数据库名称",0,MessageBoxIcon.Error); }else{try{string sc = "server=A506;database=" + textBox1.Text.Trim() + ";uid=sa;pwd=123";sql = new SqlConnection(sc);sql.Open();if (sql.State == ConnectionState.Open){l1.Text = "连接成功;button3.Enabled = true;}}catch(Exception ex){MessageBox.Show(ex.Message);//l1.Text= "连接失败请重试;}}}private void button2_Click(object sender, EventArgs e){try{sql.Close();if (sql.State == ConnectionState.Closed){l1.Text = "关闭成功";}}catch{l1.Text = "关闭失败,请连接数据库!";}}private void sqls(string str)//数据库操作Á函¡数用接SQL语句?{try{stu.Connection = sql;//设置连接属性DataSet ds = new DataSet();SqlDataAdapter sda = new SqlDataAdapter(str, sql);sda.Fill(ds, "student");dataGrid1.DataSource = ds.Tables["student"].DefaultView; }catch (Exception ex){// 查¨¦询¡¥失º¡ì败㨹!ê?MessageBox.Show(ex.Message);}}private void updata(string str){try{stu.Connection = sql;stu = new SqlCommand(str, sql);stu.ExecuteNonQuery();l1.Text = "更新成功!";}catch{MessageBox.Show("更新失败¹请重试!");}}private void button3_Click(object sender, EventArgs e){string select = "select * from student where sno=" + textBox2.Text.Trim(); sqls(select);}private void button5_Click(object sender, EventArgs e){string select = "select * from student where sdept= '" +textBox2.Text.Trim()+"'";sqls(select);}private void button4_Click(object sender, EventArgs e){string upda="UPDATE student SET sage=null WHEREsdept='"+textBox2.Text.Trim()+"'";updata(upda);}private void sqlinsert(string str){try{stu.Connection = sql;stu = new SqlCommand(str, sql);stu.ExecuteNonQuery();l1.Text = "插入成功,请查询!";}catch(Exception ex){MessageBox.Show("插入失败请重试?"+ex.Message);}}private void button6_Click(object sender, EventArgs e){try{string sno, sname, sd, sage, sex;//读取单元格内容sno = data1.CurrentRow.Cells[0].Value.ToString();sname = data1.CurrentRow.Cells[1].Value.ToString();sd = data1.CurrentRow.Cells[2].Value.ToString();sage = data1.CurrentRow.Cells[3].Value.ToString();sex = data1.CurrentRow.Cells[4].Value.ToString();l1.Text = sno + sname + sd + sage + sex;string insert = "INSERT INTO student(sno,sname,sdept,sage,ssex) VALUES('" +sno.Trim() + "','" + sname.Trim() + "','" + sd.Trim() + "','" + sage.Trim() + "','" + sex.Trim() + "')";sqlinsert(insert);}catch{MessageBox.Show("请检查输入内容!");}}private void button7_Click(object sender, EventArgs e){data1.Visible = true;}private void sqldelete(string str){try{stu.Connection = sql;stu = new SqlCommand(str, sql);stu.ExecuteNonQuery();l1.Text = "删除成功请查询?";}catch(Exception ex){MessageBox.Show("删除失败请重试"+ex.Message);}}private void button8_Click(object sender, EventArgs e){string delete = "delete from student where sno=" + textBox2.Text.Trim();sqldelete(delete);}private void data1_CellContentClick(object sender, DataGridViewCellEventArgs e) {}}}五、实验心得:本次实验完成的不是很顺利,中间遇到很多问题,但通过和同学们讨论、网上查找都得到了很好的解决,通过实验,知道了自己哪方面掌握不足,对视图的使用还要多加练习,是自己掌握更加牢固。
实验05:数据库的嵌套查询实验 5 :数据库的嵌套查询实验本实验需要 2 学时。
一、实验目的使学生进一步掌握 SQL Server 查询分析器的使用方法,加深 SQL 和 Transact-SQL 语言的嵌套查询语句的理解。
二、实验内容在 SQL Server 查询分析器中,使用 IN 、比较符、 ANY 或 ALL 和 EXISTS 操作符进行嵌套查询操作。
三、实验方法将查询需求用 Transact-SQL 语言表示;在 SQL Server 查询分析器的输入区中输入 Transact-SQL 查询语句;设置查询分析器的结果区为 Standard Execute( 标准执行 ) 或 Execute to Grid( 网格执行 ) 方式;发布执行命令,并在结果区中查看查询结果;如果结果不正确,要进行修改,直到正确为止。
四、实验步骤1 .基本操作实验在做以下操作前,要求用Transact-SQL 语句在选课表里增加如下记录:学号020101 020101 020101 020101 020101 课程号 103 104 105 106 108 成绩 90 63 84 76 69 Transact-SQL 语句表示,在学生选课库中实现其数据嵌套查询操作。
1)、求选修了计算机原理的学生学号和姓名。
2)、求计算机方法课程的最高成绩的学生学号和成绩。
3)、求其他系中比计算机系任意一学生年龄小的学生 ( 即求年龄小于计算机系年龄最大者的学生 ) 。
提示:select datediff( "yyyy",出生年月,getdate()) from 学生获取学生表中的所有学生年龄。
SQL Server DATEDIFF() 函数SQL Server Date 函数定义和用法 DATEDIFF() 函数返回两个日期之间的天数。
语法DATEDIFF ( datepart, startdate, enddate ) startdate 和 enddate 参数是合法的日期表达式。
实验五:数据库综合查询一、实验目的1.掌握SELECT语句的基本语法和查询条件表示方法;2.掌握查询条件种类和表示方法;3.掌握连接查询的表示及使用;4.掌握嵌套查询的表示及使用;5.了解集合查询的表示及使用。
二、实验环境已安装SQL Server企业版的计算机(120台);具有局域网环境,有固定IP;三、实验学时2学时四、实验要求1.了解SELECT语句的基本语法格式和执行方法;2.了解连接查询的表示及使用;3.了解嵌套查询的表示及使用;4.了解集合查询的表示及使用;5.完成实验报告;五、实验内容及步骤1.利用Transact-SQL嵌套语句实现下列数据查询操作。
1) 查询选修了计算机体系结构的学生的基本信息。
select*from studentwhere Sno in(select Sno from coursewhere Cno in(select Cno from sc where Cname='计算机体系结构'))2) 查询年龄比李勇小的学生的学号和成绩。
select a.sno,grade from student a,coursewhere a.sno=course.sno and sage<(select sage from student where sname='李勇')3) 查询其他系中比系编号为‘D1’的学生中年龄最小者要大的学生的信息。
select*from student where dnum<>'D1'AND SAGE>(select min(sage)from student where dnum='D1')4) 查询其他系中比系编号为‘D3’的学生年龄都大的学生的姓名。
select*from student where dnum<>'D3'AND SAGE>all(selectsage from student where dnum='D3')5) 查询‘C1’课程的成绩高于70的学生姓名。
数据库实验报告专业:软件工程班级:093班学号:**********姓名:***目录一、实验目的 -----------------------------------------2二、实验内容 -----------------------------------------21、题目要求 ----------------------------------------22、实现方法 ----------------------------------------2三、实验步骤 -----------------------------------------5四、实验结果 -----------------------------------------6五、体会 ---------------------------------------------61、遇到的问题及解决方法 -----------------------------62、收获及感悟 --------------------------------------6一、实验目的(1)学会利用Pro*C程序设计语言所提供的游标机制,编写程序(.pc)解决实际问题。
(2)上机学习和实践含嵌入式SQL语句的高级程序的编写、编译、连接、执行的相关过程,并学会编译链接时的相关配置。
二、实验内容1、题目要求本实验综合运用前面掌握的内容并进行综合应用。
选定一种开发工具(VC),设计实现一个简单的数据库应用系统,做到界面友好、使用方便。
(一)假设教学数据库中有三张关系表 S、 C、 SC(关系模式如教材所示),查询某学生的成绩明细,如果成绩为NULL,输出信息为“缓考”。
其输出格式模板如下。
成绩明细情况表(姓名:XXX 学号:XXX)----------------------------------------------------------------- 序号课程号课程名成绩-----------------------------------------------------------------1 C101 数据库概论 852 C102 OS 缓考3 C104 软件工程 554 C103 Java语言 80... ... ...-----------------------------------------------------------------平均成绩:XXX名次:XXX(二)将SC表中的“百分制”改为“4分制”,换算关系如下。
实验使用嵌套查询实验报告引言:嵌套查询是关系型数据库中一种重要的查询技术,可以通过在一个查询语句中嵌入另一个查询语句来实现更加复杂和灵活的查询。
本实验旨在通过使用嵌套查询,展示其在实际数据库操作中的应用。
实验设计与目的:本实验的设计目的是展示嵌套查询在关系型数据库中的应用。
通过使用嵌套查询,实现对一个数据库中不同关系之间的数据的查询,并获得所需的结果。
实验步骤与方法:1. 数据库准备:在本实验中,我们使用了一个示例数据库来说明嵌套查询的使用方法。
该数据库包含两个关系表:学生表和课程表。
学生表包含学生的基本信息,课程表包含课程的信息。
在实验开始前,我们需要先创建并插入一些示例数据到数据库中。
2. 嵌套查询的基本语法:嵌套查询可以在一个查询语句中嵌入另一个查询语句。
嵌套查询的基本语法如下:```SELECT column_nameFROM table_nameWHERE column_name OPERATOR (SELECT column_name FROM table_name WHERE condition);```3. 嵌套查询示例:在本实验中,我们将通过几个示例来展示嵌套查询的使用方法。
示例一:查询选修了指定课程的学生信息```SELECT *FROM studentsWHERE student_id IN (SELECT student_id FROM courses WHERE course_name = '计算机网络');```示例二:查询选修了多门课程的学生信息```SELECT *FROM studentsWHERE student_id IN (SELECT student_id FROM courses GROUP BY student_id HAVING COUNT(*) > 1);```示例三:查询选修了某个老师教授的所有课程的学生信息 ```SELECT *FROM studentsWHERE student_id IN (SELECT student_id FROM courses WHERE teacher_id = (SELECT teacher_id FROM teachers WHERE teacher_name = '张老师'));```4. 实验结果与分析:通过执行上述嵌套查询示例,可以得到符合查询条件的学生信息。
数据库嵌入式SQL案例1. 数据库及表结构的创建student(sno,smame,ssex,sage,sdept)course(cno,cname,cpno,ccredit)sc(sno,cno,grade)users(uno,uname,upassword,uclass)CREATE DATABASE XXGL;goUSE XXGL;CREATE TABLE student (sno char(5) NOT null primary key,sname char(6) null,ssex char(2) null DEFAULT …男‟ CHECK(ssex=‟男‟ or ssex= …女‟),sage int null,sdept char(2) null);CREATE TABLE course (cno char(1) NOT null primary key,cname char(10) null,cpno char(1) null,ccredit int null DEFAULT 2 CHECK (ccredit>=0 and ccredit <=50));CREATE TABLE sc(sno char(5) NOT null,cno char(1) NOT null,grade int null,CONSTRAINT FK_sc_course FOREIGN KEY(cno) REFERENCES course (cno), CONSTRAINT FK_sc_student FOREIGN KEY(sno) REFERENCES student (sno) );CREATE TABLE users(uno char(6) NOT NULL PRIMARY KEY CLUSTERED (uno),uname char(10) NOT NULL,upassword varchar(10) NULL,uclass char(1) NULL DEFAULT …A‟);2.数据库的连接(connection)在main()主程序中main(int argc, char ** argv, char ** envp){//各变量定义略//SQL Server 支持的嵌入式C程序,先说明变量与主变量EXEC SQL BEGIN DECLARE SECTION;//用于连接的主变量说明char szServerDatabase[(SQLID_MAX*2)+2=]””; //放数据库服务器与数据库名char szLonginPassword[(SQLID_MAX*2)+2]=””; //放登录用户名与口令EXEC SQL END DECLARE SECTION;//接着是连接的相关设置与错误处理设置EXEC SQL WHENEVER SQLERROR CALL ErrorHandler();EXEC SQL SET OPTION LOGINTIME 10;EXEC SQL SET OPTION QUERYTIME 100;……//GetConnecToInfo()实现衔接信息的获取nRet=GetConnectToInfo(argc,argv,szServerDatabase,szLonginPassword);if (!nRet){teturn (1);}EXEC SQL CONNECT TO: szServerDatabase USER : szLonginPassword;//真正与SQL SERVER 连接If (SQLCODE==0){printf(“Connection to SQL Server established\n”);}else { printf(“ERROR:Connection to SQL Server FAILED\n”);return(1);}……//主体程序含各种嵌入式SQL命令//main()结束时断开SQL Server的连接EXEC SQL DESCONNECT ALL;//}//end of main()3. 表的初始创建程序如下:int create_student_table(){ char yn[2];EXEC SQL BEGIN DECLARE SECTION;char tname[21]=”××××××××××××××”;EXEC SQL END DECLARE SECTION;EXEC SQL select name into:tname from sysobjectswhere (xtype=‟U‟and name=‟student‟);if (SQLCODE==0||strcmp(tname, “student”)==0){printf(“The student table already exists,Do you want to delete it?\n”,SQLCODE);printf(“Delete the table?(y—yes,n--no):”);scanf(“%s”,&yn);if (yn[0]==‟y‟||yn[0]== ‟Y‟){EXEC SQL drop table student;}if (SQLCODE==0){printf(“Drop table student successfully!%d\n\n”,SQLCODE);}else { printf(“ERROR:drop table student %d\n\n”,SQLCODE);}}else return -1;}EXEC SQL create table student(sno char(5) NOT null primary key,sname char(6) null,ssex char(2) null DEFAULT …男‟CHECK(ssex=‟男‟ or ssex= …女‟),sage int null,sdept char(2) null);if (SQLCODE==0){printf(“Success to create table student!%d\n\n”,SQLCODE);}else{ printf(“ERROR:create table student %d\n”,SQLCODE);}EXEC SQL begin transactioninsert into student values(…95001‟,‟李斌‟,‟男‟,16,‟CS‟)//其它插入语句略commit transaction;if (SQLCODE==0){printf(“Success to insert rows to student table!%d\n\n”,SQLCODE);}else{ printf(“ERROR: insert rows %d\n\n”,SQLCODE);}return(0);}4. 表记录的插入int insert_rows_into_student_table(){ EXEC SQL BEGIN DECLARE SECTION;char isno[]=”95002”;char isnane[]=”××××××”;char issex[]=”男” ;int isage=18;char isdept[]=”CS”;int isnameind=0;//其他指示标量定义略EXEC SQL BEGIN DECLARE SECTION;char yn[2];while(1){printf(“Please input sno(eg:95001):”);scanf(“%s”,isno);//其他变量与指示变量输入代码类似(略)EXEC SQL insert into student(sno,sage,ssex,sname,sdept)values(:isno,:isage:isageind,:issex:issexind,:isname:isnameind,:isdept:isdeptind);if(SQLCODE==0){printf(“execute successfully!%d\n\n”,SQLCODE);}else{ printf(“ERROR: execute %d\n”,SQLCODE);}printf(“Insert again?(y—yes,n—no):”);scanf(“%s”,&yn);if (yn[0]==‟y‟||yn[0]== ‟Y‟){continue;}else break;}return(0);}5. 表记录的修改int current_of_update_for_student(){ char yn[2];…//变量定义略EXEC SQL SET CURSORTYPE CUR_STANDARD;printf(“Please input deptname to be updated(CS、IS、MA...,**--ALL):\n”);scanf(“%s”,deptname);if(strcmp(deptname,”*”)==0||strcmp(deptname,”**”)==0) strcpy(deptname,”%”);EXEC SQL DECLARE sx2 CURSOR FOR SELECT sno,sname,ssex,sage,sdept FROM student where sdept like:deptnamefor update of sname,ssex,sage,sdept;EXEC SQL OPEN sx2;while(SQLCODE==0){ EXEC SQL FETCH sx2 INTO:hsno,:hsname:ihsname,:hssex:ihssex,:hsage:ihsage,:hsdept:ihsdept;if(SQLCODE!=0) continue;printf(“%s\n”,”sno sname ssex sage sdept”);//学生记录的显示代码略printf(“UPDATE?(y/n/0,y--yes,n--no,0--exit)”);scanf(“%s”,&yn);if(yn[0]==‟y‟||yn[0]== ‟Y‟){//输入新的学生记录值到主变量中代码略EXEC SQL UPDATE student set sage=:isage:isageind,sname=:isname:isnameind,ssex=:issex:issexind,sdept=:isdept:isdeptind where current of sx2;};if(yn[0]==”0”) break;};EXEC SQL CLOSE sx2;return(0);}6. 表记录的删除int current_of_delete_for_student(){ char yn[2];…//变量定义略EXEC SQL SET CURSORTYPE CUR_STANDARD;printf(“Please input deptname to be updated(CS、IS、MA...,**--ALL):\n”);scanf(“%s”,deptname);if(strcmp(deptname,”*”)==0||strcmp(deptname,”**”)==0) strcpy(deptname,”%”);EXEC SQL DECLARE sx CURSOR FORSELECT sno,sname,ssex,sage,sdept FROM studentwhere sdept like:deptnamefor update of sname,ssex,sage,sdept;EXEC SQL OPEN sx;while(SQLCODE==0){ EXEC SQL FETCH sx INTO:hsno,:hsname:ihsname,:hssex:ihssex,:hsage:ihsage,:hsdept:ihsdept;if(SQLCODE!=0) continue;printf(“%s %5s %s %s\n”,”sno “,”sname “,” ssex”,” sage”,”sdept”);//学生记录的显示代码略printf(“DELETE?(y/n/0,y--yes,n--no,0--exit)”);scanf(“%s”,&yn);if(yn[0]==‟y‟||yn[0]== ‟Y‟){//输入新的学生记录值到主变量中代码略EXEC SQL delete from where current of sx;};if(yn[0]==”0”) break;};EXEC SQL CLOSE sx;return(0);}7. 表记录的查询int using_cursor_to_list_student(){ …//变量定义略EXEC SQL declare studentcursor cursorfor select* from student order by sno for read only;EXEC SQL open studentcursor;if(SQLCODE==0){ printf(“Open successfully! %d\n”,SQLCODE);}else { printf(“ERROR:Open %d\n”,SQLCODE);}printf(“\n”);printf(“sno sname ssex sage sdept \n”);while(SQLCODE==0){ EXEC SQL FETCH NEXT studentcursor INTO:csno,:csname:csnamenull,:cssex:cssexnull,:csage:csagenull,:csdept:csdeptnull;if(SQLCODE!=0){ //学生记录的显示代码略}}printf(“\n”);EXEC SQL CLOSE studentcursor;return(0);}8. 实现统计功能int using_cursor_to_total_s_sc(){ …//变量定义略EXEC SQL declare totalssc cursorfor select student.sno,sname,count(grade),sum(grade),avg(grade),MIN(grade),MAX(grade) from student sc where student.sno=sc.snogroup by student.sno,sname for read only;EXEC SQL open totalssc;if(SQLCODE==0){ printf(“Open successfully! %d\n”,SQLCODE);}else { printf(“ERROR:Open %d\n”,SQLCODE);}printf(“\n”);printf(“Success to total grade:! %d\n\n”,SQLCODE);printf(“sno sname count sum avg min max \n”);while(SQLCODE==0){ EXEC SQL FETCH NEXT totalssc INTO:isno,:isname:isnameind,:icnt:icnti,:isum:isumi,:iavg:iavgi, :imin:imini, :imax:imaxi;if(SQLCODE!=0){ //统计结果的显示代码略}else { printf(“ERROR:end of result %d\n”,SQLCODE);}}printf(“\n”);EXEC SQL CLOSE totalssc;return(0);}9. SQL的动态执行int dynamic_exec_sql_command(){ EXEC SQL BEGIN DECLARE SECTION;char cmd[81];EXEC SQL END DECLARE SECTION;char c,str[7];printf(“Please input a sql command(DELETE、UPDATE、INSERT):\n”);c=getchar(0);gets(cmd);if(strlen(cmd)>=6) strncpy(str,cmd,7);else {printf(“Please input correct command. \n”); return(-1);}if(strcmp(str,”select ”)==0){ printf(“Please input only DELETE、UPDA TE、INSERT command. \n”);return(-1);}EXEC SQL execute immediate:cmd;if(SQLCODE==0){ printf(“The sql command is executed successfully! %d\n”,SQLCODE);}else { printf(“ERROR: execute the sql command .%d\n”,SQLCODE);}return(0);}10. 通用统计功能int using_cursor_to_total_ty(){//变量定义略get(cmd);//输入动态统计SQL命令//判断cmd 中统计命令是否有效程序略EXEC SQL declare total_ty_cur cursor for total_ty;//定义游标EXEC SQL prepare total_ty from :cmd;//准备动态命令EXEC SQL SET CURSORTYPE CUR_STANDARD;//设置游标类型EXEC SQL open total_ty_cur; //打开游标if(SQLCODE==0){ printf(“Open successfully! %d\n”,SQLCODE);}else { printf(“ERROR:Open %d\n”,SQLCODE);}printf(“分组字段名统计值\n”);//以下程序组织输出结果while(SQLCODE==0){//取游标当前记录并显示EXEC SQL FETCH NEXT total_ty_cur INTO: con,:icnt:icnti;if(SQLCODE!=0){ printf(“%s”, con);if(icnti==0) printf(“%f\n”,icnt);else printf(“null\n”);}else { printf(“ERROR:end of the results%d\n”,SQLCODE);}}EXEC SQL close total_ty_cur;return(0);}准备实验环境:(1)新建C:\esqlc目录,SQL SERVER7.0(也可以是SQL Server2000)安装盘上的\devtools\include 目录、\devtools\x86lib目录、\x86\binn目录与\devtools\samples\esqlc中的例子复制到c:\esqlc目录中,嵌入了SQL的C语言程序也放于此目录中。