delphi orm支持枚举类型吗?
是否支持枚举类型,或者假设它支持,如何使用枚举类型 在“Helloworld”示例中,我添加了一个简单的TGender类型:delphi orm支持枚举类型吗?,delphi,orm,Delphi,Orm,是否支持枚举类型,或者假设它支持,如何使用枚举类型 在“Helloworld”示例中,我添加了一个简单的TGender类型: type TGender = (gtMale, gtFemale); [Entity('CUSTOMERS')] TCustomer = class private FName: String; FEMail: String; FID: Integer; FCreatedAt: TDate; FADDRESS: S
type
TGender = (gtMale, gtFemale);
[Entity('CUSTOMERS')]
TCustomer = class
private
FName: String;
FEMail: String;
FID: Integer;
FCreatedAt: TDate;
FADDRESS: String;
FGender: TGender;
procedure SetADDRESS(const Value: String);
procedure SetCreatedAt(const Value: TDate);
procedure SetEMail(const Value: String);
procedure SetGender(const Value: TGender);
procedure SetID(const Value: Integer);
procedure SetName(const Value: String);
public
property ID: Integer read FID write SetID;
property Name: String read FName write SetName;
property Address: String read FADDRESS write SetADDRESS;
property EMail: String read FEMail write SetEMail;
[Column('CREATED_AT')]
property CreatedAt: TDate read FCreatedAt write SetCreatedAt;
property Gender: TGender read FGender write SetGender;
end;
对于简单的插入:
procedure SimpleInsert;
var
dormSession: TSession;
Customer: TCustomer;
begin
dormSession := TSession.CreateConfigured(
TStringReader.Create(Form1.Memo1.Lines.Text), TdormEnvironment.deDevelopment);
try
Customer := TCustomer.Create;
Customer.Name := 'Daniele Teti Inc.';
Customer.Address := 'Via Roma, 16';
Customer.EMail := 'daniele@danieleteti.it';
Customer.CreatedAt := Now;
Customer.Gender := gtMale;
dormSession.Insert(Customer);
Customer.Free;
finally
dormSession.Free;
end;
end;
结果是性别为空:
(性别定义为整数)
加载记录时,dorm报告错误:
“未知性别字段类型”查看源代码时,它似乎不存在。(至少对于SQLite适配器) 无论如何,这部分的源代码很容易理解和修改 以下是我为添加对枚举的支持所做的更改: 在
dorm.utils
中:
function TdormUtils.GetFieldType
...
else if (_PropInfo.Kind = tkEnumeration) and (_PropInfo.Name = 'Boolean') then
Result := 'boolean'
else if _PropInfo.Kind = tkEnumeration then
Result := 'integer'
...
在dorm.adapter.Sqlite3
中:
procedure TSqlite3PersistStrategy.LoadObjectFromSqliteTable(...);
var
PropTypeInfo: PTypeInfo;
...
begin
...
else if CompareText(field.FieldType, 'integer') = 0 then
begin
if (Field.RTTICache.RTTIProp <> nil) and
(Field.RTTICache.RTTIProp.PropertyType.TypeKind = tkEnumeration) then
begin
PropTypeInfo := Field.RTTICache.RTTIProp.PropertyType.Handle;
v := TValue.FromOrdinal(PropTypeInfo,
AReader.FieldAsInteger(AReader.FieldIndex[field.FieldName]));
end
else
v := AReader.FieldAsInteger(AReader.FieldIndex[field.FieldName]);
S := field.FieldName + ' as integer';
end
...
end
procedure TSqlite3PersistStrategy.SetSqlite3ParameterValue(...);
begin
...
else if CompareText(aFieldType, 'integer') = 0 then
begin
if aValue.Kind = tkEnumeration then
begin
ADB.AddParamInt(aParameterName, aValue.AsOrdinal);
GetLogger.Debug(aParameterName + ' = ' + IntToStr(aValue.AsOrdinal));
end
else
begin
ADB.AddParamInt(aParameterName, aValue.AsInteger);
GetLogger.Debug(aParameterName + ' = ' + IntToStr(aValue.AsInteger));
end;
end
...
end
过程TSqlite3PersistStrategy.LoadObjectFromSqliteTable(…);
变量
PropTypeInfo:PTypeInfo;
...
开始
...
否则,如果CompareText(field.FieldType,'integer')=0,则
开始
如果(Field.RTTICache.RTTIProp nil)和
(Field.RTTICache.RTTIProp.PropertyType.TypeKind=tkEnumeration)然后
开始
PropTypeInfo:=Field.RTTICache.RTTIProp.PropertyType.Handle;
v:=TValue.FromOrdinal(PropTypeInfo,
AReader.FieldAsInteger(AReader.FieldIndex[field.FieldName]);
结束
其他的
v:=AReader.FieldAsInteger(AReader.FieldIndex[field.FieldName]);
S:=field.FieldName+'作为整数';
结束
...
结束
过程TSqlite3PersistStrategy.SetSqlite3ParameterValue(…);
开始
...
否则,如果CompareText(aFieldType,'integer')=0,则
开始
如果aValue.Kind=tkEnumeration,则
开始
ADB.AddParamInt(aParameterName,aValue.AsOrdinal);
调试(aParameterName+'='+IntToStr(aValue.AsOrdinal));
结束
其他的
开始
ADB.AddParamInt(aParameterName,aValue.AsInteger);
调试(aParameterName+'='+IntToStr(aValue.AsInteger));
结束;
结束
...
结束
在数据库中,字段应该声明为整数。该存储库中很少提到枚举:TGender没有定义为整数类型!TGender定义为枚举类型。授权Delphi为每个枚举类型成员分配一个序号值,然后在分配或检索这些值时在内部使用该序号值。但这并不意味着它是一个整数type@SilverWarior:我的意思是在数据库中。