Вопрос по field, delphi, ado – Как программно добавить поле в таблицу TAdoTable в Delphi

1

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

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

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

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

Ваш Ответ

5   ответов
0

используя SQL. На мой взгляд это лучший шанс. Если вы не хотите использовать SQL, вы можете ознакомиться с этой статьей для создания новых полей с помощью ADO с использованием ADOX (первоначально на испанском, но справа вы можете перевести страницу) "Create fields in a table (Access) Code, using ADOX" оригинал/переведенный

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

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

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

С уважением.

2

как только вы обнаружите, что поле отсутствует, вы можете добавить поле с помощьюSQLзатем снова откройте стол.

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

добавьте все поля & quot; или "добавить поля" Меню в конструкторе таблиц достаточно легко начать с этого кода в исходном коде 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;
3

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

До свидания.

0

     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]

ROFL!try ... Random() ... except часть действительно в духе RAD :)

Похожие вопросы