2012-12-25 108 views
1

在以下過程中,通過與Delphi XE3中的SQLite數據庫連接的常規組件,我對數據庫執行SQL查詢,其中包含來自不同表的相同名稱的字段。然後,我向這個領域通過別名訪問表字段

procedure CreationListOfFields(SQLConn: TSQLConnection; DBSchema : TDBSchemaSpec); 
var 
    NameField : TField; 
    PositionField : TField; 
    DescriptionField : TField; 
    CanInputField : TField; 
    CanEditField : TField; 
    ShowInGridField : TField; 
    ShowInDetailsField : TField; 
    IsMeanField : TField; 
    AutocalculatedField : TField; 
    RequiredField : TField; 
    Name1 : TField; 
    Name2 : TField; 
begin 
    SQLConn.Execute('select f.id, f.position, f.name, f.description, f.can_input, ' 
    +' f.can_edit, f.show_in_grid, f.show_in_details, f.is_mean, f.autocalculated, f.required, tables.name tablename, domains.name domainname' 
    +' from fields f left join tables on f.table_id=tables.id ' 
    +' left join domains on f.domain_id=domains.id order by tables.name, domains.name ', nil, results); 
    if not results.IsEmpty then 
     begin 
     results.First; 
     Name1:=results.FieldByName('tablename'); 
     Name2:=results.FieldByName('domainname'); 
     lastTable:=Name1.AsString; 
     TableSpec:=TTableSpec(DBSchema.Tables.FindComponent(lastTable)); 
     lastDomain:=Name2.AsString; 
     DomainSpec:=TDomainSpec(DBSchema.Domains.FindComponent(lastDomain)); 
     NameField:=results.FieldByName('name'); 
     PositionField:=results.FieldByName('position'); 
     DescriptionField:=results.FieldByName('description'); 
     CanInputField:=results.FieldByName('can_input'); 
     CanEditField:=results.FieldByName('can_edit'); 
     ShowInGridField:=results.FieldByName('show_in_grid'); 
     ShowInDetailsField:=results.FieldByName('show_in_details'); 
     IsMeanField:=results.FieldByName('is_mean'); 
     AutocalculatedField:=results.FieldByName('autocalculated'); 
     RequiredField:=results.FieldByName('required'); 
     while not results.Eof do 
      begin 
      if (Name1.AsString<>lastTable) then 
      begin 
       lastTable:=Name1.AsString; 
       TableSpec:=TTableSpec(DBSchema.Tables.FindComponent(lastTable)); 
      end; 
      if (Name2.AsString<>lastDomain) then 
      begin 
       lastDomain:=Name2.AsString; 
       DomainSpec:=TDomainSpec(DBSchema.Domains.FindComponent(lastDomain)); 
      end; 
      FieldSpec:=TFieldSpec.Create(TableSpec.Fields); 
      FieldSpec.Setup(DomainSpec, PositionField.AsInteger, 
      NameField.AsString, DescriptionField.AsString, 
      FieldToBoolean(CanInputField),FieldToBoolean(CanEditField), 
      FieldToBoolean(ShowInGridField), FieldToBoolean(ShowInDetailsField), 
      FieldToBoolean(IsMeanField),FieldToBoolean(AutocalculatedField), 
      FieldToBoolean(RequiredField)); 
      TComponent(FieldSpec).Name:=NameField.AsString; 
      TableSpec.Fields.InsertComponent(FieldSpec); 
      results.Next; 
      end; 
     end; 
end; 

但是用這種方法,結果我收到字段「表名」未找到消息的電話。如何解決重複名稱沒有問題的字段? ('name_1'和'name _2'沒有辦法,當調試時我發現合適的值爲空,因此我有一個問題Access violation at address 00822135 in module 'GUI.exe'.Read of address 00000040)。

+0

是*數據庫返回什麼*實際字段名稱? 'results.Fields [11] .FieldName'? –

+0

什麼顯示對ShowMessage的調用(results.Fields [11] .FieldName);就在你的結果之前。呼叫(這是不需要的)? – jachguate

回答

1

你有一個錯字(tablemame而不是表名):

[...], f.autocalculated, f.required, tables.name table->m<-ame, domains.name domainname' 
+' from fields f left join tables on f.table_id=tables.id ' [...] 
+0

我糾正了印刷錯誤,但錯誤沒有消失。 – user1851132

+0

@DavidHeffernan我糾正了印刷錯誤,但錯誤沒有消失。 – user1851132

+0

我糾正了印刷錯誤,但錯誤沒有消失@Pharaoh。 – user1851132