How to add a field programatically to a TAdoTable in Delphi

后端 未结 6 728
无人及你
无人及你 2021-01-16 10:48

In my Delphi 2009 application I need to check if a field exists and if it doesn\'t add it during application execution.

I have figured out the test for the field,

相关标签:
6条回答
  • 2021-01-16 11:26

    If the table is part of a SQL Databse, once you detect that the field is missing you can add the field via SQL, then re-open the table.

    cmd := tAdoCommand.create;
    try
      cmd.Connection := AdoConnection1;
      cmd.CommandText := 'ALTER TABLE table ADD TEST nvarchar(30)';
      cmd.Execute;
    finally
      cmd.Free;
    end; 
    
    0 讨论(0)
  • 2021-01-16 11:28

    Greate function works well!! just the part

         for i := 0 to FieldsList.Count - 1 do
         begin
            FieldDef := DataSet.FieldDefList.FieldByName(FieldName);
            Field := FieldDef.CreateField(DataSet.Owner, nil, FieldName, False);
            try
               Field.name := FieldName + IntToStr(random(MaxInt)); // make the name unique
            except
               Field.Free;
               raise ;
            end;
         end;
    

    replace FieldName by FieldsList[i]

    0 讨论(0)
  • 2021-01-16 11:32

    You can create new field using SQL. In my opinion is the best chance. If you don't want use SQL you can see this article for create new fields with ADO using ADOX (originaly in Spanish but at right you can translate the page) "Create fields in a table (Access) Code, using ADOX" original/translated

    If must know the field in a table you can access the TADOTable and the method GetFiledDef. Additionaly the method FindField return nil if the field dot not exist.

    Additionally some Databases/SGBD's have system tables that you can access with an SQL for know Existent Tables,Fields,Indexes,...

    Excuse for my bad english.

    Regards.

    0 讨论(0)
  • 2021-01-16 11:39

    Try set Field.DataSet:= Table;

    0 讨论(0)
  • 2021-01-16 11:40

    If you're trying to get the functionality of the "add all fields" or "add fields" menu in the table designer it's easy enough to start with that code in the Embarcadero source and clean it up so it's usable outside the designer. The method to start with is this one in DSDesign.pas: function TFieldsEditor.DoAddFields(All: Boolean): TField; My code for adding all missing fields is this:

    procedure AddAllFields(DataSet: TDataset);
    var
       FieldsList: TStringList;
       FieldName: WideString;
       Field: TField;
       WasActive: boolean;
       FieldDef: TFieldDef;
       i: Integer;
    begin
       WasActive := DataSet.Active;
       if WasActive then
          DataSet.Active := False;
       try
          FieldsList := TStringList.Create;
          try
             DataSet.FieldDefs.Update;
    
             // make a list of all the field names that aren't already on the DataSet
             for i := 0 to DataSet.FieldDefList.Count - 1 do
                with DataSet.FieldDefList[i] do
                   if (FieldClass <> nil) and not(faHiddenCol in Attributes) then
                   begin
                      FieldName := DataSet.FieldDefList.Strings[i];
                      Field := DataSet.FindField(FieldName);
                      if (Field = nil) or (Field.Owner <> DataSet.Owner) then
                         FieldsList.Add(FieldName);
                   end;
    
             // add those fields to the dataset
             for i := 0 to FieldsList.Count - 1 do
             begin
                FieldDef := DataSet.FieldDefList.FieldByName(FieldName);
                Field := FieldDef.CreateField(DataSet.Owner, nil, FieldName, False);
                try
                   Field.name := FieldName + IntToStr(random(MaxInt)); // make the name unique
                except
                   Field.Free;
                   raise ;
                end;
             end;
          finally
             FieldsList.Free;
          end;
       finally
          if WasActive then
             DataSet.Active := true;
       end;
    end;
    
    0 讨论(0)
  • 2021-01-16 11:41

    try this

     fld:= TStringField.Create(tbl);
        fld.FieldName := 'test';
        fld.DisplayLabel := 'test';
        fld.name := 'test';
        fld.DataSet := tbl;
        fld.Size := 30;
        tbl.Fields.Add(fld);
    

    Bye.

    0 讨论(0)
提交回复
热议问题