1 / 19

数据库系统概论 An Introduction to Database System 第八章 数据库编程

数据库系统概论 An Introduction to Database System 第八章 数据库编程. 8.1 嵌入式 SQL. SQL 语句除了象前面介绍的可以交互的方式使用的外,更常用的方式是用某种传统的编程语言(例如: C 、 PB 、 COBOL 等)编写程序,但程序中的某些函数或某些语句是 SQL 语句。这种方式下使用的 SQL 语言称为嵌入式 SQL ( EmbeddedSQL ),其中传统的编程语言称为宿主语言(或主语言)。. 8.1.1 嵌入式 SQL 的一般形式.

xylia
Download Presentation

数据库系统概论 An Introduction to Database System 第八章 数据库编程

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 数据库系统概论 An Introduction to Database System 第八章 数据库编程 An Introduction to Database System

  2. 8.1嵌入式SQL • SQL语句除了象前面介绍的可以交互的方式使用的外,更常用的方式是用某种传统的编程语言(例如:C、PB、COBOL等)编写程序,但程序中的某些函数或某些语句是SQL语句。这种方式下使用的SQL语言称为嵌入式SQL(EmbeddedSQL),其中传统的编程语言称为宿主语言(或主语言)。 An Introduction to Database System

  3. 8.1.1嵌入式SQL的一般形式 • 对嵌入到高级语言中的SQL语句,必需能够与宿主语言语句区分开来,例如Power Builder中采用的区分方式是在SQL语句后加上分号“;”。 • 而大多数的宿主语言在SQL前加上EXEC SQL标记,而结束标记各有不同。 • 在识别出嵌入式SQL后,DBMS可以采用两种方法处理嵌入式SQL语言: • 预编译 • 扩充编译程序法。 An Introduction to Database System

  4. 主语言程序 含ESQL语句 RDBMS的 预处理程序 ESQL语句转换 为函数调用 主语言 编译程序 目标语言程序 ESQL基本处理过程 嵌入式SQL的处理过程 An Introduction to Database System

  5. 8.1.2 嵌入式SQL与主语言之间的通信 • SQL为面向集合的语句,而主语言为面向过程的语句,必需解决好二者的通信问题。 An Introduction to Database System

  6. 一、SQL通信区 • 在主变量中,有一个系统定义的主变量,叫SQLCA(SQL Communication Area:SQL通信区)。SQLCA是一全局变量,供应用程序和DBMS通信之用。SQLCA变量不需加以说明,在Power Builder中可以直接使用。 • 例如SQLCA对象的SQLCODE的值可以返回SQL语句是否执行成功,而SQLErrText可以返回出错的原因。 An Introduction to Database System

  7. 二、主变量 • 在DBMS和宿主语言程序之间的数据传递,是通过宿主语言程序变量,简称主变量来实现的。 • 当SQL语句引用主变量时,变量前应加冒号“:”,以区别于数据库对象名(如:列名、表名、视图名等),因此主变量可与数据库变量同名。在宿主语言中引用主变量时,不须加冒号。通过主变量,宿主语言可向SQL语句提供参数,如指定向数据库中插入(或修改)的数据; An Introduction to Database System

  8. 另外,SQL语句可对主变量赋值或设置状态信息,返回给应用程序,使应用程序得到SQL语句的结果和状态。另外,SQL语句可对主变量赋值或设置状态信息,返回给应用程序,使应用程序得到SQL语句的结果和状态。 • 在嵌入式程序中,所有的主变量,除系统定义的外,都必须加以说明,说明放在两个嵌入式SQL语句之间: • EXEC SQL BEGIN DECLARE SECTION; • … • EXEC SQL END DECLARE SECTION; 提示: Power Builder定义方法与普通变量一样,无需放在上述结构中。 An Introduction to Database System

  9. 三、游标 • SQL语言和宿主语言的不同数据处理方式,是通过游标(Cursor)来协调的。游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标都有一个名字。用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,由宿主语言作进一步的处理。 • 游标的操作包括四个步骤: An Introduction to Database System

  10. 1. 说明游标 • 格式: • EXEC SQL DECLARE 游标名CURSOR • FOR<SELECT语句>; • 其中的SELECT语句,既可以是简单查询,也可以是连接查询或嵌套查询,它的结果集是一个新的关系。 • 说明游标仅仅是一条说明性语句,此时DBMS并不执行SELECT指定的查询操作。 An Introduction to Database System

  11. 2.打开游标 • 格式: • EXEC SQL OPEN<游标名>; • 打开游标,将执行相应的SELECT语句,把满足查询条件的所有记录,从表中取到缓冲区中。此时游标被激活,指针指向结果集中的第一条记录。 An Introduction to Database System

  12. 3.推进游标指针并取当前记录 • 使用FETCH语句,将缓冲区中的当前记录取出送至主变量供宿主语言进一步处理。同时,把游标指针向前推进一条记录。 • 格式: • EXEC SQL FETCH<游标名>INTO<主变量名列表>; • 主变量名列表由逗号分开,并与SELECT语句中的目标列表达式必须一一对应。 An Introduction to Database System

  13. 4.关闭游标 • 用CLOSE语句关闭游标,释放结果集占用的缓冲区及其他资源。但是,被关闭的游标可以用OPEN语句重新初始化,与新的查询结果相联系。 • 格式: • EXEC SQL CLOSE<游标名>; An Introduction to Database System

  14. …. • EXEC SQL INCLUDE SQLCA; ……… ( 1) 定义SQLCA • EXEC SQL BEGIN DECLARE SECTION; (2) 开始定义主变量 • CHAR Sno(5): CHAR Cno(3): INT Grade; • EXEC SQL END DECLARE SECTION;….. 主变量定义结束 • main () { • EXEC SQL DECLARE CURSOR C1 FOR ….(3) 定义游标 • SELECT Sno,Cno,Grade FROM SC; • EXEC SQL OPEN C1;…………………….(4) 打开游标 An Introduction to Database System

  15. for(;;) { • EXEC SQL FECH C1 INTO :Sno, :Cno,:Grade;……(5) 推进游标 • If (sqlca.sqlcode<>SUCCESS) break; • Printf( “Sno:%s,Cno:%s,Grade:%d”,Sno,Cno,Grade); • } • EXEC SQL CLOSE C1; ……..(6) 关闭游标 • } An Introduction to Database System

  16. PB中游标实例 • string sdept,sno,sname,ssex • int sage • sdept=sle_1.text • Declare stu_cursor cursor for • select sno,sname,ssex,sage • from student • where sdept=:sdept; • Open stu_cursor; An Introduction to Database System

  17. PB中游标实例(续) • Fetch stu_cursor into :sno,:sname,:ssex,:sage; • Do while sqlca.sqlcode =0 • MessageBox(‘tip’,”Sno:”+sno+”sname:”+sname+”ssex:”+ssex+”sage:”+sage) • Fetch stu_cursor into :sno,:sname,:ssex,:sage; • Loop • Close stu_cursor; An Introduction to Database System

  18. C#中使用嵌入式SQL的例子 • String ConnString = System.Configuration.ConfigurationManager.ConnectionStrings["bysjConnectionString"].ConnectionString; • SqlConnection Conn = new SqlConnection(ConnString); • Conn.Open(); • String profession = Session["profession"].ToString(); • String technical = technicalList.SelectedValue; • String teacher_name = tname.Text.Trim(); • String institute = instituteTextBox.Text.Trim(); • String strSQL = "insert teacher_login(teacher_name,institute,profession,technical) values('"; • strSQL += teacher_name + "','" + institute + "'," + profession + ",'" + technical + "')"; An Introduction to Database System

  19. Response.Write(strSQL); • try • { • SqlCommand Comm = new SqlCommand(strSQL, Conn); • Comm.ExecuteNonQuery(); • } • catch (Exception error) • { • Response.Write(error.ToString()); • } • finally • { • Conn.Close(); • } An Introduction to Database System

More Related