如何在Delphi中以编程方式向TaToTable中添加字段

如何在Delphi中以编程方式向TaToTable中添加字段,delphi,field,ado,Delphi,Field,Ado,在我的Delphi2009应用程序中,我需要检查一个字段是否存在,以及它是否在应用程序执行期间添加它 我已计算出字段的测试,但无法获得要添加的字段。我试过这个 var fld : TStringField; begin if not ADOConnection1.Connected then ADOConnection1.Open; fld := TStringField.Create(tbl); fld.FieldName := 'test'; tbl.Fields

在我的Delphi2009应用程序中,我需要检查一个字段是否存在,以及它是否在应用程序执行期间添加它

我已计算出字段的测试,但无法获得要添加的字段。我试过这个

var
  fld : TStringField;
begin
  if not ADOConnection1.Connected then
    ADOConnection1.Open;
  fld := TStringField.Create(tbl);
  fld.FieldName := 'test';
  tbl.Fields.Add(fld);
end;
但它不起作用。

尝试设置 Field.DataSet:=表

试试这个

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

再见。

您可以使用SQL创建新字段。在我看来,这是最好的机会。 如果您不想使用SQL,您可以看到这篇文章,其中介绍了如何使用ADOX使用ADO创建新字段(原文为西班牙语,但右侧可以翻译页面) “使用ADOX在表(访问)代码中创建字段”/

如果必须知道表中的字段,则可以访问TaToTable和方法GetFiledDef。此外,如果字段点不存在,FindField方法将返回nil

此外,一些数据库/SGBD具有系统表,您可以使用SQL访问这些表,以了解现有的表、字段、索引等

请原谅我英语不好


注意。

如果表是SQL数据库的一部分,一旦检测到字段丢失,可以通过添加字段,然后重新打开表

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

如果您试图在表设计器中获得“添加所有字段”或“添加字段”菜单的功能,则可以很容易地从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;
procedure AddAllFields(数据集:TDataset);
变量
FieldsList:TStringList;
字段名:WideString;
字段:TField;
WasActive:布尔;
FieldDef:TFieldDef;
i:整数;
开始
WasActive:=DataSet.Active;
如果是活跃的话
DataSet.Active:=False;
尝试
FieldsList:=TStringList.Create;
尝试
DataSet.FieldDefs.Update;
//列出数据集中不存在的所有字段名
对于i:=0到DataSet.FieldDefList.Count-1 do
使用DataSet.FieldDefList[i]可以
如果是(FieldClass nil)而不是(属性中的faHiddenCol),则
开始
FieldName:=DataSet.FieldDefList.String[i];
字段:=DataSet.FindField(字段名);
如果(Field=nil)或(Field.Owner DataSet.Owner),则
FieldsList.Add(字段名);
结束;
//将这些字段添加到数据集
对于i:=0到FieldsList.Count-1 do
开始
FieldDef:=DataSet.FieldDefList.FieldByName(FieldName);
字段:=FieldDef.CreateField(DataSet.Owner,nil,FieldName,False);
尝试
Field.name:=FieldName+IntToStr(随机(MaxInt));//使名称唯一
除了
自由场;
提高;
结束;
结束;
最后
FieldsList.Free;
结束;
最后
如果是活跃的话
DataSet.Active:=true;
结束;
结束;

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]

ROFL!
试试看。。。随机()。。。除了
部分真正符合RAD的精神:)