学过《数据库系统概论》的嵌入式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啊
由于当时课内不要求,平时没应用
这次考试遇到一道嵌入式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啊
解决方案 »
- 求教,安装sql 2000遇到问题
- 获取表TAB中排第66至70的记录,数据是按id升序排列的,当id不连续的,sql语句怎么实现?
- 一个小问题,答这有分,请问where后的查询条件表达式可以用自定义函数吗?
- 问题!
- 能否在SQL捕获错误转到一个标号处,而不是人为的用GOTO语句
- 这句sql语句可不可以优化?
- Select top可以这次取出头上几百条数据,下一次接着取上次最后数据之后的数据吗?请教各位大侠
- 有关光标<不是游标>:要了光标select * from table<此表100万条记录,用时将要60-120秒之间> ;不要光标<查询同样的记录数,用时只要5-10秒,
- SQL SERVER 的IDENTITY
- 问一个网络数据库的问题
- 请教:CDatabase对Excel追加记录不成功
- 关于全局变量,显示事物,索引的3个弱弱的问题!!望高手解惑
SQL是一种双重式语言,它既是一种用于查询和更新的交互式数据库语言,又是一种应用程序进行数据库访问时所采取的编程式数据库语言。SQL语言在这两种方式中的大部分语法是相同的。在编写访问数据库的程序时,必须从普通的编程语言开始(如C语言),再把SQL加入到程序中。所以,嵌入式SQL语言就是将SQL语句直接嵌入到程序的源代码中,与其他程序设计语言语句混合。专用的SQL预编译程序将嵌入的SQL语句转换为能被程序设计语言(如C语言)的编译器识别的函数调用。然后,C编译器编译源代码为可执行程序。
各个数据库厂商都采用嵌入SQL语言,并且都符合ANSI/ISO的标准。所以,如果采用合适的嵌入SQL语言,那么可以使得你的程序能够在各个数据库平台上执行(即:源程序不用做修改,只需要用相应数据库产品的预编译器编译即可)。当然,每个数据库厂商又扩展了ANSI/ISO的标准,提供了一些附加的功能。这样,也使得每个数据库产品在嵌入SQL方面有一些区别。本章的目标是,对所有的数据库产品的嵌入SQL做一个简单、实用的介绍。
当然,嵌入SQL语句完成的功能也可以通过应用程序接口(API)实现。通过API的调用,可以将SQL语句传递到DBMS,并用API调用返回查询结果。这个方法不需要专用的预编译程序。
/* 以下包括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();}
在对程序成功地进行预处理和编译后,就可以将它与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之内允许使用变量中的初始化程序。
当时学c/c++没有精通到使用数据库
所以根本就没用到这些EXEC SQL语句想问我现在学web开发,用asp.net学这些嵌入式sql还有利用价值吗
传统意义上所说的嵌入式SQL,其中一个最大的特征就是SQL的参数或变量可以和宿主语言的变量通用。所说的传统意义,就是指在C语言等环境下的,
这是我的一点理解