理解MHS(4):数据库-查询控件TwmQuery
为了便于扩展,数据库查询控件TwmQuery被设计成了这个样子:
TwmQuery = class(TComponent)
public
DataSet: TDataSet;//实际为TQuery,也就是所有执行的本体,TwmQuery就是它的壳;
public
property Active;
property SQL: TStrings;
property RecordCount: Integer;.....
end;
简单点儿说,TWmQuery就是一个包了TQuery的一个壳,它把TQuery的常用属性和方法重新包装出来进行使用,例如:
function TestTransaction: Boolean;
var
AQuery: TWmQuery;
begin
AQuery := wm.NewQuery('');
try
AQuery.StartTransaction;
try
AQuery.SQL.Text := 'Update employee Set Salary=Salary + 100';
AQuery.Execute;
if AQuery.InTransaction then
begin
AQuery.Commit;
Result := True;
end;
except
on E: Exception do
begin
AQuery.Rollback;
end;
end;
finally
FreeAndNil(AQuery);
end;
end;
这段代码中即是对TWmQuery的完整操作。一些特殊说明的内容如下:
一、属性:
1.DataSet
因为TWmQuery的DataSet发布为TDataSet,所以下面代码是错误的:
AQuery.DataSet.SQL.Text = 'SELECT * FROM AAA';
原因很简单,因为TDataSet类不包含SQL属性。
2.等价属性
i := AQuery.DataSet.RecordCount;
i := AQuery.RecordCount;
这段代码是等价的,因为 AQuery.RecordCount 最终操纵的就是 AQuery.DataSet.RecordCount。
同理,下面也是等价的:
AQuery.Next 等同于 AQuery.DataSet.Next;
AQuery.Append 等同于 AQuery.DataSet.Append;
.....
有关TDataSet的详细属性请参考Pascal的TDataSet类。
另外提醒注意:如果AQuery中的方法无法使用或者出错时,可以更改为AQuery.DataSet方法或者属性试试,也可以在遇到Bug时提请MHS团队进行修改。
3.特殊属性
AQuery.SQL即为特殊属性,因为TDataSet不具有该属性,虽然内部的DataSet是有该属性的,但因为发布该属性实在太过困难,所以,只能用巧妙的办法来发布特殊属性来实现特殊操作了。
同样的内容还有很多,例如:
方法:
FindParam
ParamByName
ParamByIndex
Prepare
UnPrepare
OpenNext
RefreshQuick;
Execute
ExecSQL
Executing
Fetching
FetchingAll
Fetched
BreakExec
ApplyUpdates
RefreshRecord
Lock
Unlock
SaveSQL
RestoreSQL
SQLSaved
AddWhere
DeleteWhere
SetOrderBy
GetOrderBy
CheckPrepared
GetFieldDescNo
DeferredPost
Locate
UpdateResult
CommitUpdates
CancelUpdates
RestoreUpdates
RevertRecord
SaveToXML
SetRange
CancelRange
SetRangeStart
SetRangeEnd
EditRangeStart
EditRangeEnd
IsSequenced
InCacheProcessing
属性:
SpecificOptions
SQL
SQLDelete
SQLInsert
SQLLock
SQLRecCount
SQLRefresh
SQLUpdate
LastInsertId
ParamCount
MacroCount
RowsAffected
IsQuery
BaseSQL
FinalSQL
Disconnected
Prepared
UpdatesPending
Ranged
KeyExclusive
AutoCalcFields
Debug
DMLRefresh
CachedUpdates
FetchRows
FilterSQL
IndexFieldNames
KeyFields
LocalUpdate
LockMode
MasterFields
ParamCheck
ReadOnly
UpdatingTable
4.注意事项
4.1面对如此之多的属性和方法,我们建议只使用常用的属性和方法,毕竟很多内容没有进行全面测试,也请遇到问题时及时反馈给MHS团队以进行相应处理。
4.2当无法确定该内容是否可用,或者需要更多帮助时,也可以参考Pascal的控件帮助以快速获取使用方法。
4.3可以加入MHS的QQ群进行互相学习来获取更多帮助。
4.4也可以咨询MHS团队以获取更多高级帮助。
二、使用方法
1.创建
如上所述,TwmQuery是由数据模块(WebModule)创建的:
AQuery := wm.NewQuery('');
NewQuery方法接受两个参数:
参数1:控件名,字符串,默认为空
参数2:数据库名,字符串,默认为空,为空时,直接使用默认数据库连接,否则使用指定的数据库连接
有关内容可参考数据库连接节的内容,也可以直接参考Lessons中的代码。
注意:
TwmQuery不接受其它创建方法,即无法脱离数据模块(WebModule)直接创建。
默认创建出来的Query实例的所有者(Owner)为数据模块,这就意味着,当您没有手动释放Query实例时则由数据模块在执行结束时自动释放内存,建议自己控制释放。
2.高级扩展
为了使得TWmQuery更加方便使用,对TWmQuery进行了如下属性的扩展:
直接使用字段的Value属性(Variant类型)对字段进行操作。
AQuery.FV['AFieldName'] := '张三';
等同于
AQuery.FieldByName('AFieldName').Value := '张三';
-----------------------------------------------------
v := AQuery.FV['AFieldName'];
等同于
v := AQuery.FieldByName('AFieldName').Value;
-----------------------------------------------------
基于上述同样内容,TwmQuery的扩展内容还有:
使用字符串类型对字段进行操作:AQuery.FS['AFieldName']
使用整数类型对字段进行操作:AQuery.FI['AFieldName']
使用浮点数类型对字段进行操作:AQuery.FD['AFieldName'],同样适用于时间日期类型。
使用Bool值对字段进行操作:AQuery.FB['AFieldName']
使用UTF8字符串对字段进行操作:AQuery.FS8['AFieldName']
-----------------------------------------------------
从上面可以看出,以下这些语句都是等价的,可根据需要进行使用:
AQuery.DataSet.FieldByName('AFieldName') := 'Hello';
AQuery.FieldByName('AFieldName') := 'Hello';
AQuery.FS['AFieldName'] := 'Hello';
如果您的MHS不支持这些操作,请升级到最新版本。
3.创建失败
在TwmQuery创建时,有可能会出现创建失败的情况,例如:
数据库连接不存在,或者数据库连接已失效等等意外情况,此时wm.NewQuery('')返回的是nil值,因此也需要在代码中对这种情况进行处理,详细情况可以参考MHS网站中的代码。例如在TBaseQry中的代码片段是这样的:
Result := -1;
if not Assigned(AQuery) then
begin
AQuery := wm.NewQuery('', ADbName);
if not Assigned(AQuery) then
begin
Writeln(Format('Err(TBaseQry.DbQuery):Database connection err.', []));
Exit;
end;
end
else
begin
AQuery.Active := False;
end;
因此为了创建更具健壮性的代码,需要多加小心。
0 Comments