• UniDAC Delphi 控件 转


    Unidac 说明与示范 
    其实delphi优秀的数据集组件真不少,除了上诉的数据集组件,还有ZEOSDB、SQL Direct、UniDAC等,要是专业的数据集组件,更是百花盛开,如FIBPLUS、SDAC、ODAC、DOA等等,商业和开源不尽其中!这里只讨论UniDAC和ADO的一些比较。
    Delphi能发展到现在,和一些著名的第三方控件厂商大力支持分不开,这其中包括Devart公司(Corelab)公司。Corelab公司做数据集驱动非常出名,就拿ODAC、SDAC和DBX驱动来说,已经远胜其他同行的第三方控件公司。UniDAC是Devart公司最近的力作,将ODAC、 SDAC、IBDAC等驱动综合集成在一块。
    UniDAC无论是做三层还是两层,都远胜于ADO。下面说一些UniDAC的优点: 1、非常完美的支持多数据库的数据集套件。这一点,ADO也支持多数据库,但ADO除了MSSQL驱动之外,其他驱动支持的非常差。就拿 Oracle驱动来说,在调用oracle复杂的存储过程参数,总是或多或少有些问题;MSSQL企业管理器如果用了第三方驱动(比如是oracle),在导入导出数据也尚存在问题!更别提不是主流的IB数据库驱动。UniDAC支持Oracle、MSSQL、MYSQL、IB/FB、 PostgreSQL。
    2、对三层特性支持非常好!也许你也会问,三层也是访问DB,ADO也支持啊?!但三层最好方式是无状态方式,在高并发的处理中,一般不允许本地有数据集缓存。ADO没有单向数据集特性,所有的数据下载到本地,不停的开辟内存或释放大内存,对三层的内存是一个极大考验。TUniQuery有一个 UniDirectional属性,支持单向速度,这点和DBX的想法不谋而合。况且,单向数据集特性速度非常快,在三层中,配合 TDataSetProvider,中间件将其Data包发送到客户端,速度无可比拟。ADO也有流或XML格式包,但无论是XML或流格式,数据包远比 CDS的包大几倍。CDS封包技术很好!
    3、一些非常有用的属性或方法。常言道,细微之处见体贴。UniDAC有一些过人的方法或属性。比如,刷新单条记录(RefreshRecord)、多表更新的属性(UpdatingTable)、宏替换参数(Macros)、集成删除/新增/修改/刷新/锁定SQL 语句、FetchRows,更让人称道的是引入了UpdateSQL组件。
    在处理MSSQL新增后的自增字段,和ADO一样可以直接自动返回自增字段值,这一点,BDE不能做到、DBX不能做到、ZEOSDB不能做到。更令人称奇是,配合TUniUpdateSQL,还能自动返回自增字段值。
    TUniUpdateSQL是一个好东西,ADO缺少TUdateSQL运作模式,默认的更新机制是主键字段+已变化的字段做where条件。在一般情况下是没问题,但如果这个表没有主键或where条件中的字段小数位很长导致误餐,就会产生更新找不到记录。TUdateSQL可以保证这点,运作灵活又透明。
    4、对oracle支持非常好。别的不说,光是一个oracle连接的Direct Mode,不用安装oracle官方肥硕客户端(网上也有精10M左右简版的客户端),只要客户机支持TCP/IP协议即可。如果用ADO连接 Oracle,必须保证先安装oracle客户端,还要配置连接文件,一堆繁琐事情。UniDAC对oracle支持的非常完美,和专业化的DOA差不多!
    当然,最大的缺点是,非常贵,最贵的档次,差不多可以买半套的D2009!
    unit Unit1; 
    interface  uses
       Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,    Dialogs, StdCtrls, Grids, DBGrids, DB, DBAccess, Uni, MemDS, UniProvider,    InterBaseUniProvider;  type
       TForm1 class(TForm)
         UniConnTest: TUniConnection;//用于数据库的连接
         InterBaseUniProTest: TInterBaseUniProvider;//ib/FB的数据提供      UniQryTest: TUniQuery;
         UniDataSrTest: TUniDataSource;      DBGrid1: TDBGrid;      Button1: TButton;      Button2: TButton;
        procedure Button1Click(Sender: TObject);     procedure Button2Click(Sender: TObject);   private
        Private declarations   public
        Public declarations   end;  var
       Form1: TForm1; 
    implementation 
    {$R *.dfm} 
    procedure TForm1.Button1Click(Sender: TObject); begin
      with UniConnTest do   begin
         ProviderName := 'interbase';//这里确定为interbase 但是可以支持firebird      Password := 'masterkey';//数据库密码      Username := 'sysdba';//数据库密码      Server := '';
         Database := 'TD_HOUSE.FDB';//数据库文件的位置,这里在当前目录      SpecificOptions.Clear;






         SpecificOptions.Add('InterBase.ClientLibrary=fbembed.dll');//设置embeddll驱动位置
         SpecificOptions.Add('InterBase.CharLength=0');//设置为0让,unidac自动读取fb设置
         SpecificOptions.Add('SQLDialet=3');//设置为3
         SpecificOptions.Add('USEUnicode=true');//迟滞unicode 有人说有问题 我没有发现     try
           Connect;
           ShowMessage('OK');     except
           ShowMessage('eer');     end;   end; end; 
    procedure TForm1.Button2Click(Sender: TObject); begin
       UniQryTest.Close;
       UniQryTest.SQL.Text := 'select from TB_SYS_LOG'; // UniQryTest.FetchingAll;    UniQryTest.DisableControls;    UniQryTest.Open;
       UniQryTest.EnableControls; end;  end. 



    常言道,细微之处见体贴。UniDAC有一些过人的方法或属性。
    比如,刷新单条记录(RefreshRecord)、多表更新的属性(UpdatingTable)、宏替换参数(Macros)、
    集成删除/新增/修改/刷新/锁定SQL语句、FetchRows,更让人称道的是引入了UpdateSQL组件。

    TUniTable、TUniQuery和TUniStoredProc是用来检索和编辑数据的UniDAC控件.

    ***************************TUniQuery******************************************************

    UniDirectional属性

    ADO没有单向数据集特性,所有的数据下载到本地,不停的开辟内存或释放大内存,对三层的内存是一个极大考验。TUniQuery有一个 UniDirectional属性,支持单向速度,这点和DBX的想法不谋而合。况且,单向数据集特性速度非常快,在三层中,配合 TDataSetProvider,中间件将其Data包发送到客户端,速度无可比拟。ADO也有流或XML格式包,但无论是XML或流格式,数据包远比 CDS的包大几倍。CDS封包技术很好!


    FetchRows可以设定一次获取记录的行数

    uniquery 和 unitable 的 SpecificOptions 属性,需要设置 FetchAll=False才能使 FetchRows 的设置生效,而默认情况下, oracle 是设置Oracle.FetchAll=False;
    而对去 sql server 和 mysql 等,却是设置的 XXX.FetchAll=True 
    UniQuery.SpecificOptions.Values['FetchAll'] := BoolToStr(cbFetchAll.Checked, True);


    UniDirectional属性

    ADO没有单向数据集特性,所有的数据下载到本地,不停的开辟内存或释放大内存,对三层的内存是一个极大考验。TUniQuery有一个 UniDirectional属性,支持单向速度,这点和DBX的想法不谋而合。况且,单向数据集特性速度非常快,在三层中,配合 TDataSetProvider,中间件将其Data包发送到客户端,速度无可比拟。ADO也有流或XML格式包,但无论是XML或流格式,数据包远比 CDS的包大几倍。CDS封包技术很好!


    UniDAC的单条记录刷新
    1、设置 SQLRefresh.TEXT的刷新SQL,一般要具体到单条记录。比如:SQLRefresh.Text:='SELECT * FROM TName WHERE ID = :ID'(其中ID是表TName的主键,以确保返回只有一条记录)
    2、设置 TRefreshOptions为 [roAfterInsert,roAfterUpdate],即为新增后刷新,修改后刷新。
    3、调用 UniQuery1.RefreshRecord
    如果不做以上设置,仅执行UniQuery1.RefreshRecord 是一点反映也没有的


    UpdatingTable
    属性 UpdatingTable 服务显示表将被更新(如果在查询中有许多表)。如果它的值为空,正在使用的表就会显示SQL操作的结果。 为了更好地对查询结果进行操作,建议应总是设置属性UpdatingTable

    cachedupdates缓存更新
    UniQuery默认状态为行提交,使用前根据需要设置readonly或cachedupdates属性


    Filter过滤
    UniQuery.Filter默认大小写区分,请注意设置FilterOptions属性([foCaseInsensitive]),TVirtualtable也存在相同情况


    在UniQuery的SQL定义参数
    我们经常会在UniQuery的SQL定义一些参数,在传参时,需要特别注意,例如:
    QExec.Close;
    QExec.SQL.Text:= ‘select * from YHB where sYHBH=_YHBH’;
    在传参时有两种写法
    1)最稳妥的写法
    QExec. ParamByName(‘P_YHBH’).DataType:= ftString;
    QExec. ParamByName(‘P_YHBH’).ParamType:= ptInPut;
    QExec. ParamByName(‘P_YHBH’).AsString:= ‘张三’;(此处可将AsString换成Value)
    2)下面这个写法我做了简单测试,也是可以的,但对复杂的SQL传参是否正确,未知
    QExec. ParamByName(‘P_YHBH’).AsString:= ‘张三’;(在不对参数的数据类型和传入传出类型进行指定的情况下,绝对不能使用Value)


    UniQuery.SetReadOnly属性
    1) 我们经常会用到多表关联,且需要在前台修改数据。举个例子:a表和b表,在前台两个表字段都需要修改,则需要将SetReadOnly设置成false
    2)特别注意:若将一个UniQuery.SetReadOnly设置成true,而这个表有一个自增长ID,那么你在提交数据时会出错,跟踪SQL会发现,ID被前台前行传了一个null值


    UniQuery. RefreshRecord

    可以刷新当前选择的数据


    数据提交

    数据提交的顺序,一定要注意:

       with MyQuery do
       begin
          Session.StartTransaction;
          try
             ... {Modify data}
             ApplyUpdates; {try to write the updates to the database}
             Session.Commit; {on success, commit the changes}
          except
             RestoreUpdates; {restore update result for applied records}
             Session.Rollback; {on failure, undo the changes}
             raise; {raise the exception to prevent a call to CommitUpdates!}
          end;
          CommitUpdates; {on success, clear the cache}
    end;
    对于单数据集的提交:
    MyQuery. ApplyUpdates;
    MyQuery. CommitUpdates;




    Unidac:解决“trying to modify read-only Field”问题!
    后台使用SQL语句中,经常会关联自定义函数或视图,而CDS(TClientDataSet)对字段校验比较严格,涉及到的自定义函数或视图输出的字段,都会强制改为ReadOnly为True属性。
    当后台使用UniDAC+CDS,关联视图或自定义函数,为了数据一致性,有可能需要在前台界面上修改CDS相关的自定义函数输出的字段,即便是将 该字段设置为 readonly为false,


    或将其字段的 FieldDefs属性的attributes的faReadOnly去掉,系统也会抛出一个异常:trying to modify read-only Field。
    解决问题很简单,将TUniQuery.Options.SetFieldsReadOnly为false即可。
    查一下TUniQuery.Options.SetFieldsReadOnly的帮助,这样写道:
    If True, dataset sets the ReadOnly property to True for all fields that do not belong to UpdatingTable or can not be updated. Set this option for datasets 


    that use automatic generation of the update SQL statements only.

    Macros属性

    要注意:如果要替换的值是一个字符串,那么记得在字符串两边加''号,因为Macro只是一个简单的替换功能,他不会去判断条件的类型。

    其他

    UniQuery默认情况下,有些varchar类型的字段有自动加了一个空格,请注意设置Options.TrimVarChar=true
    UniQuery在进行Insert时,若字段不能为null且前台操作未填写时,可能会报错,请设置RequiredFields=true
    UniQuery在修改数据集时,默认的方式是按关键字生成SQL语句进行数据提交。还有另外两种方式:一是设置updateSQL,一是设置KeyFields(具体请sql跟踪查看)
    UniQuery的数据排序属性是IndexFieldNames

    ********************存储过程*************************************************************************

    TUniConnection, TUniSQL, TUniQuery, TUniStoredProc均可以执行存储过程。

    TUniConnection:

    是一种最简单的执行存储过程的控件,但他有很多限制。TUniConnection不能具有SQL、存储过程名和参数,不支持输出参数也不支持存储执行的预准备。当然,如果只是运行一个既没有返回也没有输出参数设置,那TUniConnection是一个不错的选择。

    TUniSQL:TUniSQL是一个被分离出的小控件,执行SQL语句但不返回结果集。它没有数据存储,但要消耗一些内存,但比TUniQuery和TUniStoredProc的执行速度快。

    UniSQL.SQL.Text :=str
     UniSQL.Execute;
     s := 'Rows affected: ' + IntToStr(UniSQL.RowsAffected);


    TUniQuery:TUniQuery除具有TUniSQL的执行功能外,还能返回结果集。

    TUniStoredProc:TUniStoredProc是专门用来执行存储过程的一个控件,可以返回结果集、输出参数、执行准备以及通过CreateProcCall方法初始化等。

    1、 参数类型

    UniDAC支持四种参数类型:input, output, input/output, result


    ***********************************************TUniConnection************************************************************

    事务

    TUniConnection通过StartTransaction, Commit, Rollback等方法来控制本地事务,判断一个事务是否开启用InTransaction。

    1TUniConnection

    建立和控件数据连接的控件,能访问的数据库包括:Oracle, SQL Server, MySQL, InterBase, Firebird, 和PostgreSQL.

    虽然UniDAC对不同的数据库提供了统一的访问接口,但是对个别数据库还是要进行一些特殊的设置,这些设置是一个字符串列表,你可以按以下代码进行设置:

    UniConnection.SpecificOptions.Values['CharLength'] := '1';

    1、 Oracle




  • 相关阅读:
    [Git & GitHub] 利用Git Bash进行第一次提交文件
    Linux下 Unison 实现文件双向同步
    Linux SSH使用公钥私钥实现免登陆
    SSH自动断开连接的原因
    hosts.deny 和hosts.allow 配置不生效
    bind启动时提示953端口被使用
    Linux查询系统配置常用命令
    Linux 查硬件配置
    BIND rndc—使用说明
    rndc 错误解决 和 远程配置
  • 原文地址:https://www.cnblogs.com/luckForever/p/7255084.html
Copyright © 2020-2023  润新知