📄 unitdatacommand.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 + -