一个简单的,适应多种数据库之间存取操作的数据库访问层[1]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 qiubolecn 的 blog

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

本文关键:一个简单的,适应多种数据库之间存取操作的数据库访问层
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top