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

📄 gsentitydataset.pas

📁 用Delphi实现的数据库持久化
💻 PAS
📖 第 1 页 / 共 2 页
字号:
function TgsDataSetProxy.GetPropCount: Integer;
begin
  Result := GetTypeData(Self.ClassInfo)^.PropCount;
  FPropCount := Result;
end;

function TgsDataSetProxy.GetPropFieldValue(
  PropField: TgsPropField): Variant;
begin
  Result := Null;
  if PropField is TStringF then
    Result := TStringF(PropField).AsStr
  else if PropField is TIntF then
    Result := TIntF(PropField).AsInt
  else if PropField is TNumberF then
    Result := TNumberF(PropField).AsNum
  else if PropField is TDateTimeF then
    Result := TDateTimeF(PropField).AsDT
  else if PropField is TBooleanF then
    Result := TBooleanF(PropField).AsBool
  //else if PropField is TStringF then
  //  Result := TStringF(PropField).AsStr
end;

function TgsDataSetProxy.GetPropName(Index: Integer): ShortString;
begin
  Result := GetProp(Index)^.Name;
end;

function TgsDataSetProxy.GetPropObj(Index: Integer): TObject;
var
  Prop: TrtProperty;
  i: Integer;
  sPropName: string;
begin
  Result := nil;
  //属性名
  sPropName := GetPropName(Index);
  if sPropName = '' then
    Exit;

  for i := 0 to FPropCount - 1 do
  begin
    Prop := FRTTI.ItemsByName[sPropName];
    if CompareText(Prop.PropInfo.Name, sPropName) = 0 then
    begin
      Result := Prop.AsObject;
      Break;
    end;
  end;
end;


function TgsDataSetProxy.GetPropObj(PropName: string): TObject;
var
  Prop: TrtProperty;
  i: Integer;
begin
  Result := nil;
  //属性名
  for i := 0 to FPropCount - 1 do
  begin
    // FRTTI 的指针对象顺序已经颠倒,不能用index,只能利用index
    Prop := FRTTI.ItemsByName[PropName];
    if CompareText(Prop.PropInfo.Name, PropName) = 0 then
    begin
      Result := Prop.AsObject;
      Break;
    end;
  end;
end;



function TgsDataSetProxy.GetPropTypes(Index: Integer): string;
begin
  Result := GetProp(Index).PropType^.Name;
end;

function TgsDataSetProxy.GetStringF(Index: Integer): TStringF;
begin
  Result := TStringF(FFieldList.Items[Index]);
  Result.Name := PropNames[Index];
  if not FEditState then
  begin
    Result.Caption := FDataSet.FieldByName(PropNames[Index]).DisplayLabel;
    Result.AsStr := FDataSet.FieldByName(PropNames[Index]).AsString;
  end;
end;

function TgsDataSetProxy.GetVarF(Index: Integer): TVarF;
begin
  Result := TVarF(FFieldList.Items[Index]);
  Result.Name := PropNames[Index];
  if not FEditState then
  begin
    Result.Caption := FDataSet.FieldByName(PropNames[Index]).DisplayLabel;
    Result.AsVar := FDataSet.FieldByName(PropNames[Index]).Value;
  end;
end;

function TgsDataSetProxy.HasProperty(PropertyName: string): boolean;
begin
  Result := FRTTI.HasProperty(PropertyName);
end;

procedure TgsDataSetProxy.Insert(EntityFields: array of TgsPropField; Included: Boolean);
var
  i, j: Integer;
  IsFound: Boolean;
  obj: TObject;
  sPropName: string;
begin
  CheckedEditState;
  try
    try
      FDataSet.Insert;
      //新增列举的实体字段
      if Included then
      begin
        for i := Low(EntityFields) to High(EntityFields) do
        begin
          if EntityFields[i] is TStringF then
            FDataSet[EntityFields[i].Name] := TStringF(EntityFields[i]).AsStr
          else if EntityFields[i] is TIntF then
            FDataSet[EntityFields[i].Name] := TIntF(EntityFields[i]).AsInt
          else if EntityFields[i] is TNumberF then
            FDataSet[EntityFields[i].Name] := TNumberF(EntityFields[i]).AsNum
          else if EntityFields[i] is TDateTimeF then
            FDataSet[EntityFields[i].Name] := TDateTimeF(EntityFields[i]).AsDT
          else if EntityFields[i] is TBooleanF then
            FDataSet[EntityFields[i].Name] := TBooleanF(EntityFields[i]).AsBool
        end;
      end
      else
      begin
        for i := 0 to PropCount - 1 do
        begin
          IsFound := False;
          for j := Low(EntityFields) to High(EntityFields) do
          begin
            sPropName := PropNames[i];
            if CompareText(sPropName, EntityFields[j].Name) = 0 then
            begin
              IsFound := True;
              Break;
            end;
          end;
          if IsFound then
            Continue;
          obj := GetPropObj(i);
          if obj = nil then
            Continue;

          if obj is TStringF then
            FDataSet[sPropName] := TStringF(obj).AsStr
          else if obj is TIntF then
            FDataSet[sPropName] := TIntF(obj).AsInt
          else if obj is TNumberF then
            FDataSet[sPropName] := TNumberF(obj).AsNum
          else if obj is TDateTimeF then
            FDataSet[sPropName] := TDateTimeF(obj).AsDT
          else if obj is TBooleanF then
            FDataSet[sPropName] := TBooleanF(obj).AsBool
        end;
      end;
      FDataSet.Post;
    except
      on e: Exception do
      begin
        e.Create('新增记录失败!   ' + cstWrap + e.Message);
      end;
    end;
  finally
    EndEdit;
  end;
end;


procedure TgsDataSetProxy.Insert;
var
  i: Integer;
  FieldObj: TObject;
  sFieldName: string;
begin
  CheckedEditState;

  try
    try
      FDataSet.Insert;
      for i := 0 to PropCount - 1 do
      begin
        FieldObj := GetPropObj(i);
        sFieldName := PropNames[i];

        if FieldObj is TStringF then
          FDataSet[sFieldName] := TStringF(FieldObj).AsStr
        else if FieldObj is TIntF then
          FDataSet[sFieldName] := TIntF(FieldObj).AsInt
        else if FieldObj is TNumberF then
          FDataSet[sFieldName] := TNumberF(FieldObj).AsNum
        else if FieldObj is TDateTimeF then
          FDataSet[sFieldName] := TDateTimeF(FieldObj).AsDT
        else if FieldObj is TBooleanF then
          FDataSet[sFieldName] := TBooleanF(FieldObj).AsBool
        else if FieldObj is TBlobF then
          TBlobField(FDataSet.FieldByName(sFieldName)).LoadFromStream(TBlobF(FieldObj).AsBlob);
      end;
      FDataSet.Post;
    except
      on e: Exception do
      begin
        e.Create('新增记录失败!   ' + cstWrap + e.Message);
      end;
    end;
  finally
    EndEdit;
  end;
end;


procedure TgsDataSetProxy.Last;
begin
  FDataSet.Last;
end;

function TgsDataSetProxy.Locate(Value: Variant): Boolean;
begin
  Result := FDataSet.Locate(KeyName, Value, []);
end;

function TgsDataSetProxy.Locate(EntityField: TgsPropField): Boolean;
begin
  Result := FDataSet.Locate(EntityField.Name, GetPropFieldValue(EntityField), []);
end;

function TgsDataSetProxy.Next: Boolean;
begin
  FDataSet.Next;
  Result := not FDataSet.Eof;
end;

function TgsDataSetProxy.Prior: Boolean;
begin
  FDataSet.Prior;
  Result := not FDataSet.Bof;
end;

procedure TgsDataSetProxy.Update(EntityFields: array of TgsPropField;
  EntityKey: TgsPropField; Included: Boolean);
var
  i, j: Integer;
  sPropName: string;
  IsFound: Boolean;
  obj: TObject;
begin
  CheckedEditState;
  try
    try
      if not Locate(EntityKey) then
        Exit;
      FDataSet.Edit;
      //修改列举的实体字段
      if Included then
      begin
        for i := Low(EntityFields) to High(EntityFields) do
        begin
          if EntityFields[i] is TStringF then
            FDataSet[EntityFields[i].Name] := TStringF(EntityFields[i]).AsStr
          else if EntityFields[i] is TIntF then
            FDataSet[EntityFields[i].Name] := TIntF(EntityFields[i]).AsInt
          else if EntityFields[i] is TNumberF then
            FDataSet[EntityFields[i].Name] := TNumberF(EntityFields[i]).AsNum
          else if EntityFields[i] is TDateTimeF then
            FDataSet[EntityFields[i].Name] := TDateTimeF(EntityFields[i]).AsDT
          else if EntityFields[i] is TBooleanF then
            FDataSet[EntityFields[i].Name] := TBooleanF(EntityFields[i]).AsBool
        end;
      end
      else
      begin
        for i := 0 to PropCount - 1 do
        begin
          IsFound := False;
          for j := Low(EntityFields) to High(EntityFields) do
          begin
            sPropName := PropNames[i];
            if CompareText(sPropName, EntityFields[j].Name) = 0 then
            begin
              IsFound := True;
              Break;
            end;
          end;
          if IsFound then
            Continue;
          obj := GetPropObj(i);
          if obj = nil then
            Continue;

          if obj is TStringF then
            FDataSet[sPropName] := TStringF(obj).AsStr
          else if obj is TIntF then
            FDataSet[sPropName] := TIntF(obj).AsInt
          else if obj is TNumberF then
            FDataSet[sPropName] := TNumberF(obj).AsNum
          else if obj is TDateTimeF then
            FDataSet[sPropName] := TDateTimeF(obj).AsDT
          else if obj is TBooleanF then
            FDataSet[sPropName] := TBooleanF(obj).AsBool
        end;
      end;
      FDataSet.Post;
    except
      on e: Exception do
      begin
        e.Create('修改记录失败!   ' + cstWrap + e.Message);
      end;
    end;
  finally
    EndEdit;
  end;
end;


procedure TgsDataSetProxy.Update(EntityKey: TgsPropField);
var
  i: Integer;
  FieldObj: TObject;
  sFieldName: string;
begin
  CheckedEditState;
  try
    try
      if not Locate(EntityKey) then
        Exit;
      FDataSet.Edit;
      for i := 0 to PropCount - 1 do
      begin
        FieldObj := GetPropObj(i);

        sFieldName := PropNames[i];
        if FieldObj is TStringF then
          FDataSet[sFieldName] := TStringF(FieldObj).AsStr
        else if FieldObj is TIntF then
          FDataSet[sFieldName] := TIntF(FieldObj).AsInt
        else if FieldObj is TNumberF then
          FDataSet[sFieldName] := TNumberF(FieldObj).AsNum
        else if FieldObj is TDateTimeF then
          FDataSet[sFieldName] := TDateTimeF(FieldObj).AsDT
        else if FieldObj is TBooleanF then
          FDataSet[sFieldName] := TBooleanF(FieldObj).AsBool
        else if FieldObj is TBlobF then
          TBlobField(FDataSet.FieldByName(sFieldName)).LoadFromStream(TBlobF(FieldObj).AsBlob);
      end;
      FDataSet.Post;
    except
      on e: Exception do
      begin
        e.Create('修改记录失败!   ' + cstWrap + e.Message);
      end;
    end;
  finally
    EndEdit;
  end;
end;

end.

⌨️ 快捷键说明

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