精华内容
下载资源
问答
  • 通常我们采用各种数据库产品来实现对数据的存储、检索等功能,例如,Oracle,SQL Server, MySQL 等等。这些产品除提供基本的查询,删除,添加等功能外,也提供了很多高级特性,如触发器,存储过程,数据备份恢复,...
  • 数据库编程和嵌入式SQL Abstract 主语言 预编译 exec C下时在SQL语句前加exec sql标识. Java使用#sql{}; SQL和主语言的通信 Abstract 传递SQL语句的执行状态信息,使用SQL通信区 向SQL Server提供参数 通过主...

    数据库编程和嵌入式SQL

    Abstract

    • 主语言
    • 预编译

    exec

    • C下时在SQL语句前加exec sql标识.
    • Java使用#sql{};

    SQL和主语言的通信

    Abstract

    1. 传递SQL语句的执行状态信息,使用SQL通信区
    2. 向SQL Server提供参数 通过主变量实现.
    3. 将查询结果回传 使用主变量和游标

    主变量

    SQL中使用的主语言的变量进行查询更新等操作使用的变量.

    • 输入主变量
    • 输出主变量

    指示变量:int,一个主变量可以附带一个指示变量,用于指示主变量的值或状态.比如是否为空,是否截断等.

    主变量和指示变量在SQL语句中说明

    范例:

    BEGIN DECLARE SECTION
    -- VIRABLE...
    -- ...
    END DECLARE SECTION
    

    主变量可以出现在任何一个使用表达式的地方,前面加:作区别.

    指示变量也要加冒号,并且紧跟在主变量之后.

    游标

    系统开设的缓冲区,存放执行结果.SQL语句会产生多条记录,而主变量只能储存一条.

    每个游标区都有名字,可以通过游标获取记录.

    SQL通信区

    SQLCA是一个数据结构,储存1.系统工作状态2.描述运行环境

    应用程序从SQL通信区取出信息,决定执行语句.

    SQLCA定义

    EXEC SQL INCLUDE SQLCA

    struct SQLCA
    {
    	SQLCODE;//存放每次执行之后返回代码的变量,0=success,100=no rows,-1=failed
    	//...
    }
    

    建立/关闭连接

    EXEC SQL CONNECT TO <SERVER><CONNECTION-NAME><USERNAME>

    程序运行过程中可以修改当前连接

    只有一个连接时可以不指定.

    EXEC SQL DISCONNECT <CONNECTION-NAME>

    关闭.

    Simple Instance

    依次检查某个系的学生记录,交互式更新 某些学生年龄。

    EXEC SQL BEGIN DECLARE SECTION; /*主变量说明开始*/ 
    char Deptname[20]; 
    char Hsno[9]; 
    char Hsname[20];
    char Hssex[2]; 
    int HSage;
    int NEWAGE; 
    EXEC SQL END DECLARE SECTION; /*主变量说明结束*/ 
    
    long SQLCODE;
    EXEC SQL INCLUDE SQLCA; /*定义SQL通信区*/  
    
    
    
    int main() /*C语言主程序开始*/
    {
        int count = 0;
        char yn; /*变量yn代表yes或no*/
        printf("Please choose the department name(CS/MA/IS): ");
        scanf("%s",deptname); /*为主变量deptname赋值*/
        EXEC SQL CONNECT TO TEST@localhost:54321 USER "SYSTEM"/"MANAGER"; /*连接数据库TEST*/
        EXEC SQL DECLARE SX CURSOR FOR /*定义游标SX*/ 
        SELECT Sno,Sname,Ssex,Sage /*SX对应的语句*/ 
        FROM Student WHERE SDept = :deptname; EXEC SQL OPEN SX; /*打开游标SX,指向查询结果的第一行*/ 
        for ( ; ; ) /*用循环结构逐条处理结果集中的记录*/ 
        {
            EXEC SQL FETCH SX INTO :HSno,:Hsname,:HSsex,:HSage; /*推进游标,将当前数据放入主变量*/ 
            if (SQLCA.SQLCODE!= 0) /*SQLCODE != 0,表示操作不成功*/ 
                break; /*利用SQLCA中的状态信息决定何时退出循环*/ 
            if(count++ == 0) /*如果是第一行的话,先打出行头*/
                printf("\n%-10s %-20s %-10s %-10s\n", "Sno","Sname","Ssex", "Sage");
            printf("%-10s %-20s %-10s %-10d\n“, HSno,Hsname,Hssex,HSage); /*打印查询结果*/
            printf("UPDATE AGE(y/n)?"); /*询问用户是否要更新该学生的年龄*/
            do
            	{scanf("%c",&yn);} 
            while(yn != 'N' && yn != 'n' && yn != 'Y' && yn != 'y'); 
            if (yn == 'y' || yn == 'Y') /*如果选择更新操作*/ 
            { 
                printf("INPUT NEW AGE:"); scanf("%d",&NEWAGE); /*用户输入新年龄到主变量中*/
                EXEC SQL UPDATE Student /*嵌入式SQL更新语句*/ 
                SET Sage = :NEWAGE WHERE CURRENT OF SX; 
            } /*对当前游标指向的学生年龄进行更新*/
          } 
          EXEC SQL CLOSE SX; /*关闭游标SX,不再和查询结果对应*/ 
          EXEC SQL COMMIT WORK; /*提交更新*/ 
          EXEC SQL DISCONNECT TEST; /*断开数据库连接*/ 
     } 
    

    游标的使用

    不使用游标的:

    • 说明语句
    • 数据定义
    • 数据控制
    • 查询结果为单记录的
    • CURRENT的增删改

    只使用主变量,使用INTO指定.

    单记录的SELECT

    E.g.

    EXEC SQL SELECT Sno,Sname,Ssex,Sage,Sdept
    	INTO:Hsno,:Hname,:Hsex,:Hage,:Hdept
    	FROM Student
    	WHERE Sno=:givensno;
    

    如果不是单条记录,则出错并在SQLCA中返回错误信息

    指示变量的使用:

    EXEC SQL SELECT Sno,Cno,Grade
    	INTO :Hsno,:Hcno,:Hgrade:Gradeid
    	/*指示变量Gradeid*/
    	FROM SC
    	WHERE Sno=:givensno AND Cno=:givencno;
    

    指示变量的作用:如果Gradeid < 0,不论Hgrade为何值,均认为该学生成绩为空值。防止错误信息扩散

    非CURRENT的增删改

    UPDATE中的SETWHERE可以使用主变量,SET可以使用指示变量.

    E.g.

    EXEC SQL UPDATE SC
    	SET Grade=:newgrade
    	/*修改的成绩已赋给主变量:newgrade*/
    	WHERE Sno=:givensno;
    	/*学号赋给主变量:givensno*/
    

    E.g.2

    gradeid=-1/*gradeid为指示变量,赋为负值*/
    EXEC SQL INSERT
    	INTO SC(Sno,Cno,Grade)
    	VALUES(:stdno,:couno,:gr :gradeid)/*:stdno,:couno,:gr为主变量*/
    

    由于该学生刚选修课程,成绩应为空,所以要把指示变量赋为负值(负值表示空或出错)


    使用游标的:

    • 查询结果为多条语句的
    • CURRENT的增删

    多条语句结果的查询

    声明游标

    EXEC SQL DECLARE <CURSORNAME> CURSOR FOR <SELECT...>

    此时并不执行select语句

    打开游标

    EXEC SQL OPEN <CURSORNAME>

    执行预定义的SELECT 语句,查询结果取到缓冲区中.此时游标开始活动,指向第一条记录.

    推进指针(TO NEXT)

    EXEC SQL FETCH <CURSORNAME> INTO :<MAINVAR>[:<STATUSVAR>],....

    FETCH用于推进执行下一条并用于更新主变量.

    循环使用FETCH逐个取出

    游标关闭

    EXEC SQL CLOSE <NAME>

    关闭游标对查询结果集的联系.可以重新打开和(更)新的结果联系.

    CURRENT UPDATE/DELETE

    修改SELECT语句的结果的某几条结果.

    WHERE CURRENT OF <CURSORNAME>

    展开全文
  • 在此基础上,详细讨论为该平台开发的数据库(DB)引擎组件的框架和结构组成,描述该组件实现SQL子集和数据表达方式以及逻辑算法的设计思路;提出该组件今后的改进设想。 关键词:数据库引擎 Java 嵌入式系统引言...
  • 嵌入式SQL是将SQL语言嵌入程序设计语言中,被嵌入的程序设计语言,如C++,C,JAVA等称为宿主语言,简称主语言 过程如下 1:含嵌入式SQL语句的主语言程序。 2:关系数据库管理系统预处理程序转换嵌入式SQL语句为函数调用...

    SQL编程技术可以有效的克服SQL语言实现复杂应用方面的不足,提高应用系统和数据管理系统间的互操作性。

    SQL的特点之一是在交互式和嵌入式二种不同的使用方式下, SQL的语法结构基本上是一致的。

    嵌入式SQL的处理过程

    嵌入式SQL是将SQL语言嵌入程序设计语言中,被嵌入的程序设计语言,如C++,C,JAVA等称为宿主语言,简称主语言
    过程如下
    1:含嵌入式SQL语句的主语言程序。
    2:关系数据库管理系统预处理程序转换嵌入式SQL语句为函数调用。
    3:转换后的主语言程序。
    4:主语言编译程序编译处理。
    5:目标语言程序。

    在嵌入式SQL中,为了能够快速区分SQL语句与主语句,所有SQL语句必须加前缀。当主语言为c语言时,语法结构为:
    exec sql<SQL语句>;
    如果主语言为JAVA,则嵌入式SQL称为sqlj,语法结构为:
    #SQL{<SQL语句>};

    展开全文
  • 它是由Java实现的,开源的。包含了Java library 和 native executable (GCJ). JDBC 以及部分 ODBC APIs . 有嵌入式和 client/server 两种模式,可以基于磁盘操作或者内存操作,有一个web的控制台,并且支持集群。...
     marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog336280.html" frameborder="0" width="336" scrolling="no" height="280">

    Hypersonic SQL 的作者又写了一个新的数据库引擎 H2. 它是由Java实现的,开源的。包含了Java library 和 native executable (GCJ). JDBC 以及部分 ODBC APIs . 有嵌入式和 client/server 两种模式,可以基于磁盘操作或者内存操作,有一个web的控制台,并且支持集群。
     http://www.h2database.com

    现在Java的开源数据库就差不多有四个了:

    Hypersonic SQL

    H2

    Apache Derby

    Sun OS Database Engine

    这四个主流的引擎里面,Hypersonic SQL应该最为成熟和健壮,H2目前还不支持GPL的Lisence。Derby是Apache Genomino默认支持的数据库,Sun OS DB是Netbeans默认支持的数据库。如何选择,还是那句老话:根据具体项目需求,灵活选择。




    展开全文
  • LMini是Loonframework分支项目之一,它是一个仅有55KB的纯Java嵌入式文本数据库,不支持SQL语句,完全以面向对象方式进行数据操作,在Loonframework主包中主要负责实现缓存数据的硬盘持久化功能。但作为项目分支,...

    LMini是Loonframework分支项目之一,它是一个仅有55KB的纯Java嵌入式文本数据库,不支持SQL语句,完全以面向对象方式进行数据操作,在Loonframework主包中主要负责实现缓存数据的硬盘持久化功能。但作为项目分支,LMini并非必须与Loonframework主包集成,也允许作为单独的微型数据库存在。

    LMini的开发目的在于提供一种简单快捷的本地数据持久化方式,如游戏记录、文件缓存、简单的增、删、改、查操作都可以通过LMini得以实现,它的优势在于完全脱离java.sql包依赖,比db4o、sqllite体积更小,比Properties所提供的功能等多。

    LMini通过MDB接口进行数据库操作,而根据MDB接口所获得的不同实例,操作模式又可分为如下三种,即:内存模式、单一文件模式及多文件模式。

    内存模式:

    实例化此模式后,将直接在内存开辟一块区域进行数据库模拟操作,当程序关闭时内存数据库也随之消失,不能持久化保存,调用方法为Engine.getMEMDB。

    单一文件模式:

    实例化此模式后,数据库将以文件形式存在,程序会自动产生唯一的物理文件于硬盘之上,所有操作也将基于此物理文件进行,只要此文件不被删除数据将永久存在,调用方法为Engine.getMDBOnly。

    多文件模式:

    实例化此模式后,数据库将以文件夹形式存在,程序会自动根据创建的表格产生多个物理文件于此文件夹中,所有操作将基于此文件夹进行,只要此文件夹及其中文件不被破坏,数据将永久存在,调用方法为Engine.getMDBMany。

    以上三种模式皆为接口实现,操作方法完全一致,仅在保存方式上有所分别。

    基本操作方式:

    1、数据库的创建与打开:

    当我们对MDB接口进行实例化,并调用begin方法后,LMini会自动监测指定位置是否已有文本数据库存在,有则加载其文件内容,没有将自动创建一个空数据库于指定位置。

    LMini以一个begin方法打开数据库连接,以end方法关闭连接,具体代码如下:

    MDB mdb = Engine.getMDBOnly("c://test.db");

    mdb.begin();

    mdb.end();

    2、密码保护功能:

    除内存模式之外,LMini提供了简单的密码保护功能,以防止数据库文件被他人盗用,只要在begin创建数据库时设定即可,密码错误时再次打开此文件将提示异常,具体代码如下:

    MDB mdb = Engine.getMDBOnly("test.db");

    mdb.openTable("test",TypeBase.STRING);

    //设定密码

    mdb.begin("wt98ab");

    mdb.end();

    3、增、删、改、查:

    LMini以openTable方法打开或创建一个指定表格,但区别于其它数据库,Lmini每个表格仅允许保存一种数据类型,以简化LMini文件处理过程;目前其支持的类型为Long,Integer,String,Byte[],Object五种,我们可以通过Lmini提供的TypeBase类注入需要的类型。不填写情况Lmini将默认表格存储类型为Object,也就是所有经过序列化的对象都可以存储于本地硬盘之上。

    LMini针对CRUD提供了相对应的insert、select、update、delete方法以供调用,只要注入相关对象即可完成操作,具体代码如下:

    MDB mdb = Engine.getMDBOnly("test.db");

    mdb.openTable("test",TypeBase.STRING);

    //设定密码

    mdb.begin("wt98ab");

    //插入数据

    mdb.insert("久保","砍砍砍");

    mdb.insert("尾田", "我要成为海军");

    mdb.insert("岸本", "都死光了");

    //删除数据

    mdb.delete("岸本");

    //变更数据

    mdb.update("尾田", "我要成为海贼王");

    //查询

    System.out.println(mdb.select("尾田"));

    mdb.end();

    4、表格中数据的遍历:

    LMini提供了getTableKey方法以获得当前表格下所有字段名,提供了getTableList方法以获得当前表格下所有字段及数据,具体代码如下:

    MDB mdb = Engine.getMDBOnly("test.db");

    mdb.openTable("test",TypeBase.STRING);

    //设定密码

    mdb.begin("wt98ab");

    //插入数据

    mdb.insert("久保","砍砍砍");

    mdb.insert("尾田", "我要成为海军");

    mdb.insert("岸本", "都死光了");

    //删除数据

    mdb.delete("岸本");

    //变更数据

    mdb.update("尾田", "我要成为海贼王");

    //查询

    System.out.println("尾田说:"+mdb.select("尾田"));

    for(Iterator it=mdb.getTableKey().iterator();it.hasNext();){

    String name=(String)it.next();

    System.out.println("字段名:"+name);

    System.out.println("数据: "+(String)mdb.getTableList().get(name));

    }

    mdb.end();

    程序示例:

    本例提供了一个Lmini操作通讯录的简单操作示例,利用开源metawidget项目所提供的addressbook-swing加以改造而成,仅替换其直接硬编码在Table中数据为真实操作Lmini数据库并修正部分英文窗体为中文,metawidget项目所有权利均与本人无关,本示例仅为借用其界面,特此声明。(PS:源码在jar中,另外使用metawidget的UI还挺费空间,要用5MB的支持库|||……)

    2009_03_21.png

    LMini的操作方式非常简便,笔者昨天预告的TLOH项目的游戏存档器也将采用LMini加以实现,目前LMini还在不断完善中,希望各位看客能给予支持及指正,另外现在发的LMini比Loonframework主包中的版本差一次更新,具体差别到发布Loonframework-0.2.0时就能看到了。

    展开全文
  • LMini是Loonframework分支项目之一,它是一个仅有55KB的纯Java嵌入式文本数据库,不支持SQL语句,完全以面向对象方式 进行数据操作,在Loonframework主包中主要负责实现缓存数据的硬盘持久化功能。但作...
  • 本文介绍两种嵌入式数据库产品:Berkeley DB和SQLite,并着重讨论它们与Java之间的接口。通常我们采用各种数据库产品来实现对数据的存储、检索等功能,例如,Oracle,SQL Server,MySQL等等。这些产品除提供基本的...
  • 摘 要: 本系统应用JSP技术,运用WindowsXP平台,使用JAVA编程语言和SQL Server 2005数据库,采用B/S模式开发设计完成。系统分为前台和后台管理,前台主要实现客户的浏览信息、预定客房等功能,后台是管理员管理...
  • 摘 要本文根据《数据库应用系统设计》课程要求而做。选择图书馆管理系统设计与开发是因为觉得图书馆管理系统对我们的帮助很...关键词:图书馆数据库,图书馆管理系统,嵌入式SQL第1章 概述1.1 项目背景随着科技的发...
  • 商业也免费的嵌入式数据库sqlite源码,实现sql92标准,支持.net和java开发,几百k的大小,特别适合在演示系统和小型系统中使用

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 206
精华内容 82
关键字:

java实现sql嵌入式

java 订阅