⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unitdatacommand.pas

📁 简单封装数据库表的类的一个简单的例子: http://www.delphifans.com/SoftView/SoftView_1476.html
💻 PAS
字号:
unit UnitDataCommand;
 
interface

uses
  Classes, ADODB, DB, SysUtils, DBClient, Variants,
  {$ifdef CodeSite}
  CSIntf,
  {$endif}  // CodeSite
  UnitDataInterface, UnitDataController;

type
  TDataCommand = class(TBaseCommand)
  private
    {$ifdef CodeSite}
    procedure ShowParameters;
    {$endif}  // CodeSite
    function ADOParams: TParameters;
    function AsADOQuery: TADOQuery;
    procedure CheckNullObject;
    procedure FreeDataObject;
    function AsADOStoredProc: TADOStoredProc;
    function GetController: TBaseController;
    procedure SetController(const Value: TBaseController);
  protected
    procedure SetCommandText(const Value: string); override;
    function GetParams: TParams; override;
    procedure SetCommandType(const Value: TCommandType); override;
    procedure CreateObject; override;
  public
//    constructor Create(AOwner: TComponent; AController: TDataController);
//            reintroduce;
//    destructor Destroy; override;
//    procedure AddParameter(AParamName: string; AParamValue: Variant);
//    procedure Close;
//    function Execute: Boolean;
//    function Open: TDataSet;
    function Execute(CloseConnection: Boolean = false): Boolean; override;
    function Open: TDataSet; override;
    procedure Close; override;
    property Controller: TBaseController read GetController write SetController;
  end;
  

implementation

uses UnitAppLogger;//, UnitAppConsts;
//
//{$IFDEF APP_DEBUG}
//const
//  BOOL_STATUS: array[Boolean] of string = ('failed', 'successful');
//{$ENDIF}


{ TDataCommand }

{
********************************* TDataCommand *********************************
}
//
//constructor TDataCommand.Create(AOwner: TComponent; AController:
//        TDataController);
//begin
//  inherited Create(AOwner);
//  FController := AController;
//  FCommandType := cmdText;
//end;
//
//destructor TDataCommand.Destroy;
//begin
//  CloseQuery;
//  if FQuery <> nil then
//    FQuery.Free;
//  FController := nil;
//  inherited;
////  {$ifdef CodeSite}
////  CodeSite.SendMsg('TDataCommand.Destroy');
////  {$endif}  // CodeSite
//end;
//
//procedure TDataCommand.AddParameter(AParamName: string; AParamValue: Variant);
//begin
//  if Parameters.FindParam(AParamName) = nil then
//  begin
//    with Parameters.AddParameter do
//    begin
//      Name := AParamName;
//      Value := AParamValue;
//    end;
//  end
//  else
//    Parameters.ParamValues[AParamName] := AParamValue;
//end;
//
//procedure TDataCommand.Close;
//begin
//  CloseQuery;
//end;
//
//procedure TDataCommand.CloseQuery;
//begin
//  if (FQuery <> nil) and FQuery.Active then
//  begin
//    FQuery.Close;
//  end;
//end;
//
//procedure TDataCommand.CreateQuery;
//begin
//  if FQuery <> nil then
//  begin
//    CloseQuery;
//    FQuery.Free;
//  end;
//  if FCommandType = cmdStoredProc then
//  begin
//    FQuery := TADOStoredProc.Create(Self);
//    with TADOStoredProc(FQuery) do
//    begin
//      Connection := FController.Connection;
//      ProcedureName := FCommandText;
////      Parameters.Refresh;
//    end;    // with
////    GetStoredProc.Parameters.Refresh;
//  end
//  else
//  begin
//    FQuery := TADOQuery.Create(Self);
//    with TADOQuery(FQuery) do
//    begin
//      Connection := FController.Connection;
//      SQL.Text := FCommandText;
//    end;    // with
//  end;
//end;
//
function TDataCommand.Execute(CloseConnection: Boolean = false): Boolean;
var
  I: Integer;
  fRecord: Integer;
begin
//    {$ifdef CodeSite}
//  CodeSite.EnterMethod('TDataCommand.Execute');
//  CodeSite.SendObject('Command', Self);
//    {$endif}  // CodeSite
  result := False;
  try
    try
      CheckNullObject;
//      if FQuery = nil then
//        CreateQuery;
  //      if not FController.Connected then
      Controller.OpenConnection;
      if CommandType = cmdStoredProc then
      begin
        AsADOStoredProc.Parameters.Assign(FParams);
        AsADOStoredProc.ExecuteOptions := [eoExecuteNoRecords]; //如果没有此句,将屏蔽数据库错误
        AsADOStoredProc.ExecProc;// := True;
        result := True;
        FParams.Assign(AsADOStoredProc.Parameters);
      end
      else
      begin
        AsADOQuery.Parameters.Assign(FParams);
//        {$ifdef CodeSite}
//        ShowParameters;
//        for I := 0 to AsADOQuery.Parameters.Count - 1 do    // Iterate
//        begin
//          CodeSite.SendFmtMsg('%s=%d', [AsADOQuery.Parameters[I].Name,
//           Ord(AsADOQuery.Parameters[I].DataType)]);
//        end;    // for
//        {$endif}  // CodeSite
        AsADOQuery.ExecSQL;
        result := True;
        FParams.Assign(AsADOQuery.Parameters);
      end;
  //      result := True;
      {$ifdef CodeSite}
      CodeSite.SendObject('TDataCommand', Self);
      CodeSite.SendBoolean('Execute', Result);
      {$endif}  // CodeSite
    except
      on e: Exception do
      begin
          {$ifdef CodeSite}
        CodeSite.SendMsg(Controller.ConnectString);
        ShowParameters;
          {$endif}  // CodeSite
        AppLogger.AddLog(Self, E.Message);
        raise;
      end;
    end;    // try/except
  finally
    if not Controller.InTransaction and (CloseConnection) then
      Controller.CloseConnection;
  end;
  {$ifdef CodeSite}
  CodeSite.SendBoolean('TDataCommand.Execute:', result);
  {$endif}  // CodeSite
//    {$ifdef CodeSite}
//  CodeSite.ExitMethod('TDataCommand.Execute');
//    {$endif}  // CodeSite
end;
//
//function TDataCommand.GetParameters: TParameters;
//begin
//  if FQuery = nil then
//    CreateQuery;
//  if FCommandType = cmdStoredProc then
//    result := GetStoredProc.Parameters
//  else
//    result := GetQuery.Parameters;
//end;
//
//function TDataCommand.GetQuery: TADOQuery;
//begin
//  if FQuery = nil then
//    CreateQuery;
//  if FCommandType <> cmdStoredProc then
//    Result := FQuery as TADOQuery
//  else
//    result := nil;
//end;
//
//function TDataCommand.GetStoredProc: TADOStoredProc;
//begin
//  if FQuery = nil then
//    CreateQuery;
//  if FCommandType = cmdStoredProc then
//    Result := FQuery as TADOStoredProc
//  else
//    result := nil;
//end;
//
//procedure TDataCommand.InitializeObject;
//begin
//end;
//
function TDataCommand.Open: TDataSet;
var
  fData: TDataSet;
begin
    {$ifdef CodeSite}
  CodeSite.EnterMethod('TDataCommand.Open');
//  CodeSite.SendObject('Command', Self);
    {$endif}  // CodeSite
  result := nil;
  try
    CheckNullObject;
    Controller.OpenConnection;
    if FParams <> nil then
//    begin
//    if FCommandType = cmdStoredProc then
////    begin
//      AsADOStoredProc.Parameters.Assign(FParams)
//  //      .Active := True;
//  //      result := GetStoredProc;
////    end
//    else
//      AsADOQuery.Parameters.Assign(FParams);
//    end;
      ADOParams.Assign(FParams);
    fData := TCustomADODataSet(FDataObject);
//    begin
//      result := GetQuery;//.Open;
  //      result.Open;// := GetQuery;
//    end;
    fData.Active := True;
    if ClientData then
      fData := GetClientData(fData);
    result := fData;
    Params.Assign(ADOParams);
    {$ifdef CodeSite}
    CodeSite.SendMsg(CommandText);
    CodeSite.SendInteger('Count', result.RecordCount);
//    CodeSite.SendObject('DataCommand', Self);
    {$endif}
  except
    on e: Exception do
    begin
      {$ifdef CodeSite}
      CodeSite.SendObject('TDataCommand', Self);
      CodeSite.SendMsg(Controller.ConnectString);
      ShowParameters;
     {$endif}  // CodeSite
      AppLogger.AddLog(Self, E.Message);
      raise;
    end;
  end;    // try/except
    {$ifdef CodeSite}
  CodeSite.SendMsg('Open successful!');
  CodeSite.ExitMethod('TDataCommand.Open');
    {$endif}  // CodeSite
end;
//
//procedure TDataCommand.SetCommandText(const Value: string);
//begin
//  if Value <> FCommandText then
//  begin
//    FCommandText := Value;
//    if FQuery = nil then
//      CreateQuery;
//    CloseQuery;
//    if FCommandType = cmdStoredProc then
//    begin
//      with GetStoredProc do
//      begin
//        ProcedureName := Value;
//        Parameters.Refresh;
//      end
//    end
//    else
//      with GetQuery do
//      begin
//        SQL.Text := Value;
//        Parameters.ParseSQL(SQL.Text, True);
//      end;    // with
//  (*    {$IFDEF APP_DEBUG}
//      Common.AppLogger.Debug('TDataCommand.SetCommandText: %s', [Value]);
//      {$ENDIF}
//  *)
//  end;
//end;
//
//procedure TDataCommand.SetCommandType(const Value: TCommandType);
//begin
//  if FCommandType <> Value then
//  begin
//    FCommandType := Value;
//    CreateQuery;
//  end;
//end;
//
{$ifdef CodeSite}
procedure TDataCommand.ShowParameters;
var
  I: Integer;
  fstr: string;
begin
  CodeSite.EnterMethod('TDataCommand.ShowParameters');
  for I := 0 to Params.Count - 1 do    // Iterate
  begin
    if VarIsNull(Params[I].Value) then
      fStr := 'NULL VALUE'
    else
      fStr := VarToStr(Params[I].Value);
    CodeSite.SendFmtMsg('%s=[%s],Type=%d', [Params[I].Name, fStr, Ord(VarType(Params[I].Value))]);
  end;    // for
  CodeSite.ExitMethod('TDataCommand.ShowParameters');
end;
{$endif}  // CodeSite

{ TDataCommand }

//procedure TDataCommand.AddParameter(AParamName: string;
//  AParamValue: Variant);
//var
//  fParam: TParam;
//begin
//  fParam := Params.FindParam(AParamName);
//  if fParam = nil then
////  begin
//    fParam := Params.CreateParam(ftString, AParamName, ptInput);
////    with Params.AddParameter do
////    begin
////      Name := AParamName;
////      Value := AParamValue;
////    end;
////  end
////  else
////   Parameters.ParamValues[AParamName]
//   fParam.Value := AParamValue;
//end;

function TDataCommand.AsADOQuery: TADOQuery;
begin
  result := nil;
  CheckNullObject;
  if FDataObject is TADOQuery then
    result := FDataObject as TADOQuery;
end;

function TDataCommand.AsADOStoredProc: TADOStoredProc;
begin
  result := nil;
  CheckNullObject;
  if FDataObject is TADOStoredProc then
    result := FDataObject as TADOStoredProc;
end;

procedure TDataCommand.CheckNullObject;
begin
  if FDataObject = nil then
    CreateObject;
end;

procedure TDataCommand.Close;
begin
  if FDataObject <> nil then
    TCustomADODataSet(FDataObject).Close;
end;

procedure TDataCommand.CreateObject;
begin
  FreeDataObject;
  if CommandType = cmdStoredProc then
  begin
    FDataObject := TADOStoredProc.Create(Self);
    with TADOStoredProc(FDataObject) do
    begin
      Connection := Controller.Connection as TADOConnection;
      ProcedureName := CommandText;
//      Parameters.Refresh;
    end;    // with
//    with TADOStoredProc(FDataObject) do
//    begin
//      Connection := FController.
//      ProcedureName := CommandText;
//    end;    // with
  end
  else
  begin
    FDataObject := TADOQuery.Create(Self);
//    AsADOQuery.Connection := Controller.Connection as TADOConnection;
//    AsADOQuery.SQL.Text := CommandText;
    with TADOQuery(FDataObject) do
    begin
      Connection := Controller.Connection as TADOConnection;
      SQL.Text := CommandText;
    end;    // with
  end;
end;

//function TDataCommand.Execute: Boolean;
//begin
//
//end;

procedure TDataCommand.FreeDataObject;
begin
  if FDataObject <> nil then
  begin
    Close;
    FDataObject.Free;
    FDataObject := nil;
  end;
end;

function TDataCommand.GetController: TBaseController;
begin
  Result := FController;// as TDataController;
end;

function TDataCommand.GetParams: TParams;
begin
  CheckNullObject;
  if FParams = nil then
  begin
    FParams := TParams.Create;
    if AsADOQuery <> nil then
    begin
      if not AsADOQuery.Prepared then
        AsADOQuery.Parameters.ParseSQL(CommandText, True);
//      FParams.Assign(AsADOQuery.Parameters);
    end
    else
    begin
      AsADOStoredProc.Parameters.Refresh;
//      FParams.Assign(AsADOStoredProc.Parameters);
    end;
    FParams.Assign(ADOParams);
  end;
  result := FParams;
end;
//
//function TDataCommand.Open: TDataSet;
//begin
//
//end;

procedure TDataCommand.SetCommandText(const Value: string);
begin
  FreeDataObject;
  inherited;
end;

procedure TDataCommand.SetCommandType(const Value: TCommandType);
begin
  FreeDataObject;
  inherited;
end;

procedure TDataCommand.SetController(const Value: TBaseController);
begin
  FController := Value;
end;


function TDataCommand.ADOParams: TParameters;
begin
  if CommandType = cmdText then
    result := AsADOQuery.Parameters
  else
    result := AsADOStoredProc.Parameters;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -