这种情况下:不用存储过程或触发器可以动态改变表的结构吗? ( 积分: 5 )

  • 主题发起人 主题发起人 ruoxi_shuai
  • 开始时间 开始时间
R

ruoxi_shuai

Unregistered / Unconfirmed
GUEST, unregistred user!
现有一DBF数据库,一表为工资结构组成T1,另一表为工资数据组成T2,其中,T1中的一列的列值是T2的字段名,现要求T1中的数据变化时T2也随之自动变化,即T1种插入、删除、修改一条记录时,T2也会相应的插入、删除、修改与之对应的字段,该怎么办比较好,不用存储过程可以实现吗?请指教!!!
我编了如下的程序:
//删除T1种的一条记录时,其中T1对应了一DBGRID
if key = Vk_delete then
begin
flag:=messagedlg('您确定要删除当前纪录吗?',mtconfirmation,[mbyes,mbno],0);
if flag=6 then
s_delete:=adotable1.Fields[0].AsString;
with adoquery1 do //adoquery1连接T2
begin
close;
sql.Clear;
sql.Add('alter table GZSJK ');
sql.Add('drop column '+s_delete+' ascade');
ExecSQL;
end;
ADOtable1.Delete;
end;
//T1插入一条记录时,向T2中增加字段
procedure TForm_JG.DBGrid1DblClick(Sender: TObject);
var
feild_N,field_T:string;
length,point_count:integer;
begin
adotable1.Post;
feild_N:=adotable1.Fields[0].AsString;
field_T:=adotable1.Fields[2].AsString;
length:=adotable1.Fields[3].AsInteger;
point_count:=adotable1.Fields[4].AsInteger;
with adoquery1 do
begin
close;
sql.Clear;
sql.Add('alter table GZSJK ');
if field_T='C' then
begin
sql.Add('add column '+feild_N+' varchar(:a) ');
Parameters.ParamByName('a').Value := length;
end;
if field_T='N' then
begin
sql.Add('add column '+feild_N+' numeric(:c,:d)');
Parameters.ParamByName('c').Value := length;
Parameters.ParamByName('d').Value := point_count;
end;
ExecSQL;
end;
showmessage('添加记录已保存,并更新到GZSJK中!');
end;

我觉得原理上对,可运行有错,求各位提供更好的方法!
 
后退
顶部