如何在Delphi中以编程方式向TaToTable中添加字段
在我的Delphi2009应用程序中,我需要检查一个字段是否存在,以及它是否在应用程序执行期间添加它 我已计算出字段的测试,但无法获得要添加的字段。我试过这个如何在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
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的精神:)