2009-07-27 2 views
1

В моем приложении Delphi 2009 мне нужно проверить, существует ли поле, и если оно не добавляет его во время выполнения приложения.Как добавить поле программно к TAdoTable в Delphi

Я вычислил тест для поля, но не могу получить поле для добавления. Я пробовал это

var 
    fld : TStringField; 
begin 
    if not ADOConnection1.Connected then 
    ADOConnection1.Open; 
    fld := TStringField.Create(tbl); 
    fld.FieldName := 'test'; 
    tbl.Fields.Add(fld); 
end; 

Но это не работает.

ответ

0

Попробуйте установить Field.DataSet: = Таблица;

3

попробовать этот

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

Вы можете создать новое поле, используя SQL. На мой взгляд, это лучший шанс. Если вы не хотите использовать SQL, вы можете увидеть эту статью для создания новых полей с ADO с использованием ADOX (оригинально на испанском, но справа вы можете перевести страницу) «Создайте поля в таблице (Access) Code, используя ADOX "original/translated

Если необходимо знать поле в таблице, вы можете получить доступ к TADOTable и методу GetFiledDef. Кроме того, метод FindField возвращает nil, если точка поля не существует.

Кроме того, некоторые базы данных/SGBD нам иметь системные таблицы, которые вы можете получить доступ с помощью SQL для таблиц знать несуществующие, поля, индексы, ...

Извините за мой плохой английский.

С уважением.

2

Если таблица является частью SQL Databse, как только вы обнаружите, что это поле отсутствует, вы можете добавить это поле через SQL, а затем снова открыть таблицу.

cmd := tAdoCommand.create; 
try 
    cmd.Connection := AdoConnection1; 
    cmd.CommandText := 'ALTER TABLE table ADD TEST nvarchar(30)'; 
    cmd.Execute; 
finally 
    cmd.Free; 
end; 
3

Если вы пытаетесь получить функциональность «добавить все поля» или «добавить поля» меню в конструкторе таблицы достаточно легко, чтобы начать с этим кодом в источнике Embarcadero и очистить его так его можно использовать вне дизайнера. Метод, с которого нужно начать, заключается в этом в DSDesign.pas: function TFieldsEditor.DoAddFields (All: Boolean): TField; Мой код для добавления всех недостающих полей заключается в следующем:

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

Greate функция работает хорошо !! только часть

 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; 

заменить FieldName на FieldsList[i]

+1

ROFL! «Попробуйте ... Случайная() ... кроме« части »действительно в духе RAD :) – mjn

 Смежные вопросы

  • Нет связанных вопросов^_^