//大家在进行数据库访问的时候,经常会将自己常用的一些写成函数的形式, 但如果是不同类型的数据库,或者想转换数据库类型,就比较麻烦了,此处提供了三个对象.TDataAccess为基类.TServerAccess为ADO类型的,TClientAccess为BDE类型的, 这几个都有点不太舒服的地方,就是没有提供初始化委托函数,而是用一个INITALL来进行初始化,大家可以自己改进,这只是我们应用的一个特例.
unit DataAccess_U;
interface
uses
Classes, ADODB, DB, SysUtils, Dbtables, Variants, Forms;
type
TDataAccess = class
public
function GetSQLValue(ASQLStr: string; var AValue: Variant): Boolean; overload; virtual;
function GetSQLValue(ASQLStr: string; var AValue: string): Boolean; overload; virtual;
procedure ExecSQL(ASQLStr: string); virtual; abstract;
function OpenSQL(ASQLStr: string; var ADataSet: TDataSet): Boolean; virtual; abstract;
end;
TServerAccess = class(TDataAccess)
private
function GetCommQuery: TADOQuery;
procedure FreeCommQuery(AQuery: TADOQuery);
public
ADOConnection: TADOConnection;
ConnectString: string;
constructor Create;
destructor Destroy; override;
procedure ExecSQL(ASQLStr: string); override;
function OpenSQL(ASQLStr: string; var ADataSet: TDataSet): Boolean; override;
procedure InitAll; virtual;
end;
TClientAccess = class(TDataAccess)
private
DataBaseName: string; //{ DONE : 等待赋值 }
function GetCommQuery: TQuery;
procedure FreeCommQuery(AQuery: TQuery);
public
constructor Create;
procedure ExecSQL(ASQLStr: string); override;
function OpenSQL(ASQLStr: string; var ADataSet: TDataSet): Boolean; override;
class procedure CreateAlias;
procedure InitAll;
end;
implementation
constructor TServerAccess.Create;
begin
ADOConnection := TADOConnection.Create(nil);
end;
destructor TServerAccess.Destroy;
begin
ADOConnection.Free;
inherited;
end;
procedure TServerAccess.ExecSQL(ASQLStr: string);
var
tmpQuery: TADOQuery;
begin
tmpQuery := GetCommQuery;
try
tmpQuery.Close;
tmpQuery.SQL.Text := ASQLStr;
tmpQuery.ExecSQL;
finally
freeCommQuery(tmpQuery);
end;
end;
procedure TServerAccess.FreeCommQuery(AQuery: TADOQuery);
begin
FreeAndNil(AQuery);
end;
function TServerAccess.GetCommQuery: TADOQuery;
begin
Result := TADOQuery.Create(nil);
Result.Connection := ADOConnection;
end;
procedure TServerAccess.InitAll;
begin
end;
function TServerAccess.OpenSQL(ASQLStr: string;
var ADataSet: TDataSet): Boolean;
var
tmpADOQuery: TADOQuery;
begin
tmpADOQuery := GetCommQuery();
tmpADOQuery.SQL.Text := ASQLStr;
tmpADOQuery.Open;
Result := tmpADOQuery.RecordCount > 0;
ADataSet := tmpADOQuery;
end;
constructor TClientAccess.Create;
begin
DataBaseName := 'selfold';
end;
class procedure TClientAccess.CreateAlias;
var
tmpStrList: TStringList;
begin
Session.DeleteAlias('selfold');
Session.SaveConfigFile;
if not Session.IsAlias('selfold') then
begin
tmpStrList := TStringList.Create;
try
tmpStrList.Add('path =' + ExtractFilePath(Application.ExeName) + 'HS_DATA');
Session.AddAlias('selfold', 'STANDARD', tmpStrList);
Session.SaveConfigFile;
finally
tmpStrList.Free;
end;
end;
end;
procedure TClientAccess.ExecSQL(ASQLStr: string);
var
tmpQuery: TQuery;
begin
tmpQuery := GetCommQuery;
tmpQuery.SQL.Text := ASQLStr;
tmpQuery.ExecSQL;
FreeCommQuery(tmpQuery);
end;
procedure TClientAccess.FreeCommQuery(AQuery: TQuery);
begin
AQuery.Free;
end;
function TClientAccess.GetCommQuery: TQuery;
begin
Result := TQuery.Create(nil);
Result.DatabaseName := DataBaseName;
end;
procedure TClientAccess.InitAll;
begin
end;
function TClientAccess.OpenSQL(ASQLStr: string;
var ADataSet: TDataSet): Boolean;
var
tmpQuery: TQuery;
begin
tmpQuery := GetCommQuery;
tmpQuery.RequestLive := True;
tmpQuery.SQL.Text := ASQLStr;
tmpQuery.Open;
ADataSet := tmpQuery;
Result := tmpQuery.RecordCount > 0;
end;
{ TDataAccess }
function TDataAccess.GetSQLValue(ASQLStr: string;
var AValue: Variant): Boolean;
var
tmpDataSet: TDataSet;
i: Integer;
begin
Result := OpenSQL(ASQLStr, tmpDataSet);
try
if Result then
begin
AValue := VarArrayCreate([0, tmpDataSet.FieldCount], varVariant);
for I := 0 to tmpDataSet.FieldCount - 1 do // Iterate
begin
AValue[I] := tmpDataSet.Fields[I].AsString;
end; // for
end;
finally
tmpDataSet.Close;
tmpDataSet.Free;
end;
end;
function TDataAccess.GetSQLValue(ASQLStr: string;
var AValue: string): Boolean;
var
tmpDataSet: TDataSet;
begin
Result := OpenSQL(ASQLStr, tmpDataSet);
try
if Result then
AValue := tmpDataSet.Fields[0].AsString;
finally
tmpDataSet.Close;
tmpDataSet.Free;
end;
end;