作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
看看下面的代码:
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 语句以使代码更可用。
另一个问题是如何获取传递的枚举大小来获取字段名称,如您所见,目前我将当前枚举名称与单位名称进行比较,这是坏主意,任何人都可以帮助我吗?
至少我想开发一个类,为数据库中的每个表编写一个枚举并将其传递给我的类,我的类的方法使用它来选择、插入、编辑等。
我想编写一个微型 ORM 供我个人使用。
谢谢。
最佳答案
您可以使用新的 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;
关于delphi - 获取作为通用参数传递的枚举大小和名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13343363/
我是一名优秀的程序员,十分优秀!