学过《数据库系统概论》的嵌入式sql
由于当时课内不要求,平时没应用
这次考试遇到一道嵌入式sql  不会课本里的嵌入式sql都是类似用EXEC SQL来区分sql与宿主语言的
像EXEC SQL DECLARE 定义变量
EXEC SQL CONNECT
EXEC SQL OPEN 我学vb,asp,jsp,asp.net
平时都是用string str="select * from dataname";
或者用asp.net 中ado.net对象来访问
请问这些是不是嵌入式sql啊

解决方案 »

  1.   

    什么是嵌入SQL语言?
    SQL是一种双重式语言,它既是一种用于查询和更新的交互式数据库语言,又是一种应用程序进行数据库访问时所采取的编程式数据库语言。SQL语言在这两种方式中的大部分语法是相同的。在编写访问数据库的程序时,必须从普通的编程语言开始(如C语言),再把SQL加入到程序中。所以,嵌入式SQL语言就是将SQL语句直接嵌入到程序的源代码中,与其他程序设计语言语句混合。专用的SQL预编译程序将嵌入的SQL语句转换为能被程序设计语言(如C语言)的编译器识别的函数调用。然后,C编译器编译源代码为可执行程序。
    各个数据库厂商都采用嵌入SQL语言,并且都符合ANSI/ISO的标准。所以,如果采用合适的嵌入SQL语言,那么可以使得你的程序能够在各个数据库平台上执行(即:源程序不用做修改,只需要用相应数据库产品的预编译器编译即可)。当然,每个数据库厂商又扩展了ANSI/ISO的标准,提供了一些附加的功能。这样,也使得每个数据库产品在嵌入SQL方面有一些区别。本章的目标是,对所有的数据库产品的嵌入SQL做一个简单、实用的介绍。
        当然,嵌入SQL语句完成的功能也可以通过应用程序接口(API)实现。通过API的调用,可以将SQL语句传递到DBMS,并用API调用返回查询结果。这个方法不需要专用的预编译程序。
      

  2.   

    为了更好的理解嵌入SQL,本节利用一个具体例子来说明。嵌入SQL允许程序连接数据库并且包括SQL代码到程序中,这样在程序中就可以对数据库进行使用、操作以及处理数据等等。以下是用C语言编写的使用嵌入SQL的例程,它将打印一个报告;这个程序必须在普通的编译之前先预编译SQL语句。嵌入SQL对于不同系统是不一样的,所以在不同的系统中对以下的程序稍作修改,特别是变量的声明以及过程记录等。在嵌入SQL时,考虑网络、数据库管理系统、操作系统是相当重要的。以下是详细的代码:#include <stdio.h>/* 以下这部分是声明主机变量,它将使用于程序中*/EXEC SQL BEGIN DECLARE SECTION;int BuyerID;char FirstName[100], LastName[100], Item[100];EXEC SQL END DECLARE SECTION;
    /* 以下包括SQLCA变量,它可以用来进行错误检查 */EXEC SQL INCLUDE SQLCA;main() {/* 以下连接数据库*/EXEC SQL CONNECT UserID/Password;/* 以下是连接数据库并检查是否有错误产生T */ if(sqlca.sqlcode) {printf(Printer, "Error connecting to database server.\n");exit();}printf("Connected to database server.\n");/* 下面声明一个 "Cursor"。它将在查询结果多于一行的时候使用*/EXEC SQL DECLARE ItemCursor CURSOR FORSELECT ITEM, BUYERIDFROM ANTIQUESORDER BY ITEM;EXEC SQL OPEN ItemCursor;/* 你可以在这里还可以加入另外一些错误检查的内容,这里就省略了*//* 当这个CURSOR没有数据, sqlcode将被产生以允许我们退出循环。这里注意,为了简单起见,我们使程序遇到错误的时候就退出任何的sqlcode。*/EXEC SQL FETCH ItemCursor INTO :Item, :BuyerID;while(!sqlca.sqlcode) {EXEC SQL UPDATE ANTIQUESSET PRICE = PRICE + 5WHERE ITEM = :Item AND BUYERID = :BuyerID;EXEC SQL SELECT OWNERFIRSTNAME, OWNERLASTNAMEINTO :FirstName, :LastNameFROM ANTIQUEOWNERSWHERE BUYERID = :BuyerID;printf("%25s %25s %25s", FirstName, LastName, Item);
    EXEC SQL FETCH ItemCursor INTO :Item, :BuyerID;}/* 关闭CURSOR,提交变化并退出程序。*/EXEC SQL CLOSE DataCursor;EXEC SQL COMMIT RELEASE;exit();}
      

  3.   

    嵌入式SQL是用于C和C++编程语言的数据库编程接口。它由混杂在(嵌入于)C或C++源代码中的SQL语句组成。这些SQL语句先由SQL预处理器转换为C或C++源代码,然后再进行编译。在运行时,嵌入式SQL应用程序是用数据库的接口库与数据库服务器进行通信。在大多数平台上,接口库是一个动态连接库(DLL)或共享库。在Windows操作系统上,接口库是dblib9.dll。在UNIX操作系统上,接口库会是libdblib9.so、libdblib9.sl、或libdblib9.a(视操作系统而定)。 开发过程概述:
    在对程序成功地进行预处理和编译后,就可以将它与Adaptive Server Anywhere接口库的导入库链接在一起,以形成可执行文件。在运行数据库时,这个可执行文件使用Adaptive Server Anywhere DLL与数据库交互作用。在对程序进行预处理时,不必运行数据库。对于Windows、Watcom C/C++ 、Microsoft Visual C++和Borland C++各自有单独的导入库。使用导入库是开发调用DLL中函数的应用程序的标准方法。嵌入式SQL程序的结构:SQL语句置于(嵌入)常规C或C++代码内。所有嵌入式SQL语句都以EXEC SQL开头,并以分号(;)结尾。在嵌入式SQL语句的中间允许使用常规C语言注释。使用嵌入式SQL的每个C程序都必须在源文件中任何其它嵌入式SQL语句之前包含以下语句:     EXEC  SQL  INCLUDE  SQLCA;由C程序执行的第一个嵌入式SQL语句必须是CONNECT语句。CONNECT语句用于建立与数据库服务器的连接,以及指定连接期间用于授权执行的所有语句的用户ID。CONNECT语句必须是执行的第一个嵌入式SQL语句。有些嵌入式SQL命令不生成任何C代码,或者不会涉及与数据库通信。因此,允许在CONNECT语句之前使用这些命令。最主要的是INCLUDE语句和指定错误处理方法的WHENEVER语句。使用主机变量:主机变量是供SQL预处理器识别的C语言变量。主机变量可用于将值发送到数据库服务器或从数据库服务器接受值。主机变量非常易于使用,但是它们具有一些限制。动态SQL是一种向数据库服务器和从数据库服务器中传递信息的更常用的方法,它使用被称为[SQL描述符区域](SQLDA)的结构。SQL预处理器为使用主机变量的每个语句自动生成SQLDA。声明主机变量:主机变量是通过将它们放入声明部分来定义的。按照IBM SAA和ANSI嵌入式SQL标准,主机变量是通过用一下内容围绕常规C变量声明定义的:     EXEC  SQL  BEGIN  DECLARE  SECTION;     /*C  variable declarations*/     EXEC  SQL  END  DECLARE  SECTION;然后,可以使用这些主机变量代替任意SQL语句中的值常量。在数据库服务器执行命令时,会使用主机变量的值。注意,不能使用主机变量代替表名或列名:这需要使用动态SQL。在SQL语句中,变量名以冒号(:)为前缀,以便与语句中使用的其它表示服区别开。标准SQL预处理器不扫描位于DECLARE  SECTION之外的C语言代码。因此,不允许使用TYPEDEF类型和结构。在DECLARE  SECTION之内允许使用变量中的初始化程序。
      

  4.   

    看来课本里学得e-sql都是用于c/c++的
    当时学c/c++没有精通到使用数据库
    所以根本就没用到这些EXEC SQL语句想问我现在学web开发,用asp.net学这些嵌入式sql还有利用价值吗
      

  5.   

     不是,只不过是把sql语句当做字符串参数传给了数据库,并不是传统意义上的嵌入式SQL,但也可以理解为高级语言对嵌入式SQL的一种发展和延伸。
    传统意义上所说的嵌入式SQL,其中一个最大的特征就是SQL的参数或变量可以和宿主语言的变量通用。所说的传统意义,就是指在C语言等环境下的,
    这是我的一点理解