//大家在进行数据库访问的时候,经常会将自己常用的一些写成函数的形式, 但如果是不同类型的数据库,或者想转换数据库类型,就比较麻烦了,此处提供了三个对象.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;