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

原创 2004年12月30日 08:29:00

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

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

 大家在进行数据库访问的时候,经常会将自己常用的一些写成函数的形式, 但如果是不同类型的数据库,或者想转换数据库类型,就比较麻烦了,此处提供了三个对象.TDataAccess为基类.TServerAc...
  • lee576
  • lee576
  • 2007年08月29日 18:56
  • 1193

数据库访问抽象层系列-1(介绍数据库编程接口及数据库访问抽象层概念)

摘要 本人最近完成了一个封装数据库访问抽象层的项目。我们开发的数据库访问抽象层作为分布式集群基础平台的一个组件。可以支持不同数据库编程接口(OCI、mysql、ODBC、pgsql)等。本系列博...
  • bobkentblog
  • bobkentblog
  • 2015年04月15日 10:37
  • 2328

一个简单实用的数据库操作框架

  一个简单实用的数据库操作框架 前言  学习JDBC以来一直想实现一个简单的封装来方便编程但是由于水平有限一直没有较好的办法,看了IBM开发网上的两篇文章以后感觉作者的设计思想很好一定能扩充成一个实...
  • kingapex1
  • kingapex1
  • 2004年10月07日 15:42
  • 1260

简单通用数据访问层

使用Qt实现的简单的通用数据访问层,方便构建通用数据访问。
  • wolfseek
  • wolfseek
  • 2015年03月07日 10:58
  • 497

简单通用数据访问映射层

与简单数据访问层配合的命令道SQL语句的映射层,目标构建通用代码,使用不同的配置文件完成不同数据访问功能。...
  • wolfseek
  • wolfseek
  • 2015年03月07日 11:02
  • 329

ASP.NET && 实验六 && ADO.NET数据库访问技术(一)

实验六  ADO.NET数据库访问技术(一)   一. 目的和要求 掌握使用ADO。NET访问SQL Server数据库.掌握使用ADO.NET进行增加、删除、修改数据的方法。 二.实验课时 2课...
  • enzaikenan
  • enzaikenan
  • 2013年11月25日 13:08
  • 997

Asp.net mvc 数据访问层

理解了一些概念,本节开始尝试创建属于自己的数据访问层,说道数据访问层那必须有数据库咯(数据集合也算,此处以数据库为例),没有数据库就没有数据访问层。 1、先创建属于自己的数据库       打开已...
  • u013108485
  • u013108485
  • 2016年04月14日 16:19
  • 4929

数据访问层的设计和实现(分布式系统七)

(1)如何对外提供数据访问层的功能 数据访问层就是方便应用进行数据读写访问的抽象层,在该层上解决各个应用通用的访问数据库的问题。 上图显示了三种方式,第一种是为用户提供专有API,不过不推...
  • u011393781
  • u011393781
  • 2016年10月08日 17:41
  • 1578

分布式数据访问层(DAL)

概述分布式(Distributed)数据访问层(Data Access Layer),简称DAL,是利用MySQL Proxy、Memcached、集群等技术优点而构建的一个架构系统。主要目的是为了解...
  • xcbeyond
  • xcbeyond
  • 2017年02月11日 00:46
  • 1533

设计模式学习之抽象工厂模式(实现数据访问层)

1 什么是抽象工厂模式 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需制定他们的具体类。结构图如下:   分析一下抽象工厂模式,1提供一系列...
  • wziyx513225244
  • wziyx513225244
  • 2011年08月03日 09:56
  • 3126
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个简单的,适应多种数据库之间存取操作的数据库访问层
举报原因:
原因补充:

(最多只允许输入30个字)