D语言中国主页  D语言编辑器SciTE4D   DWin库 D语言官方网站
D语言编译器1.x最新版 OpenSource   Tango   webnews  Wiki

查看完整版本: D语言操作Sqlite数据库简单教程

yidabu 2008-4-26 16:43

D语言操作Sqlite数据库简单教程

D语言操作Sqlite数据库简单教程


一  D语言数据库封装-Sqlite的安装设置

    1.1 首先下载 DWin 库 0.37 (在写作本文时还未正式发布)
    [url]http://dwin.d-programming-language-china.org/[/url]
   
    1.2 把 ...\dwin\lib 路径加入到dmd\bin\sc.ini 的LIB搜索路径,注意要使用你的实际路径。
   
    1.3 下载最好的D语言编辑器 SciTE4D (当然可以用其他自己喜欢的编辑器)
    [url]http://scite4d.d-programming-language-china.org/[/url]

    1.4 中文处理要注意的是sqlite默认以utf-8编码存储.
   
    1.5 另外要注意sqlite仅支持文件锁,换句话说,它对并发的处理并不好,不推荐在网络环境使用,适合单机环境.
   
   
二  创建数据库/打开数据库

Sqlite使用文件作为数据库,你可以指定数据库文件的位置。[code]    import dwin.database.sqlite.All;   
    auto con = new Connection(r"D:\test.db");[/code]使用sqlite的Connection可以创建一个数据库文件,上面我指明了路径。当数据库文件不存在的时候,它会自动创建。如果已经存在这个文件,则打开这个文件。con为数据库连接对象。   


三  操作数据库的基本对象

3.1 数据库连接对象

象前面的con就是一个数据库的连接对象,它可以有以下操作:

    * commit()--事务提交
    * rollback()--事务回滚
    * close()--关闭一个数据库连接
    * createCursor()--创建一个游标

3.2 游标对象

所有sql语句的执行都要在游标对象下进行。[code]auto cur = con.createCursor() [/code]这样定义了一个游标。游标对象有以下的操作:

    * execute()--执行sql语句
    * vaExecute--执行多条sql语句
    * close()--关闭游标
    * fetchOne()--从结果中取一条记录
    * fetchRows()--从结果中取多条记录
    * fetchAll()--从结果中取出多条记录
    ...

关于对象的方法可以去 查看D语言库DWin相应模块的源代码。不过我不是都使用过。
   
   
四、D语言操作数据库 Sqlite 使用举例

4.1 建库

前面已经有了,不再重复。

4.2 建表[code]    auto cur = con.createCursor()
    cur.execute("create table catalog (
       id INT64 primary key,
       pid INT64,
       name TEXT UNIQUE
      )");    [/code]上面语句创建了一个叫catalog的表,它有一个主键id,一个pid,和一个name,name是不可以重复的。

关于sqlite支持的数据类型,在它主页上面的文档中有描述,可以参考:Version 2 DataTypes  
[url]http://www.sqlite.org/datatypes.html[/url]

4.3 insert(插入)[code]        cur.execute("create table catalog (id INT primary key, pid INT, name TEXT);"c);   
        cur.execute("insert into catalog values (0, 0, 'name1');"c);
        cur.execute("insert into catalog (id, pid, name) values (1, 0, 'hello');"c);
        con.commit();[/code]如果你愿意,你可以一直使用cur游标对象。注意,对数据的修改必须要使用事务语句:commit()或rollback(),且对象是数据库连接对象,这里为con。

4.4 select(选择)[code]       cur.execute("select * from catalog;");
        
                static int[] ts1 = [
                        SQLiteDataType.INT,
                        SQLiteDataType.INT,
                        SQLiteDataType.TEXT];        
        
        auto datas = cur.fetchAll(ts1);
        
        foreach(data; datas)
        {
            Stdout.formatln( "id {}, pid {}, name {}",
                data[0].unpack!(int)(),
                data[1].unpack!(int)(),
                data[2].unpack!(char[])() );
        }[/code]fetchAll ()返回结果集中的全部数据,注意,游标是有状态的,它可以记录当前已经取到结果的第几个记录了,因此,一般你只可以遍历结果集一次。在上面的情况下,如果执行fetchOne()会返回null。这一点在测试时需要注意。[code]        cur.execute("select * from catalog where id = 1");
        auto data = cur.fetchOne(ts1);
        Stdout.formatln( "id {}, pid {}, name {}",
            data[0].unpack!(int)(),
            data[1].unpack!(int)(),
            data[2].unpack!(char[])() );  
            [/code]4.5 update(修改)[code]        cur.execute("update catalog set name='name2' where id = 1");
        cur.execute("select * from catalog");
        auto data = cur.fetchOne(ts1);
        Stdout.formatln( "id {}, pid {}, name {}",
            data[0].unpack!(int)(),
            data[1].unpack!(int)(),
            data[2].unpack!(char[])() );  [/code]4.6 delete(删除)[code]        cur.execute("delete from catalog where id = 1;");
        cur.execute("select * from catalog;");
        datas = cur.fetchAll(ts1);
        foreach(data; datas)
        {
            Stdout.formatln( "id {}, pid {}, name {}",
                data[0].unpack!(int)(),
                data[1].unpack!(int)(),
                data[2].unpack!(char[])() );
        }   [/code]4.7 完整示例代码
    打开D语言编辑器 SciTE4D ( [url]http://scite4d.d-programming-language-china.org/[/url] ), 新建文档,保存为test.d, 然后按Ctrl + F5 运行代码。[code]import tango.io.Stdout;
import  tango.io.FilePath;
import  dwin.database.sqlite.All;
pragma(lib, "dwin-debug.lib");

void main()
{   
        char[] path = r"D:\test.db";
        FilePath fp = FilePath(path);    // cause VM exception if exists
        if(fp.exists) fp.remove;   
            
        auto con = new Connection();
        con.open(path);
        auto cur = con.createCursor();
        scope(exit)
        {
            cur.close;
            con.close;
        }        
        cur.execute("create table catalog (id INT, pid INT, name TEXT);"c);   
        cur.execute("insert into catalog (id, pid, name) values (1, 0, 'name1');"c);
        cur.execute("insert into catalog (id, pid, name) values (0, 1, 'hello');"c);
        
        cur.execute("select * from catalog;");
                static int[] ts1 = [
                        SQLiteDataType.INT,
                        SQLiteDataType.INT,
                        SQLiteDataType.TEXT];        
        
        Stdout("fetchAll:").newline;        
        auto datas = cur.fetchAll(ts1);
        foreach(data; datas)
        {
            Stdout.formatln( "id {}, pid {}, name {}",
                data[0].unpack!(int)(),
                data[1].unpack!(int)(),
                data[2].unpack!(char[])() );
        }

        Stdout("fetchOne:").newline;        
        cur.execute("select * from catalog where id = 1;");
        auto da = cur.fetchOne(ts1);
        Stdout.formatln( "id {}, pid {}, name {}",
            da[0].unpack!(int)(),
            da[1].unpack!(int)(),
            da[2].unpack!(char[])() );   

        Stdout("update:").newline;
        cur.execute("update catalog set name='name2' where id = 1;");
        cur.execute("select * from catalog;");
        da = cur.fetchOne(ts1);
        Stdout.formatln( "id {}, pid {}, name {}",
            da[0].unpack!(int)(),
            da[1].unpack!(int)(),
            da[2].unpack!(char[])() );   
        
        Stdout("delete:").newline;
        cur.execute("delete from catalog where id = 1;");
        cur.execute("select * from catalog;");
        datas = cur.fetchAll(ts1);
        foreach(data; datas)
        {
            Stdout.formatln( "id {}, pid {}, name {}",
                data[0].unpack!(int)(),
                data[1].unpack!(int)(),
                data[2].unpack!(char[])() );
        }   

}[/code]以上是关于如何使用D语言库DWin来操作Sqlite的简单示例。   
20080426 首发 D语言论坛 [url]http://bbs.d-programming-language-china.org/[/url]

hqs7636 2008-5-12 23:13

好,了不起!f
建议将 fetch *** 改成 get***
页: [1]
查看完整版本: D语言操作Sqlite数据库简单教程