zoukankan      html  css  js  c++  java
  • FIREBIRD浅历

    firebird可以说是这个世界上最小而又支持存储过程的数据库,才3M而已,如果做小型应用,比ms sql(桌面版也有70多M),mysql(20-30M),方便的多。

    (一)数据库操作

    在开始-程序-Firebrid_2_0中执行Firebrid ISQL tool 出现
    SQL>
    输入
    SQL>CREATE DATABASE ‘e:\sams.fdb'; 回车
    提示错误,……..,郁闷,一查资料,原来是需要使用用户名和密码登录,于是在“运行”里输入(将默认的用户名和密码作为命令行参数):

    isql.exe -u sysdba -p masterkey

    进入命令行窗口。
    再输入:


    SQL>CREATE DATABASE 'e:\sams.fdb';      回车


    没有任何提示(原来FB就是这样,没有提示就表示成功),打开E盘一看多了个SAMS.FDB文件,接着再输入 :


    SQL>SHOW DATABASE;


    出现一些关于这个数据库的信息,建两个表吧,输入


    SQL>CREATE TABLE T1 (F1 INTEGER,F2 VARCHAR(20));      回车


    什么也没看到,实际上不是,输入


    SQL>SHOW TABLE;             回车


    显示出来了,有一个表T1,再建一个,录入


    SQL>CREATE TABLE T2(F1 INTEGER);          回车
    SQL>SHOW TABLE;                回车


    这一次可显示两个表存在啦,插入点东西吧,录入
    SQL>INSERT INTO T1 valueS(10,’I LIKE’);         回车
    SQL>INSERT INTO T1 valueS(10,’HOW ARE YOU’);       回车
    SQL>INSERT INTO T1 valueS(11,’OK’);          回车


    看看里面装了点什么,录入 

    SQL>SELECT * FROM T1;             回车


    看到了有三条记录,完成前面的操作后,不想要I LIKE的那条记录了,怎么办,录入


    SQL>DELETE T1 WHERE F2=’I LIKE’;      回车


    再查一下看以看到确实少了这一知记录.不想要那个空表T2,就做掉吧,不过最好提交一下,这样的话把当前的表也能干掉,录入


    SQL>COMMIT;  回车


    提交后,下面开始做掉T2,录入


    SQL>DROP TABLE T2;  回车


    再查录入的这个表还有没,录入


    SQL>SHOW TABLE;  回车


    这次只查到一个,没有了,不完了,退出来,录入


    SQL>QUIT; 回车


    回到了WINDOWS窗口,下次再进入对已存的数据库就连接就OK了,见下:


    SQL>CONNECT LOCALHOST:e:\sams.fdb;     回车

    (二)在程序里(.net)里操纵:

    Firebird .NET Data Provider是一个用来操作Firebird数据库的数据访问组件,目前的版本是1.7。该组件提供了访问和操作Firebird数据库的各种函数,其使用非常简单,使用符合ADO.NET的规范。因此在使用上我们不会有太大的陌生感。

    在安装Firebird .NET Data Provider后,其提供了一个SDK文档,通过它,我们可以快速的了解并使用该组件。

    在编写一个数据库应用程序的时候,第一步肯定是建立一个和要操作数据库的连接,一般我们都是使用连接字符串,而通常情况下,这个连接字符串是比较复杂的,不是十分容易记忆。Firebird .NET Data Provider提供了一个名为FbConnectionStringBuilder的类,通过它我们可以很方便的构造一个连接字符串。

    FirebirdSql.Data.Firebird.FbConnectionStringBuilder cs=new FirebirdSql.Data.Firebird.FbConnectionStringBuilder();
    cs.DataSource="localhost";
    cs.Database=@"d:\firebird\firsttest.gdb";
    cs.UserID="sysdba";
    cs.Password="masterkey";
    cs.Dialect=1;

    FirebirdSql.Data.Firebird.FbConnection cn=new FirebirdSql.Data.Firebird.FbConnection();
    cn.ConnectionString=cs.ToString();

    其后操作数据库的方法就和使用ADO.NET操作SQL Server或是Access数据库没什么区别了(除了使用的类名称不同外)。

    下面是填充数据集的代码
       cn.Open();
       string strSQL="select * from T_1";
       FirebirdSql.Data.Firebird.FbDataAdapter ad=new FirebirdSql.Data.Firebird.FbDataAdapter(strSQL,cn);
       System.Data.DataSet ds=new System.Data.DataSet();
       ad.Fill(ds);
       cn.Close();

    下面是向已连接的数据库中插入记录
       cn.Open();
       string strSQL="insert into T_1 values("1,'2005-7-4','testvalue')";
       FirebirdSql.Data.Firebird.FbCommand cm=new FirebirdSql.Data.Firebird.FbCommand();
       cm.Connection=cn;
       cm.CommandType=System.Data.CommandType.Text;
       cm.CommandText=strSQL;
       cm.ExecuteNonQuery();
       cn.Close();

    使用Firebird .NET Data Provider编写调用Firebird数据库的存储过程的方法如下:
      cn.Open();
      FirebirdSql.Data.Firebird.FbCommand cm=new FirebirdSql.Data.Firebird.FbCommand();
      cm.Connection=cn;
      cm.CommandType=System.Data.CommandType.StoredProcedure;
      cm.CommandText="SP_1_ADD";
      cm.Parameters.Add("@F1",FirebirdSql.Data.Firebird.FbDbType.Integer).value=1;
      cm.Parameters.Add("@F2",FirebirdSql.Data.Firebird.FbDbType.Date).value="2005-1-1";
      cm.Parameters.Add("@F3",FirebirdSql.Data.Firebird.FbDbType.VarChar,20).value="SPTest";
      cm.ExecuteNonQuery();
      cn.Close();
    另外,参数的添加还可以使用如下的方法
      FirebirdSql.Data.Firebird.FbParameter fp=new FirebirdSql.Data.Firebird.FbParameter("@F1",FirebirdSql.Data.Firebird.FbDbType.Integer);
      fp.value=1;
      cm.Parameters.Add(fp);
    但在使用如下代码 
      FirebirdSql.Data.Firebird.FbParameter fp1=new FirebirdSql.Data.Firebird.FbParameter();
      fp1.ParameterName="@F1";
      fp1.DbType=(System.Data.DbType)FirebirdSql.Data.Firebird.FbDbType.Integer;
      fp1.value=1;
      cm.Parameters.Add(fp1); 
    添加参数,在编译的时候没任何错误但在运行时会出现"Incorrect Guid value"的错误。这样的代码在调用SQL Server数据库中的存储过程是没有任何问题的,不知这是Firebird .NET Data Provider的一个BUG,还是另有原因呢? 

    (三)一些区别和注意事项


    1.自定义函数问题.Access to UDF library "rfunc.dll" is denied by server administrator
    花了很长时间,不明白为何,将rfunc.dll拷到udf目录,bin目录,windows\system32目录都不能解决问题,google一下,网上有同样的问题,但没有解决方案,结果我重装了一下firebird就解决了.

    2.存储过程中变量的定义
    ms sql存储过程中无论在哪都可以定义新的变量,但在firebird中,只能在as 与begin之间进行定义.firebird的变量不能用@符号,我将@全部变成a就好了.

    3.存储过程中变量的使用
    select @i=count(*) from table1 //ms sql
    select count(*) from table1 into :i//firebird引用变量使用冒号

    4.嵌入式sql,
    firebird支持select * from table exists (select ...) 或 select * from table in (select ...)
    但不支持select * from (select * from ...) a,
    我是将这类改写成视图解决的

    5.case语句 
    mssql 可使用field= case (),但firebbird仅支持case () as field,
    6.mssql getdate()变成CURRENT_DATE+CURRENT_TIME
    select * from snartleave where   dt_starttime<CURRENT_DATE+CURRENT_TIME

    select * from snartleave where   dt_starttime<CURRENT_DATE||' ' ||CURRENT_TIME

    7.返回数据集的存储过程写法(firebird写法有点麻烦)
    CREATE PROCEDURE SPVARTST2 (
        VAR_IPTARTNO CHAR(6))
    RETURNS (
        VAR_ARTNAME CHAR(10))
    AS
    begin
    for select v_name1 from snart where v_artNo=:var_iptartno into :var_artname do
    suspend;
    end

    8.自动增长字段的使用(autoincrement)
    firebird有个发生器(generator)的东东,在发生器里记录值的增长,
    再用触发器实现
    begin
      if (new.i_seqno is null) then
      begin
        NEW.i_seqno = GEN_ID(GEN_T_DB_ARTSEQNO_ID,1);
      end
    end
    //GEN_T_DB_ARTSEQNO_ID就是创建的发生器,看到没有,也就是说不同的表不同的字段可以共用一个发生器,gen_id相当于identity,看起来比mssql复杂,其实也很简单。

    9.发生器重置 mssql里自动增加的字段要重置好像很麻烦,较难控制,
    firebird可以这样(存储过程中)
    agenerator=Gen_ID(GEN_T_DB_ARTSEQNO_ID,Gen_ID(GEN_T_DB_ARTSEQNO_ID,0)*-1+1);
    //agenerator是一个整形变量,好像一定要装gen_id的值符给一个变量才行,不知道有没有更好的办法,不用定义一个多余的变量
    可参考如下网址:http://www.fingerbird.de/generatorguide_body.htm


    10 通过一个表更改另一个表的数据
    mssql:update table1 set cname=b.cname from table1 a inner join table2 as b where a.id=b.id
    firebird:update table1 a set cname=(select cname from table 2 b where a.id=b.id)  

  • 相关阅读:
    Swift中的单例的实现方式
    关于iOS自定义UITabBar的几种方法
    iOS数据持久化(三)
    iOS数据持久化(二)SQLite
    iOS数据持久化(一)
    iOS自定义NavigationBar
    UINavigationController基本使用
    UILabel 整理
    [DEMO]AR 1
    [分享]自主行驶小车idea
  • 原文地址:https://www.cnblogs.com/top5/p/1782749.html
Copyright © 2011-2022 走看看