一、TSQLConnection
TSQLConnection和Tdatabase,、TADOConnection/TIBDatabase一样,继承自TcustomConnection. TcustomConnection提供了Connected,DataSetCount, DataSets,LoginPrompt、StreamedConnected等常用属性。
1、dbxconnections.ini和dbxdrivers.ini
在讨论TSQLConnection的之前,让我们先看看dbxconnections.ini和dbxdrivers.ini,它们默认存放在./Borland Shared/dbExpress/,dbxdrivers.ini中保存着各种dbExpress驱动程序信息,所需要的库信息(DLL),默认参数设定;dbxconnections.ini保存每个连接的具体设定(在dbExpress Connections对话框中看到的信息)。
2、TSQLConnection的重要属性
Connected:是否连接到数据库;
ConnectionName:连接名称,可以双击TSQLConnection控件进行设定、增减;
DataSets:当前所有连接到本SQLConnection的活动DataSet(包括TSQLDataSet、TSQLTable、TSQLQuery、TSQLStoredProc);
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(包括TSQLDataSet、TSQLTable、TSQLQuery、TSQLStoredProc);
StartTransaction、Commit、Rollback:一组处理事务的命令,应该都很熟悉了。先执行StartTransaction,然后执行关键任务,如果执行Commit,则保存执行结果,如果执行RollBack,则取消上一次StartTransaction或Commit到目前为止所有任务。给出简单实例(摘自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语句;
Params:Tparams类型,执行此SQL的参数;
ExecuteDirect:执行不带参数的SQL语句;。
function ExecuteDirect(const SQL: string ): LongWord;
参数为需要执行的SQL语句,如果执行成功则返回0。
GetFieldNames,GetIndexNames,GetProcedureNames,GetProcedureParams,GetTableNames:获得有关信列、索引、存储过程、存储过程参数、表名等信息。
4、事件
TSQLConnection的事件相当简单,也相当易懂OnLogin、AfterConnect、AfterDisconnect、BeforeConnect、BeforeDisconnect。
二、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而在内部使用了TSQLDataSet和TSQLProvider的组件。这意味着,它可以使用dbExpress的机制来访问数据库,而又能在内存中保存让用户浏览、修改,最后递交到数据库服务器(这也牺牲部分性能)。这就在数据库访问性能和易操作性间给出了平衡。
这里,我们给出了一个实例来正式这一点(dbsqlclientdataset2)。我们使用一个TDBGrid,一个TDBNavigator,一个TSQLConnection,一个TSQLClientDataSet,一个TButton组成了一个最简单的程序。
图 1TSQLClientDataSet的实例
我们可以清晰的看到,在按了Button1后执行了 SQLClientDataSet1.ApplyUpdates(-1);,数据被修改了。
这里又给出了一个使用TClientDataSet连接dbExpress数据源的例子(dbsqlclientdataset2/),就和连接其它数据源一样,这和TSQLClientDataSet并没有联系。由于可以达到类似的效果,我们给出实例。
遗憾的是,在Borland文档中,不推荐使用TSQLClientDataSet作主要/明细结构,因为,TSQLClientDataSet无法在这样的情况下优化查询。
四、多层应用MIDAS
为什么要用dbExpress?dbExpress的设计目的是什么?在传统的Client/Server程序中,为了提高这点性能,牺牲那么多程序开发中的灵活性值得吗?
我个人认为,dbExpress是为了多层应用而设计的。
在应用程序服务器上,使用单向数据集,可以把访问数据库的效率提到最高,而在客户端的开发又不受任何影响。这真实鱼与熊掌兼得之、
用dbExpress开发Midas应用程序和以前几乎一样,我们给出了实例(Midas/)。
五、调试dbExpress(Debugging)
根据Delphi6帮助说明,你可以使用两种方法跟踪dbExpress的行为、第一种方法是使用TSQLConnection控件的SetTraceCallbackEvent方法。这是一个CallBack方法,以后每当SQLConnectin向数据库服务器发送命令,就会触发你的CallBack事件。由于这个方法比较复杂(其实也不复杂,可如果你不熟悉Windows的Callback概念,那它真的复杂了),我们不对其进行详细介绍。为了方便用户,Delphi提供了第二种方法——TSQLMonitor控件,它封装了SetTraceCallbackEvent方法。设定SQLMonitor的SQLConnection属性为需要调试的TSQLConnection控件,设置其Active为True,以后,每当通过SQLConnection向数据库服务器发送命令,其TraceList属性(TStringList)会被更新,且会触发LogTrace事件;如果你希望自动保存这些信息,可以设置TSQLMonitor的Filename属性及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;
|