次のコードを見てください:
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を書きたいです。
ありがとう。