delphi DBExpress 提高

一、TSQLConnection
TSQLConnectionTdatabase,TADOConnection/TIBDatabase一样,继承自TcustomConnection. TcustomConnection提供了ConnectedDataSetCount DataSetsLoginPromptStreamedConnected等常用属性。
1、dbxconnections.ini和dbxdrivers.ini
在讨论TSQLConnection的之前,让我们先看看dbxconnections.inidbxdrivers.ini,它们默认存放在./Borland Shared/dbExpress/dbxdrivers.ini中保存着各种dbExpress驱动程序信息,所需要的库信息(DLL),默认参数设定;dbxconnections.ini保存每个连接的具体设定(在dbExpress Connections对话框中看到的信息)。
2、TSQLConnection的重要属性
Connected:是否连接到数据库;
ConnectionName:连接名称,可以双击TSQLConnection控件进行设定、增减;
DataSets:当前所有连接到本SQLConnection的活动DataSet(包括TSQLDataSetTSQLTableTSQLQueryTSQLStoredProc;
DriverName:驱动程序名;
KeepConnection:保持连接状态;
TableScope:此属性决定当取得数据库中表时返回表的类型。其定义如下:
type
 TTableScope = (tsSynonym, tsSysTable, tsTable, tsView);
 TTableScopes = set of TTableScope;
property TableScope: TTableScopes;
 TTableScope = (tsSynonym, tsSysTable, tsTable, tsView);
 TTableScopes = set of TTableScope;
其中:
tsSynonym:返回重名表
tsSysTable:返回系统表
tsTable :返回普通表
tsView views:返回视图
VendorLib:返回dbExpress与数据库服务器连接所需的DLL
3、重要方法
CloseDataSets:关闭与此SQLConnection连接所有活动DataSet(包括TSQLDataSetTSQLTableTSQLQueryTSQLStoredProc;
StartTransactionCommitRollback:一组处理事务的命令,应该都很熟悉了。先执行StartTransaction,然后执行关键任务,如果执行Commit,则保存执行结果,如果执行RollBack,则取消上一次StartTransactionCommit到目前为止所有任务。给出简单实例(摘自Delphi帮助):
procedure TForm1.TransferButtonClick(Sender: TObject);
var
 Amt: Integer;
 TD: TTransactionDesc;
begin
 if not SQLConnection1.InTransaction then //如果目前不在一个事务中
 begin
    TD.TransactionID := 1;
    TD.IsolationLevel := xilREADCOMMITTED;
    SQLConnection1.StartTransaction(TD);
    try
      Amt := StrToInt(AmtEdit.Text);
      Debit.Params.ParamValues['Amount'] := Amt;
      Credit.Params.ParamValues['Amount'] := Amt;
      SQLConnection1.Commit(TD); //一切顺利则递交
    except
 
      SQLConnection1.Rollback(TD); //发生任何错误则回滚
    end;
 end;
end;
         Execute:执行一条SQL语句;
function Execute(const SQL: string; Params: TParams; ResultSet:Pointer=nil): Integer;
参数:
SQL:需要执行的SQL语句;
ParamsTparams类型,执行此SQL的参数;
     ExecuteDirect:执行不带参数的SQL语句;。
function ExecuteDirect(const SQL: string ): LongWord;
                 参数为需要执行的SQL语句,如果执行成功则返回0
       GetFieldNamesGetIndexNamesGetProcedureNamesGetProcedureParamsGetTableNames:获得有关信列、索引、存储过程、存储过程参数、表名等信息。
4、事件
TSQLConnection的事件相当简单,也相当易懂OnLoginAfterConnectAfterDisconnectBeforeConnectBeforeDisconnect
        
二、TSQLDataSet
TSQLDataSet 继承自TCustomSQLDataSet,而TCustomSQLDataSet继承自TdataSet。所以,其大多数方法、属性、事件大家都很熟悉了。
其重要属性如下:
CommandText:向数据库服务器发送的命令;
         CommandType:决定命令类型,其定义如下:
type TSQLCommandType = (ctQuery, ctTable, ctStoredProc);
property CommandType: TSQLCommandType;
ctQuery:此命令是一条需要执行的SQL语句;
ctStoredProc:命令是一个存储过程名;
ctTable:命令是数据库服务器上的表名,系统会自动生成SELECT语句返回记录。
         DesignerData:字符类型,没有任何实际意义,我们可以保存任何信息在此属性中。
         MaxBlobSize:整数型,BLOB类型数据的最大值。如果为-1,则返回所有数据。
         SQLConnection:指向TSQLConnection对象,以连接数据库服务器。
三、TSQLClientDataSet
TSQLClientDataSet是一个在使用类似于TClientDataSet而在内部使用了TSQLDataSetTSQLProvider的组件。这意味着,它可以使用dbExpress的机制来访问数据库,而又能在内存中保存让用户浏览、修改,最后递交到数据库服务器(这也牺牲部分性能)。这就在数据库访问性能和易操作性间给出了平衡。
这里,我们给出了一个实例来正式这一点(dbsqlclientdataset2)。我们使用一个TDBGrid,一个TDBNavigator,一个TSQLConnection,一个TSQLClientDataSet,一个TButton组成了一个最简单的程序。
1TSQLClientDataSet的实例
    我们可以清晰的看到,在按了Button1后执行了 SQLClientDataSet1.ApplyUpdates(-1);,数据被修改了。
    这里又给出了一个使用TClientDataSet连接dbExpress数据源的例子(dbsqlclientdataset2/),就和连接其它数据源一样,这和TSQLClientDataSet并没有联系。由于可以达到类似的效果,我们给出实例。
遗憾的是,在Borland文档中,不推荐使用TSQLClientDataSet作主要/明细结构,因为,TSQLClientDataSet无法在这样的情况下优化查询。
四、多层应用MIDAS
为什么要用dbExpressdbExpress的设计目的是什么?在传统的Client/Server程序中,为了提高这点性能,牺牲那么多程序开发中的灵活性值得吗?
我个人认为,dbExpress是为了多层应用而设计的。
在应用程序服务器上,使用单向数据集,可以把访问数据库的效率提到最高,而在客户端的开发又不受任何影响。这真实鱼与熊掌兼得之、
dbExpress开发Midas应用程序和以前几乎一样,我们给出了实例(Midas/)。
五、调试dbExpress(Debugging)
根据Delphi6帮助说明,你可以使用两种方法跟踪dbExpress的行为、第一种方法是使用TSQLConnection控件的SetTraceCallbackEvent方法。这是一个CallBack方法,以后每当SQLConnectin向数据库服务器发送命令,就会触发你的CallBack事件。由于这个方法比较复杂(其实也不复杂,可如果你不熟悉WindowsCallback概念,那它真的复杂了),我们不对其进行详细介绍。为了方便用户,Delphi提供了第二种方法——TSQLMonitor控件,它封装了SetTraceCallbackEvent方法。设定SQLMonitorSQLConnection属性为需要调试的TSQLConnection控件,设置其ActiveTrue,以后,每当通过SQLConnection向数据库服务器发送命令,其TraceList属性(TStringList)会被更新,且会触发LogTrace事件;如果你希望自动保存这些信息,可以设置TSQLMonitorFilename属性及AutoSave属性。根据一段Delphi帮助中的代码就很说明问题:
procedure TForm1.SQLMonitor1LogTrace(Sender: TObject; CBInfo: Pointer);
var
 LogFileName: string;
begin
 with Sender as TSQLMonitor do
 begin
    if TraceCount = 10 then
    begin
      LogFileName := 'c:/log' + IntToStr(Tag) + '.txt';
      Tag := Tag + 1; {ensure next log file has a different name }
      SaveToFile(LogFileName);
      TraceList.Clear; { clear list }
    end;
 end;
end;


你可能感兴趣的:(delphi DBExpress 提高)