3

次のコードを見てください:

uses
  TypInfo, Dialogs, Classes, Generics.Collections, ADODB, DB, SysUtils;

type
  TTable_1 = (ID, FName, LName, FatherName);

type
  TBaseTable<TableType> = class(TADOQuery)
  public
    constructor Create(AOwner: TComponent); Override;
    procedure Select(DS: TDataSource);
  end;

implementation

{ TBaseTable<TableType> }

constructor TBaseTable<TableType>.Create(AOwner: TComponent);
begin
  inherited;
  Self.Connection := DataModule3.ADOConnection1;
  Self.Connection.Connected := True;
end;

procedure TBaseTable<TableType>.Select(DS: TDataSource);
var
  Query: string;
  EnumIndex: Byte;
begin
  EnumIndex := 0;
  Query := 'SELECT ';
  while (GetEnumName(TypeInfo(TableType), EnumIndex) <> UnitName) do
  begin
    Query := Query + GetEnumName(TypeInfo(TableType), EnumIndex) + ',';
    Inc(EnumIndex);
  end;
  Query := Copy(Query, 0, Length(Query) - 1);
  Query := Query + ' FROM Table_1';
  Close;
  SQL.Text := Query;
  Open;
  DS.DataSet := Self;
end;

私はそれを次のように使用します:

var
  Test: TBaseTable<TTable_1>;
begin
  Test := TBaseTable<TTable_1>.Create(Self);
  Test.Select(DataSource1);
end;

ご覧のとおり、クエリ内のテーブルの名前を静的文字列('Table_1')として記述します。列挙型の名前を取得し、それをテーブル名としてselectステートメントに渡して、コードをより使いやすくしたいと思います。

もう1つの質問は、渡された列挙型サイズを取得してフィールド名を取得する方法です。現在、現在の列挙型名をユニット名と比較していることがわかります。これは悪い考えです。誰かが私を助けてくれますか?

少なくとも、クラスを開発し、データベース内のテーブルごとに列挙型を記述してクラスに渡し、クラスのメソッドがそれを使用して選択、挿入、編集などを行います。

個人的な使用のためにマイクロORMを書きたいです。

ありがとう。

4

1 に答える 1

6

新しいSystem.RTTIユニットを使用できます。

function TBaseTable<TableType>.Select: string;
var
  EnumIndex: Byte;
  Context: TRttiContext;
  TableTypeRtti: TRttiEnumerationType;
begin
  Context := TRttiContext.Create;
  try
    TableTypeRtti := Context.GetType(TypeInfo(TableType)) as TRttiEnumerationType;
    Result := 'SELECT ';
    for EnumIndex := TableTypeRtti.MinValue to TableTypeRtti.MaxValue do begin
      Result := Result + GetEnumName(TypeInfo(TableType), EnumIndex) + ',';
    end;
    Result := Copy(Result, 0, Length(Result) - 1);
    Result := Result + ' FROM ' + TableTypeRtti.Name;
  finally
    Context.Free;
  end;
end;
于 2012-11-12T12:41:30.263 に答える