嵌入式SQL编程和通过ODBC访问数据库知识

合集下载

数据库实验 通过嵌入式SQL访问数据库

数据库实验 通过嵌入式SQL访问数据库

数据库原理课程实验报告1. 实验题目:实验五通过嵌入式SQL访问数据库2.实验目的熟悉通过嵌入式SQL(主语言C语言)编程访问数据库3实验平台3.1 操作系统:Windows 2000或者Windows XP注:使用Professional版的操作系统建议安装数据库管理系统的教学版,Server 版的操作系统建议安装数据库管理系统的企业版。

3.2 数据库管理系统:SQL Server 2000数据库管理系统4 实验内容及要求内容:熟悉RDBMS的预编译程序。

掌握SQL Server 2000的预编译程序NSQLPREP.EXE 的使用(以课本例题1进行调试)。

要求:在本报告中列出程序代码及注释,保证程序能正确编译运行。

5. 实验内容与完成情况:嵌入式SQL的C语言应用程序在VC++6.0、SQL Server 2000环境下的调试可分为五步:第一步环境初始化;第二步预编译;第三步编译;第四步连接;第五步运行。

1、环境初始化(1) 将文件夹devtools复制到SQL Server的系统目录C:\Program Files\Microsoft SQL Server\(或在安装Microsoft SQL Server 2000时选择安装Development Tools,为使用嵌入式SQL语言准备必要的头文件和库文件。

)(2)初始化Visual C++ 6.0编译器环境。

在命令行方式下运行文件\Microsoft VisualStudio\VC98\Bin\vcvars32.bat。

运行文件\Microsoft Visual Studio\VC98\Bin\vcvars32.bat。

本人直接是由附件里的运行程序直接运行(3)初始化SQL Server的预编译环境。

在命令行方式下运行文件: C:\Program Files\Microsoft SQL Server\DEVTOOLS\SAMPLES\ESQLC\setenv.bat。

嵌入式sql

嵌入式sql

实验四:访问数据库一、实验目的利用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#语言。

实验六通过odbc方式访问数据库

实验六通过odbc方式访问数据库

实验六通过ODBC方式访问数据库一、实验条件与环境1.通用PC机2.PC机必须安装Windows 2000系列、Windows XP系列或Windows NT操作系统平台3.PC机还须安装Microsoft SQL Server 2000 任意一版本(个人版、标准版、企业版)4.PC机还须安装VB、VC、C++ Builder、Dehpi等面向对象的可视化程序设计软件5.最好有一台公用的SQL Server 2000 服务器二、实验目的1.通过上机实验了解可视化程序设计语言对数据库进行访问的常用方法2.通过上机实验掌握软件开发工具面向用户提供的ODBC对象接口的概念及其作用3.通过上机实验熟悉SQL语句在面向对象编程语言中的使用4.通过上机实验熟悉通过ODBC接口访问数据库并对数据库进行操作5.通过上机实验熟悉使用ODBC来进行数据库应用程序的设计6.通过上机实验熟悉数据源的概念及数据源的创建方法1.通过上机实验熟悉ADO DATA控件的主要属性、事件、方法及其使用三、实验要求:1.要求学生至少熟悉一门面向对象的可视化程序设计语言(如:VB、VC、C++ Builder、Dehpi等)2.实验前,要求学生充分作好ADO DA TA控件、ODBC数据接口及数据源等相关内容的预习工作3.本实验涉及的实验内容最好能在2课时内完成4.实验完成后需要书写实验报告,本次实验报告需在下次实验课堂上上交四、通过ODBC方式访问数据库并进行各种数据操作的一个实例建立一个名为MyDB的数据库,然后在此数据库中建立一个名为S的数据表,有关数据表S的属性描述为:Sno,学号,数据类型为char(10);Sname,姓名,数据类型为char(8);Ssex,性别,数据类型为char(2);BirthDay,生日,数据类型为datetime(8)。

创建一个名为Students的数据源,然后利用可视化程序设计语言设计一个用户操作界面,通过ODBC数据接口和ADO DATA实现对数据库MyDB中数据表S的查询、插入、删除、修改等数据操作。

实验4嵌入式SQL和ODBC的使用

实验4嵌入式SQL和ODBC的使用

实验4 嵌入式SQL和ODBC的使用实验人:田超()黄伟()实验目的1.熟悉ODBC的配置和使用2.熟悉嵌入式SQL编程3.巩固SQL的知识实验平台1.OS:WindowsXP2.DBMS:SQLServer2000piler:Visual C++ 6.0预备知识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,因此,需要把本机中E:\院内学习工作\大三\数据库\SQLServer2000个人版\x86\binn目录下的内容拷贝到该目录下。

嵌入式SQL编程

嵌入式SQL编程
3 / 113
嵌入式 SQL 编程
Watcom C/C++ 10.6, 11 有关构建 NetWare NLM 的说明,请参见 构建 NetWare 可装载模块 。 嵌入式 SQL 头文件 所有头文件都安装在您的 SQL Anywhere 安装目录的 h 子目录中。 文件名 说明 sqlca.h 包括在所有嵌入式 SQL 程序中的主头文件。 此文件包括 [SQL 通信区域](SQLCA) 的结构定义和所有嵌 入式 SQL 数据库接口函数的原型。 sqlda.h 包括在使用动态 SQL 的嵌入式 SQL 程序中的 [SQL 描述符区域] 结构定义。 sqldef.h 嵌入式 SQL 接口数据类型的定义。此文件还包含从 C 程序启动数据库服务器所需的结构定义和返回代 码。 sqlerr.h 在 SQLCA 的 sqlcode 字段中返回的错误代码的定义。 sqlstate.h 在 SQLCA 的 sqlstate 字段中返回的 ANS I/ISO SQL 标准错误状态的定义。 pshpk1.h、pshpk2.h 这些头文件可确保正确地处理结构压缩。它支持 Watcom C/C++、Microsoft Visual C++、IBM Visual Age 和 Borland C/C++ 编译器。 导入库 所有导入库都安装在 SQL Anywhere 安装目录的操作系统子目录下的 lib 子目录中。 例如, Windows 导
WHERE emp_id = 195; EXEC SQL COMMIT WORK; EXEC SQL DISCONNECT; db_fini( &sqlca ); return( 0 ); error: printf( "update unsuccessful -- sqlcode = %ld\n", sqlca.sqlcode ); db_fini( &sqlca ); return( -1 ); } 此示例连接到数据库,更新 195 号雇员的姓氏,提交更改,然后退出。实际上 SQL 和 C 代码之间没有 交互作用。在本示例中 C 代码仅用于控制流。WHENEVER 语句用于错误检查。错误处理(此示例中的 GOTO)会在任何引起错误的 SQL 语句之后执行。 有关读取数据的说明,请参见 读取数据 。

实验五、通过嵌入式SQL访问数据库 (2)

实验五、通过嵌入式SQL访问数据库 (2)

实验报告单院(系):计算机学院专业:计算机科学与技术(嵌入式方向)班级: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开发工具的可执行文件路径。

实验六通过odbc方式访问数据库

实验六通过odbc方式访问数据库

实验六通过ODBC方式访问数据库一、实验条件与环境1.通用PC机2.PC机必须安装Windows 2000系列、Windows XP系列或Windows NT操作系统平台3.PC机还须安装Microsoft SQL Server 2000 任意一版本(个人版、标准版、企业版)4.PC机还须安装VB、VC、C++ Builder、Dehpi等面向对象的可视化程序设计软件5.最好有一台公用的SQL Server 2000 服务器二、实验目的1.通过上机实验了解可视化程序设计语言对数据库进行访问的常用方法2.通过上机实验掌握软件开发工具面向用户提供的ODBC对象接口的概念及其作用3.通过上机实验熟悉SQL语句在面向对象编程语言中的使用4.通过上机实验熟悉通过ODBC接口访问数据库并对数据库进行操作5.通过上机实验熟悉使用ODBC来进行数据库应用程序的设计6.通过上机实验熟悉数据源的概念及数据源的创建方法1.通过上机实验熟悉ADO DATA控件的主要属性、事件、方法及其使用三、实验要求:1.要求学生至少熟悉一门面向对象的可视化程序设计语言(如:VB、VC、C++ Builder、Dehpi等)2.实验前,要求学生充分作好ADO DA TA控件、ODBC数据接口及数据源等相关内容的预习工作3.本实验涉及的实验内容最好能在2课时内完成4.实验完成后需要书写实验报告,本次实验报告需在下次实验课堂上上交四、通过ODBC方式访问数据库并进行各种数据操作的一个实例建立一个名为MyDB的数据库,然后在此数据库中建立一个名为S的数据表,有关数据表S的属性描述为:Sno,学号,数据类型为char(10);Sname,姓名,数据类型为char(8);Ssex,性别,数据类型为char(2);BirthDay,生日,数据类型为datetime(8)。

创建一个名为Students的数据源,然后利用可视化程序设计语言设计一个用户操作界面,通过ODBC数据接口和ADO DATA实现对数据库MyDB中数据表S的查询、插入、删除、修改等数据操作。

数据库原理实验指导书

数据库原理实验指导书

数据库原理实验指导书实验名称:试验一: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中的查询。

使用嵌入式SQL访问数据库

使用嵌入式SQL访问数据库
关 键词 嵌 入 式 ,S L rc Q ,O al e


引 言

作为关 系数据库广泛使用的语言 S L Q ,其 表 达 能力 与 高 级 语 言 相 比 有 一 定 的 限 制 ,有 些 数 据 访 问 单 纯 使 用 S L无 法 完 Q 成 。 一方 面 ,S L在 逐 渐 增 强 自己 的 表达 能力 ,另 一方 面 ,太 Q 多 的 扩展 会 导 致 优 化 能 力及 执行 效 率 的 降 低 。 而 且 实 际 的 应 用 系统 是非 常 复 杂 的 ,数 据 库 访 问 只 是 其 中 一 个 部 件 。 有 些 动 作 如 与 用 户 交互 、图形 化 显示 数 据 等 只能 用 高 级 语 言 实 现 。 在 高 级 语 言 中 使 用 S L访 问 S L数 据 库 主 要 有 两 种 方 Q Q 法 ,一 种 是 通 过 S L调用 层 接 口 ( L) ,另 一 种 是 使 用 嵌 入 Q CI 式 SL Q 。本 文 对 S L调 用 层 接 口只 做 简 单 介 绍 , 主要 讨 论 嵌 入 Q 式 S L的使 用 。 Q
} 、 } 。 ,

ti hs一> e Mo ie Fa ' S t df d lg( : i ) )


上 面 代 码 实 现 了 元 件 的绘 制 。最 终 绘 制 是 调 用 元 件 类 本 身
的 pit( ,Y D r n X ,p C)来实现 。到此编辑模 块程序 已实现 。下
维普资讯
l 。
使 硪靛 入茸 S L Q
l ' l| l 薹


据 库
' l _
_

摘 要 本 文 阐述 了使 用嵌入 式 S L访 问数据 库 ,介 绍 了嵌 入 式 S L使 用 的一般 方 法 ,并 Q Q 给 出 了一 个利 用 V 6 0在 C语 言 中使 用嵌入 式 S L访 问 O a l 数 据 库 的 实例 。 C . Q rce

odbc编程

odbc编程

odbc编程ODBC编程是一种常用的数据库访问方式,它提供了一种标准的接口,使得不同的应用程序可以通过相同的方式来访问不同的数据库。

本文将介绍ODBC编程的基本概念、使用方法以及一些常见的应用场景。

一、ODBC编程的基本概念ODBC全称为Open Database Connectivity,它是一种应用程序接口(API),用于访问各种数据库的标准。

通过ODBC,应用程序可以使用统一的方式来连接、查询和更新数据库。

ODBC的核心概念包括数据源、数据源名称(DSN)、驱动程序和连接。

1. 数据源(Data Source):数据源是指数据库的名称或位置,可以是本地的数据库文件,也可以是远程的数据库服务器。

在ODBC中,数据源可以用一个字符串来表示,比如一个文件路径或一个网络地址。

2. 数据源名称(Data Source Name,DSN):DSN是一个标识符,用于标识一个具体的数据源。

它包含了连接数据库所需的信息,比如数据库的类型、地址、用户名和密码等。

在ODBC编程中,我们可以通过DSN来连接数据库,而不需要关心具体的数据库类型和连接细节。

3. 驱动程序(Driver):驱动程序是ODBC的核心组成部分,它负责实际连接数据库并执行相应的操作。

不同的数据库类型通常需要不同的驱动程序来进行连接和操作。

在ODBC编程中,我们需要根据数据库类型选择合适的驱动程序。

4. 连接(Connection):连接是指应用程序与数据库之间建立的通信通道。

在ODBC编程中,我们首先需要建立一个连接,然后才能进行后续的查询和更新操作。

连接可以通过DSN来建立,也可以直接指定连接参数。

二、ODBC编程的使用方法ODBC编程主要包括以下几个步骤:加载驱动程序、建立连接、执行SQL语句、处理结果和关闭连接。

下面我们将分别介绍这些步骤的具体实现。

1. 加载驱动程序:在使用ODBC编程之前,我们首先需要加载相应的驱动程序。

驱动程序通常是一个动态链接库(DLL)文件,我们可以使用系统提供的函数来加载和卸载它。

SQL入门(4):嵌入式SQL语言

SQL入门(4):嵌入式SQL语言

SQL⼊门(4):嵌⼊式SQL语⾔本节讲述内容:1.嵌⼊式SQL 语⾔概述2.变量声明与数据库连接3.数据集与游标4.可滚动游标与数据库的增删改5.状态捕捉以及错误处理机制(⼀)嵌⼊式SQL语⾔之前我们所学的都是交互式SQL 语⾔: select .. from .. where..嵌⼊式SQL语⾔表⽰将SQL语⾔嵌⼊到某⼀种⾼级语⾔中使⽤, ⽐如C++ ,Java, powerbuilder等它们也称为宿主语⾔(host language).复杂的检索不能⽤⼀条SQL语句完成, 需要结合⾼级语⾔中的顺序\分⽀\循环结构帮助处理.if [conditon] then SQL_query else SQL_query end ifdo while [condition] SQL_query end do还有在SQL语句的检索结果基础上,再进⾏处理的SQL_query1for ... doprocess the recordnextSQL_query 2if .. thenelseend if交互式SQL: select sname, sage from student where sname='xy';嵌⼊式SQL: 以宿主语⾔C语⾔为例,exec sql select sname, sage into :vsname, :vsage from student where sname='xy';主要区别:(1) exex sql 是⼀个引导词, 它引导sql 语句, 将SQL语句预编译成C编译器可识别的语句.(2) 增加 into ⼦句, ⽤于把SQL 语句的检索结果赋给⾼级语⾔的程序变量(3) ⽤冒号开头表⽰⾼级语⾔的程序变量 :vsname , :vsage冒号很重要, ⽤于区分是程序变量还是表的字段!! .... 还有很多特点之后在详细介绍为啥要学嵌⼊式SQL , ⽤来解决啥问题?下⾯逐个解决上述8个问题(⼀) 数据库的连接(问题1)在嵌⼊式SQL 操作之前, ⾸先需要与数据库进⾏连接不同的DMBS 的语句是有差别的,在嵌⼊式SQL程序执⾏之后, 需要断开数据库SQL 执⾏的提交与撤销SQL语句在执⾏过程中, 必须要有提交, 撤销语句提交: exec sql commit work;撤销: exec sql rollback work;很多DBMS 都设计了捆绑提交\撤销与断开连接在⼀起的语句, 以保证在断开连接之前使⽤户确认提交或撤销先前的⼯作, Oracle 中就是这样:exec sql commit release;exec sql rollback release;为什么需要提交和撤销呢? 这个设计到数据库中的'' 事务 ''处理什么是事务? 从应⽤程序员⾓度来看, 事物是⼀个存取或者改变数据库内容的程序的⼀次执⾏,或者说是⼀条或者多条SQL 语句的⼀次执⾏被看做是⼀个事务事务⼀般由应⽤程序员提出, 因此有开始和结束, 结束前需要提交或者撤销begin transactionexec sql...exec sql...exec sql commit work|exec sql rollback work --提交或者撤销end transaction注意: 提交表⽰这⼀系列操作对数据库的更新是有效的, 撤销则表⽰⽆效其实从任何⼀个SQL语句执⾏就表⽰了⼀个事务的开始, 到了 commit 或 rollback 则结束⼀个事务,因此上述的 begin end 可以省略.事务的ACID 特性A : atomicity 原⼦性, DBMS保证表⽰事务中的⼀组操作是不可分的,要么全做,要么⼀条也不做C : consistency ⼀致性,例如两个⼈同时在买车票,会不会买到同⼀张车票I: isolation 隔离性两个事务操作互不⼲扰D: durability 已提交事务的影响是持久的, 被撤销的事务影响可以恢复事务处理技术是DBMS的核⼼处理技术!!(⼆) 变量声明(问题2)exec sql select sname, sage into :vsname, :vsage from student where sname=:specname;加了冒号表⽰⾼级语⾔的程序变量, 这些变量需要声明exec sql begin declare section; --开始声明char vsname[10], specname[10]='xy' ;int vsage;exec sql end declare section; -- 结束声明注: 宿主程序的字符串变量长度要⽐字符型字段多1, 因为宿主程序的字符串尾部多⼀个终⽌符'\0' . -- 变量的声明与使⽤exec sql begin declare section;char vsname[10], specname[10]='xy' ;int vsage;exec sql end declare section;-- ⽤户在此处可以基于键盘输⼊给specname 赋值exec sql select sname, sage into :vsname, :vsage from student where sname=:specname;实例: 数据库连接+变量定义#include<stdio.h>#include"prompt.h"exec sql include sqlca; --sqlca 表⽰SQL的通信区, communication areachar cid_prompt[]="please enter customer id:";int main(){exec sql begin declare section; --下⾯声明变量char cust_id[5], cust_name[14];float cust_discnt;exec sql end declare section;exec sql whenever sqlerror goto report_error;-- 错误捕获exec sql whenever not found goto notfound; -- 记录没有找到strcpy(user_name,"poneilsql");-- 字符串赋值strcpy(user_pwd,"123456");exec sql connect :user_name identified by :user_pwd; -- 连接数据库while((prompt(cid_prompt,1,cust_id,4))>=0){exec sql select cname,discnt into :cust_name,:cust_discntfrom customers where cid=:cust_id; -- 根据输⼊的客户id 找到名字和折扣exec sql commit work;-- 提交printf("customer's name is %s and discountis %.1f\n",cust_name, cust_discnt);continue; -- 接着循环,再输⼊客户idnotfound:printf("can't find customer %s, continuing\n", cust_id);}exec sql commit release; -- 断开数据库的连接return0;report_error: -- 前⾯报错的执⾏print_dberror();exec sql rollback release; -- 断开连接return1;}(三) 数据集与游标(问题3 4 5)问题3: SQL 语句如何执⾏?问题4: 如何将SQL 检索到的结果传递回宿主程序进⾏处理?问题5: 如何将静态SQL , SQL语句中的常量更换为变量?如何读取单⾏数据和多⾏数据, 单⾏结果处理与多⾏结果处理的差异: into ⼦句和游标 cursor 1. 检索单⾏结果, 可以将结果直接传送到宿主主程序的变量中, select ... into ...exec sql select sname, sage into :vsname, :vsage from studentwhere sname=:specname;2. 如果是多⾏结果, 则需要使⽤游标cursor游标是指向某个检索记录的指针, 通过这个指针, 每次读⼀⾏, 处理⼀⾏,接着再读⼀⾏...,直到全部处理完毕 fetch..into... (⼀次⼀⾏)需要先定义⼀个cursor-->再打开-->接着⼀条⼀条处理-->最后关闭exec sql delcare cur_student cursor for--游标名select sno, sname, sclass from studentwhere sclass='0315'; -- 定义游标exec sql open cur_student; --打开游标exec sql fetch cur_student into :vsno, :vsname, :vsclass; --取数据...exec sql close cur_student; --关闭游标具体实例:已知表orders(cid, aid, product, dollars) 客户id, 代理⼈id, 产品, ⾦额游标: 给定⼀个客户id, 选出该客户下的所有代理商和⾦额(多⾏数据)#define True 1#include<stdio.h>#include"prompt.h"exec sql include sqlca; --sqlca 表⽰SQL的通信区, communication areaexec sql begin declare section; --声明变量char cust_id[5], agent_id[14];double dollar_sum;exec sql end declare section;int main(){char cid_prompt[]="please enter customer id:"; -- 定义提⽰字符串exec sql declare agent_dollars cursor for-- 定义游标select aid,sum(dollars) from orderswhere cid=:cust_id group by aid;exec sql whenever sqlerror goto report_error;-- 错误捕获exec sql connect to testdbl; --连接数据库exec sql whenever not found goto finish; -- 记录没有找到while((prompt(cid_prompt,1,cust_id,4))>=0){exec sql open agent_dollars; -- 打开游标while(True){ -- 打印每⼀条记录exec sql fetch agent_dollars into :agent_id,:dollar_sum;printf("%s %11.2f\n",agent_id, dollar_sum)};finish:exec sql close agent_dollars; -- 关闭游标exec sql commit work; -- 提交exec sql disconnect current;--断开连接return0;report_error: -- 前⾯报错的执⾏print_dberror();exec sql rollback;-- 撤销exec sql disconnect current; --断开连接return1;}总结游标:exec sql delcare cur_student cursor for--游标名select sno, sname, sclass from studentwhere sclass=:vclass; -- 定义游标order by snofor read only; --只读, 不可更新cursor 数据读取 fetch : exec sql fetch cursor_name into host_variableexec sql delcare cur_student cursor for--游标名select sno, sname, sclass from studentwhere sclass=:vclass; -- 定义游标order by snofor read only; --只读, 不可更新exec sql open cur_student; -- 打开exec sql fetch cur_student into :vsno, :vsname, :vsage; -- 使⽤exec sql close cur_student; -- 关闭可滚动游标与数据库的增删改标注的游标始终是⾃开始到结束⽅向移动的, 每fetch ⼀次,向结束⽅向移动⼀次,每⼀条记录只能被访问⼀次, 再次访问该记录只能关闭游标后重新打开可不可以实现游标的向上移动呢? ODBC (open database connectivity) 是⼀种跨DBMS 的DB 操作平台, 它在应⽤程序与实际的DBMS之间提供了⼀种通⽤的接⼝,很多DBMS不⽀持可滚动游标, 但是通过ODBC 可实现该功能定义中增加了 scroll使⽤如下:可滚动游标移动时需要判断是否到了结束位置, 或者到了起始位置,EOF表⽰最后⼀条记录的后⾯位置BOF表⽰起始位置的前⾯如果不需要区分最上最下, 则可以⽤whenever not found 进⾏检测⽤游标进⾏数据库的增删改1. 查找删除(与交互式delete 语句相同)exec sql delete from customers c where c.city='harbin'andnot exists (select*from orders o where o.cid=c.cid)-- 删除城市是哈尔滨且在订单 orders表⾥⾯没有记录的.2. 定位删除exec sql declare delcust cursor forselect cid from customers c where c.city='harbin'andnot exists (select*from orders o where o.cid=c.cid)for update of cid;exec sql open delcustwhile(True){exec sql fetch delcust into :cust_id;exec sql delete from customers where current of delcust;}1. 查找更新exec sql update student sset scalss='0315'where s.sclass='0314';2.定位更新exec sql declare stud cursor forselect*from student s where s.sclass='0314'andfor update of sclass;exec sql open studwhile(True){exec sql fetch stud into :vsno, :vsname,:vsclass;exec sql update studentset sclass='0315'where current of stud;}插⼊语句exec sql insert into student(sno,sname,sclass)values ('031501','xy','0315');exec sql insert into master_stud(sno,sname,sclass)select sno,sname,sclass from student;综合实例: 求数据库中某⼀列位于中值的那⼀⾏--已知表 orders(cid,aid,product,dollars)-- 寻找数据库中某⼀列位于中值的那⼀⾏#include<stdio.h>#include"prompt.h"exec sql include sqlca; --sqlca 表⽰SQL的通信区, communication areachar cid_prompt[]="please enter customer id:"; -- 定义提⽰字符串int main(){exec sql begin declare section; --声明变量char cid[5], user_name[20], user_pwd[10];double dollars; int ocount;exec sql end declare section;exec sql declare dollars_cursor cursor for-- 定义游标select dollars from orderswhere cid=:cid and dollars is not null order by dollars;exec sql whenever sqlerror goto report_error;-- 错误捕获strcpy(user_name,"poneilsql");-- 字符串赋值strcpy(user_pwd,"123456");exec sql connect :user_name identified by :user_pwd; -- 连接数据库--exec sql whenever not found goto finish; -- 记录没有找到while((prompt(cid_prompt,1,cust_id,4))>=0){exec sql select count(dollars) into :ocount from orderswhere cid=:cid;if(ocount==0){printf("no record reviewed for cid value %s\n",cid);continue;}exec sql open dollars_cursor;for (i=0;i<(ocount+1)/2;i++)exec sql fetch dollars_cursor into :dollars ;exec sql close dollars_cursor;exec sql commit work; -- 提交printf("median dollar amount=%f\n",dollars); }。

数据库应用开发 嵌入式SQL

数据库应用开发 嵌入式SQL

ODBC/ SQL
ISAM
Spatial
File
23
二、ADO与OLE DB (2 of 2)
利用ADO访问数据库的方法与步骤: ⑴ 连接数据源 ⑵ 创建SQL查询命令对象 ⑶ 激活命令,产生记录集 ⑷ 操作记录集中的记录 ⑸ 更新数据源
24
三、ADO应用程序开发
可以在任何支持COM和自动化特性的语言 环境中使用 。
EXEC SQL INCLUDE SQLCA;
SQLCA.SQLCODE是SQLCA的一个分量,属 于整数类型,供DBMS向应用程序报告SQL语 句的执行情况。每执行一条SQL语句,返回一 个SQLCODE代码。
三、嵌入式SQL语句和
9
主语言之间的通信
SQLCA.SQLCODE代码
SQLCODE=0:SQL语句执行成功,无异常出现;
具体应用见附件1。
10.3 基于JDBC技术的数据库开发25 方法
一、JDBC驱动 二、JDBC的接口和类 三、JDBC应用程序开发
26
一、JDBC驱动(1 of 2)
JDBC-ODBC 桥驱动程序
Java应用程序
JDBC驱动程序管理器
JDBC-Sybase 驱动程序
JDBC API
JDBC-Oracle 驱动程序
19
一、OLE DB
Microsoft采用OLE技术开发的一种新型的 数据库接口程序
在ODBC技术的基础上发展而来
20
1. OLE DB的体系结构
OLE DB主要由三个层次构成: ⑴ 数据使用者(Data Consumer) ⑵ 数据服务提供者(Data Service
Provider) ⑶ 数据提供者(Data Provider)

嵌入式SQL编程和通过ODBC访问数据库知识

嵌入式SQL编程和通过ODBC访问数据库知识

嵌入式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下;但仍然需要把该路径加到系统的路径变量中,以使得程序运行时能找到这两个文件。

数据库6.5 嵌入式SQL编程 (2)

数据库6.5 嵌入式SQL编程 (2)
< SELECT 语句> END EXEC 游标定义语句是一个说明语句,定义中的SELECT并不立即执行。
三、嵌入式SQL的使用规定(续)
2)游标打开语句(OPEN)。该语句在执行游标定义中的SELECT语句, 同时游标处于活动状态。游标是一个指针,此时指向查询结果的第一行之前。 OPEN语句的格式如下:
二、嵌入式SQL的处理过程
(1)嵌入式SQL是一个语句级接口,通过程序访问的数据 库模式必须在编写程序时已知,以便构造SQL语句。例如, 程序员必须知道数据表名称、列名称及它的域。 (2)对于嵌入式SQL,RDBMS一般采用预编译方法处理, 即由RDBMS的预处理程序对源程序进行扫描,识别出嵌入 的SQL语句,把它们转换成主语言调用语句,以使主语言 编译程序能识别它们,然后由主语言的编译程序将纯的主 语言编译成目标码。
三、嵌入式SQL的使用规定(续)
(2)SQL的集合处理方式与宿主语言单记录处理方式之间的协调
由于SQL语句处理的是记录集合,而宿主语言语句一次只能处理一条记录,因此 需要使用游标(Cursor)机制,把集合操作转换为单记录处理方式。与游标有关的 SQL语句如下:
1)游标定义语句(DECLARE)。游标是与某一查询结果相联系的符号名, 游标用SQL的DECLARE语句定义,其格式如下: EXEC SQL DECLARE <游标名> CURSOR FOR
6.6 嵌入式SQL编程
【本节的主要内容】
• 了解SQL与宿主语言的关系 • 理解嵌入式SQL的处理过程 • 理解嵌入式SQL与主语言之间的通信 • 掌握嵌入SQL的使用方式
一、嵌入式SQL与宿主语言
(1)SQL语言具有很强的查询处理能力,而逻辑表达的能力很弱,界面 编程能力也很弱。 (2)如JAVA,C/C++等高级语言具有很强逻辑表达能力,能实现复杂的 处理逻辑,同时具有较强的用户界面实现功能。 (3)为了使程序语言同时具有它的优点,在JAVA、C/C++等高级语言中 嵌入SQL语句,称高级语言为宿主语言。 (4)由DBMS的预编译器扫描识别处理SQL语句,把SQL语句转换成主 语言调用语句,以使主语言编译程序能识别它,最后由主语言的编译程 序将整个源程序编译成目标码,然后连接(Link)处理生成装载模块。

第10章 嵌入式SQL

第10章 嵌入式SQL
▪ 在SQL语句中使用的主语言程序变量简称为主变量 (Host Variable)
2020/2/24
Database Principles 12
主变量(续)
❖ 主变量的类型
– 输入主变量 – 输出主变量 – 一个主变量有可能既是输入主变量又是输出主变量
2020/2/24
Database Principles 13
/*为主变量deptname赋值*/
EXEC SQL CONNECT TO TESTlocalhost:54321 USER
"SYSTEM" /"MANAGER"; /*连接数据库TEST*/
EXEC SQL DECLARE SX CURSOR FOR /*定义游标*/
SELECT Sno, Sname, Ssex, Sage /*SX对应语句的执行结果*/
➢ 如果SQLCODE等于预定义的常量SUCCESS,则表示 SQL语句成功,否则表示出错
➢ 应用程序每执行完一条SQL 语句之后都应该测试一下 SQLCODE的值,以了解该SQL语句执行情况并做相应处 理
2020/2/24
Database Principles 11
二、主变量
❖ 主变量
▪ 嵌入式SQL语句中可以使用主语言的程序变量来输入 或输出数据
char HSsex[64];
int HSage;
int NEWAGE;
EXEC SQL END DECLARE SECTION; /*主变量说明结束*/
long SQLCODE;
EXEC SQL INCLUDE sqlca;
/*定义SQL通信区*/
2020/2/24
Database Principles 21

数据库实验七:通过嵌入式SQL访问数据库

数据库实验七:通过嵌入式SQL访问数据库

实验七通过嵌入式SQL访问数据库1 实验目的熟悉通过嵌入式SQL(主语言为C语言)编程访问数据库。

2 实验平台和实验工具在SQL Server数据库管理系统上,通过C语言(VC6)编写访问数据库的应用程序来对数据库进行各种数据操作。

编程工具自选。

3 实验内容和要求熟悉RDBMS的预编译程序。

通过嵌入式SQL编程访问数据库的基本步骤对学生课程数据库中的表,完成下面功能(你也可以自己给出功能要求):1. 查询某一门课程的信息。

要查询的课程由用户在程序运行过程中指定,放在主变量中。

2. 查询选修某一门课程的选课信息,要查询的课程号由用户在程序运行过程中指定,放在主变量中,然后根据用户的要求修改其中某些记录的成绩字段。

要求:提交源程序并标识必要的注释。

保证程序能正确编译和运行,认真填写实验报告。

3.1 嵌入式SQL要求:将一段连续的SQL操作写成嵌入到C程序中的程序,调试程序,使得程序能完成一项复杂的数据处理功能,并提交程序。

嵌入式SQL由SQL语句和C/C++代码组成。

其中SQL语句由预处理器翻译成C或C++的源代码。

对预处理后的源代码进行编译、链接生成可执行程序后方可运行。

3.2 SQL Server预处理器SQLServer的预处理程序是nsqlprepc.exe。

其常用的语法格式如下:nsqlprep 文件名■nsqlprep详细的语法格式以及参数意义,请参阅联机帮助。

■要求程序文档名的后缀为.sqc。

■预编译后得到的文档,与程序文档同名,后缀为.c;放在与程序文档同一个路径下。

nsqlprep.exe存在SQLServer的安装盘的x86\Binn下。

注意:在安装SQL Server时并不会同时安装预编译应用程序nsqlprep.exe,需要将此文件另拷贝至目录下。

3.3 预编译用SQLServer的预处理程序是nsqlprepc.exe对含有嵌入式SQL的程序文件进行预编译。

如果编写的主程序文件名称为authid.sqc,存放在E:\esql目录下,预编译的具体方法如下:◆在windows环境下在MS-DOS环境下进行预编译,假设我们将nsqlprep.exe文件拷贝纸e:\esql目录下:1)将E:\Esql设为当前目录;2)预编译。

SQL语言:嵌入式SQL知识笔记

SQL语言:嵌入式SQL知识笔记

SQL语言:嵌入式SQL知识笔记1、概念SQL提供了将SQL语句嵌入到某种高级语言中的使用方式,通常采用预编译的方法将SQL语句嵌入高级语言中。

采用的方法由DBMS 的预处理程序对源程序进行扫码、识别出SQL语句,把它们转换为主语言调用语句,这样可以让主语言编译程序能识别它,最后由主语言的编译程序将整个源程序编译成目标码。

2、SQL嵌入主语言涉及的几个问题区分主语言语句与SQL语句:通常在SQL语句前加前缀EXEC SQL,结束标志会跟着主语言不同而不同。

主语言工作单元与数据库工作单元的通信机制1、SQL通信区:向主语言传递SQL语句执行状态信息,使主语言能够根据此信息控制程序流程。

2、主变量:也成为共享变量。

主语言向SQL语句提供参数主要通过主变量,主变量由主语言的程序定义,并用SQl的DECLARE语句说明。

比如C语言中用法:•••••exec sql begin delcare section char sno[4],cno[3]int grade;char sqlstate[7]exec sql end declare section根据共享变量givesno值查询学生关系students 中的学生姓名、年龄、性别•••exec sql select sname,age,sex into:Msno,:Mcno;givensno from studnets where sno:Msno;3、游标SQl语言主要是面向集合的,一条SQL语句可产生或处理多条记录。

而主语言是面向记录的,一组主变量一次只能放一条记录,因此引入游标,通过移动游标指针来决定获取那一条记录。

3.1 定义游标:•••exec sql declare<游标> cursor for <select查询语句>endexec3.2 打开游标•exec sql open <游标名> endexec该语句执行游标定义中的select语句,同时游标处于活动状况。

嵌入式SQL访问数据库

嵌入式SQL访问数据库

黄冈师范学院提高型实验报告嵌入式SQL访问数据库实验课题(实验类型:□综合性■设计性□应用性)实验课程数据库实验时间2012年5月20号学生姓名专业班级信息1001班学号一,实验目的与要求。

编写嵌入式C程序,编程实现了对“学生课程数据库”的访问和操作:对Student表中年龄进行更新。

系统每输出一个学生记录,询问用户是否更新。

如果要更新,就输入新的年龄。

要求:将一段连续的SQL 操作写成嵌入到C 程序中的程序,调试程序,使得程序能完成一项复杂的数据处理功能,并提交程序。

嵌入式SQL 由SQL 语句和C/C++代码组成。

其中SQL 语句由预处理器翻译成C 或C++的源代码。

对预处理后的源代码进行编译、链接生成可执行程序后方可运行。

二, 实验条件联想G455笔记本一台三, 实验原理分析。

嵌入式SQL 是将SQL 语句嵌入程序设计语言中,被嵌入的程序设计语言,如C 、C++、JA V A,称为宿主语言,简称主语言。

对ESQL,RDBMS 一般采用预编译方法处理,即由RDBMS 的预处理程序对源程序进行扫描,识别出ESQL 语句,把他们转换成主语言调用语句,以使主语言编译程序能识别他们,然后又主语言的编译程序将纯的主语言程序编译成目标码。

简单的SQL 语句在VC6.0中无法正常运行编译,有了ESQL 编译过程,可以先对VC 设置改变环境,修改相应的头文件以及包含文件,然后预编译产生一个C 文件,运行VC++6.0,新建一个"WIN32 Console Application"(!!注意是"WIN32 Console Application"不要选成了"WIN32 Application"!!)的工程,然后将预编译生成的c 文件加入工程。

此时还不能编译成功,需添加两个库文件SQLakw32.lib,Caw32.lib 。

最后将相应的C 文件加入进去编译运行即可。

数据库原理-实验7-通过ODBC访问数据库

数据库原理-实验7-通过ODBC访问数据库

一、实验目的:1.理解ODBC的相关概念:ODBC、句柄等;2.理解ODBC的工作原理;3.掌握ODBC的工作流程;4.掌握通过ODBC访问数据库的方法二、实验环境:SQL Server 2008、VC++ 6.0三、实验学时:2学时四、实验内容和步骤:(一)配置数据源配置数据源共有两种方法:方法一:运用数据源管理工具来进行配置。

方法二:使用Driver Manager 提供的ConfigDsn函数来增加、修改或删除数据源。

这种方法特别适用于在应用程序中创建的临时使用的数据源。

在本实验中,我们采用第一种方法创建数据源。

我们将其取名为SQLServer。

下面是建立这数据源的具体步骤。

选择『开始』│『设置』│『控制面板』菜单,在弹出窗口中双击“管理工具”图标进入管理工具界面,双击“数据源(ODBC)”图标。

建立SQLServer数据源。

(1)选择“系统DSN”选项,单击【添加(D)…】按钮,系统弹出“创建新数据源”对话框,如下图所示:图1 数据源管理器(2)如图2所示,在ODBC驱动器程序列表中,选择“SQL Server”,单击【完成】按钮,系统弹出“Create New Data Source to SQL Server”对话框,如图2所示:图2 创建数据源配置(3)如图3,输入数据源名称和服务器,单击【下一步】按钮。

图中数据源的名称为SQLServer,服务器为(local)。

如图4,选择身份认证方式,输入用户名和密码,用户名和口令分别为sa和sa(请根据实际情况进行修改,并对源代码进行相应的修图3 SQLServer数据源配置(1)图4 SQLServer数据源配置(2)(4)连续单击【下一步】按钮,这样就创建了一个名为“SQLServer”的SQL Server ODBC数据源。

如图5所示,将弹出一个提示框,提示即将创建一个新的ODBC数据源。

图5 提示框(5)如果要测试和数据源的连接是否成功,可以单击“Test Data Source”,如果连接成功,系统将会显示一个连接成功的消息框,如图6所示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

嵌入式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下;但仍然需要把该路径加到系统的路径变量中,以使得程序运行时能找到这两个文件。

方法1:把该两文件拷贝到操作系统目录下的子目录system32中方法2:把C:\Program Files\Microsoft SQL Server\MSSQL\Binn加到系统环境变量path中。

“我的电脑”->“属性”->“高级”->“环境变量”->“path,编辑”,如下图所示:在变量值中加入该路径值;注意,路径间用分号”;”分开。

在实验过程中发现如果只做第二步,在之后的运行过程中会报错,只有将方法一也执行了这个连接的准备工作才算是正式完成。

2)通过ODBC访问数据库:配置ODBC,为SQL Server添加数据源。

如下图所示:初始化环境:1.SQL Server2000为其嵌入式SQL提供了一些特殊的接口;默认的安装方式(典型安装)并没有安装这些接口;因此,需要把devtools.rar解压到SQLServer的系统目录下(注意,不是安装目录);本机是把操作系统安装在C盘,则SQLServer的系统目录则是C:\Program Files\Microsoft SQL Server。

2.初始化SQL Server的预编译环境。

⏹初始化Visual C++ 6.0 编译器环境,运行文件:\Microsoft VisualStudio\VC98\Bin\VCVARS32.BAT这个过程要在DOS下运行才有效,即找vcvars32.bat的路径,在DOS下运行。

具体步骤如下:⏹初始化SQLServer的预编译环境,运行文件:\devtools\samples\esqlc\setenv.bat。

运行方式与vcvars32.bat相同,结果如下:3.初始化Visual C++ 6.0环境。

⏹Tools->options->directories->IncludeFiles: C:\Program Files\Microsoft SQL Server\devtools\include⏹Tools->options->directories->LibFiles:C:\Program Files\Microsoft SQL Server\devtools\x86lib注意:这些路径需要设为第一项。

如下图所示:Project->Settings->Link->Object/Library Modules,添加库文件:SQLakw32.lib,Caw32.lib注意,两个文件之间用空格分开。

实验活动1.阅读和分析程序esql.sqc,解释程序的主要内容和主要数据结构。

程序的主要内容:嵌入式SQL的使用,将SQL嵌入到C语言中,在SQL的数据库中通过SELECT 语句获取数据,并将获得的信息通过主变量传递给主语言并打印输出。

给出的程序中将程序连接到SQL服务器上的pubs数据库上,查询满足以下SELECT语句的数据信息:select EmployeeID from orders where OrderID = 345查询得到的结果由主变量EmployeeID传给主语言(C语言),C语言得到数据信息后打印输出。

程序分为以下几块:1)主变量的声明:在EXEC SQL BEGIN DECLARE SECTION;和EXEC SQL END DECLARE SECTION;之间声明主变量EmployeeID。

2)连接到DBMS:连接到数据库的管理系统以便从中查询登陆的数据库。

连接到数据库的语法为:EXEC SQL CONNECT TO SQLServer.DataBaseName USER logName.passwd3)查错:为了更好的判断和查找错误以修改程序,所以在每次执行完SQL语句后都应该对sqlca所返回的状态值加以判断。

若sqlcode等于0,则输出建立成功信息,否则报错。

4)执行查询:在这里嵌入SQL的查询语句EXEC SQL select EmployeeID INTO :EmployeeIDfrom orders where OrderID = 345 ,并通过主变量EmployeeID返回查询到的结果,打印结果。

5)断开所有连接:执行完所有的数据库的访问后,断开所有的连接以释放系统资源。

语法为:EXEC SQL DISCONNECT ALL;数据结构:主要为在数据库中存储的表,及针对表进行的查找。

2.对程序esql.sqc作适当的修改,使之可以在本地系统上可以运行。

进行预处理、编译、连接(lib连接),查看运行结果。

1)修改:只需要对连接的服务器及数据库进行修改即可:EXEC SQL CONNECT TO SKY.pubs USER abc.abc;(SKY为SQLServer,根据自己的定义的名称修改)同时由于pubs数据库中没有orders表,所以对SELECT语句也作了修改如下:EXEC SQL select emp_id INTO :EmployeeID from employee where lname = 'Accorti';2)进行预处理:将esql.sqc文件放在C:\Program Files\Microsoft SQL Server\MSSQL\Binn 目录下,运行cmd,进入C:\Program Files\Microsoft SQL Server\MSSQL\Binn 目录,用nsqlprep esql.sqc的方式运行该文件,可以在C:\Program Files\Microsoft SQL Server\MSSQL\Binn中找到预编译后生成的.c文件。

运行过程显示如下:3)连接操作已经在前面的初始化环境过程中完成。

4)出现的怪异问题:尽管之前的准备步骤都已经全部做完,但是在预编译时总是会出现以下问题,每次都要重新把安装文件下的BIN和DEVTOOLS重新拷一遍到C盘SQLSERVER相应得路径下,然后再在DOS下运行setenv.bat和vcvars32.bat两个文件才能解决这个问题,有时甚至所有步骤都要重新做一次。

思考:sqlca结构中主要的数据项有哪些?我们常用的有哪些?sqlca是一个含有错误变量和状态指示符的数据结构。

通过检查sqlca,应用程序能够检查出嵌入式SQL语句是否成功,并根据成功与否决定是否继续往下执行。

与编译器自动在嵌入SQL语句中包含SQLCA数据结构。

从联机帮助上我们可以找到,SQLCA结构中主要的数据项如下(用结构体表示):在SQLCA中我们经常用到的是sqlcode,它用来记录最近执行的SQL状态:"0" :表示该SQL语句被正确执行,无错误发生>0 :表示执行了该语句,但遇到了错误<0 :表示由于数据库、系统、网络或应用程序错误等等原因未执行该语句SQL操作的常见的错误类型有哪些?如何得到错误信息?举例说明SQL中常见的错误类型有:通过下面的这些返回值,可以得到相应的出错信息。

连接DBMS错误通过sqlca中的变量sqlcode的返回值获得错误信息,当返回值为0时,表示连接成功,否则,连接失败。

例如esql.sqc中用以下语句获得错误信息:if (SQLCODE == 0){printf("Connection to SQL Server established\n");}else{// 连接DBMS错误printf("ERROR: Connection to SQL Server failed\n");return (1);}如何处理SQL操作的错误信息?a) 对于DBMS连接错误:检查连接是否正常:1)看SQL服务器是否启动2)所连接的数据库是否存在3)登录用户是否具备相应的权限(登录用户的数据库角色) 4)网络连接端口(1433)是否打开b) 用sqlcode:在程序的error段输入如下语句:根据sqlcode的值查看联机帮助,根据在联机帮助上查到的错误信息检查相应的SQL语句,针对性的进行修改,直到其能正确运行c)WHENEVER语句:在每条嵌入式SQL语句之后立即编写一条检查SQLCODE值的程序是一件很繁琐的事情,为了简化错误处理,可以使用WHENEVER语句:WHENEVER是说明语句,不是可执行语句,不返回SQLCODE,只是根据SQLCA中的返回码指定相应的措施。

相关文档
最新文档