如何用Delphi编程实现增加、插入和删除物理字段(表的重构)?(100分)

  • 主题发起人 主题发起人 dry
  • 开始时间 开始时间
D

dry

Unregistered / Unconfirmed
GUEST, unregistred user!
请问:
如何用Delphi编程实现类似Database Desktop对数据库表进行重构的功能?
 
天哪。你想干么。不是重写DataBase DeskTop?
可看BDE HELP 。如DBIDeleteTable,dbiAppendRecord,dbiDeleteRecord,
etc.
即所有DBI。。。的函数。
 
非也!!非也!! 我并不想重写DataBase DeskTop
但我使用DbiDoRestructure函数却只能删除最后一个字段,不知为何?
(程序如下:)
后来,我用SQL语句实现了删除任意一字段。但SQL不能实现Paradox数据库的一些
细节(如:增加缺省值等),并且我用SQL语句能做到增加字段,却不能插入字段。
按BDE HELP说 DbiDoRestructure能实现这些功能,她的例子程序也比较有用,但
我按她的例子做,却为何不能实现插入字段和删除任意一字段,请指教。。。
另外,有什么控件能实现这些功能,也可告诉我!!!
谢谢!!!
procedure TForm1.Button3Click(Sender: TObject);
var
TblDesc:CRTblDesc;
a_p,AddOp:pCROpType;
i:integer;
pp,myFldDesc:pFLDDesc;
Props:CURProps;
t_name:pchar;
hDB:hDBIDb;
begin
t_name:=allocmem(20);
strpcopy(t_name,Table1.TableName);
check(dbisetProp(hdbiobj(table1.Handle),curxltMODE,integer(xltNONE)));
check(DbiGetCursorProps(Table1.Handle, Props));
myFldDesc := Allocmem(Props.iFields * sizeof(FLDDesc));
check(DbiGetFieldDescs(table1.Handle, myFldDesc));
pp:=myFldDesc;
AddOp := allocmem(Props.iFields * sizeof(CROpType));
a_p:=Addop;
fillchar(Addop^,Props.iFields * sizeof(CROpType),crNOOP);
inc(Addop, Listbox1.ItemIndex);
Addop^:=crDROP;
addop:=a_p;
myFldDesc:=pp;
i:=1;
while(i<=props.iFields) do begin
if Addop^=crDROP then begin
myFldDesc^.iFldNum:=Props.iFields+1;
end
else
begin
myFldDesc^.iFldNum:=i;
end;
inc(i);
inc(myFldDesc);
inc(Addop);
end;
fillchar(TblDesc,sizeof(TblDesc),#0);
strcopy(TblDesc.szTblName, t_Name);
strcopy(TblDesc.szTblType, props.szTableType);
TblDesc.bPack:=TRUE;
TblDesc.iFldCount := Props.iFields-1 ;
TblDesc.pecrFldOp := A_p;
TblDesc.pfldDesc := pp;
check(dbigetobjfromobj(hdbiobj(table1.Handle),objdatabase,hdbiobj(hDb)));
table1.close;
DbiDoRestructure(hDb, 1, @TblDesc,nil, nil, nil, FALSE);
table1.open;
freemem(a_p,Props.iFields * sizeof(FLDDesc));
freemem(t_name,20);
freemem(pp,Props.iFields * sizeof(FLDDesc));
end
 
追踪一下:
while(i<=props.iFields) do begin
if Addop^=crDROP then begin
。。。。

看各个域顺序对否,你的域插入了吗。
 
我跟踪了好几遍,似乎并没有错,还是只能删除最后一个字段???
要不,我把一小段实验程序寄给你
 
以下一个程序你参考一下,不是用BDE做的。

  procedureZldcreateTable;

  var

  zldT:TTable;

  begin

  zldT:ΚTTable.Create(Self);

  withzldTdo

  begin

  DatabaseName:Κ'DBDEMOS';{预定义的别名数
据库工作区名}

  TableName:Κ'ZLDDBASE';{将定义的数据库名


  TableType:ΚttDbase;{数据库类型,可为ttPara
dox、ttASCII、ttDbase}

  withFieldDefsdo{数据库结构信息}

  begin

  Clear;

  Add('ZLS',ftInteger,0,false);

  Add('ZLD',ftBoolean,0,false);

  Add('ZEZ',ftString,10,false);

  Add('XL',ftDate,0,false);

  {....}

  end;

  withIndexDefsdo{索引文件信息}

  begin

  Clear;

  Add('Primary','ZEZ',[ixPrimary,ixU?n
ique]);

  {....}

  end;

  CreateTable;

  end;

  end;

  通过以上方法建立数据库,如果已经存在同名数据库
,将被覆盖,数据将全部丢失。

  当修改一个数据库的结构时,也可以利用TTable的方
法CreateTable。先打开欲修改的数据库,取得该数据库
的结构信息,再对其修改,然后用修改后的结构信息重新
建立一个新数据库,再将原数据库中相同的列写入新数据
库中,删除原数据库,改新数据库名为原数据库名即可。
 
我试过,这样做,完整性校验(Validity Check)等,无法通过这方法复制。
 
我给你发了一个控件了,你收一下。它可以删除叙任一字
段,并能增加字段,但没有校验的增加。BDE中的此例子
 
我收到了信件,并回了一封,内有祥述
 
why do not use altertable? But if you use this the sql statement
must be differrent with each DBMS
 
Hi...你等于没有回答我的问题...
我能用SQL语句实现了删除任意一字段。但SQL不能实现Paradox数据库的一些
细节(如:增加缺省值等),并且我用SQL语句能做到增加字段,却不能插入字段.
不过,我不明白的是为何我用DbiDoRestructure却不能做到插入字段和删除任意
一字段?(那一小段程序在以前的讨论中有)

 
dry和各位大虾,还有什么意见?
 
物理字段能删除?呵呵,我倒要领教领教了,
重构用 ALTER DATABASE
YIFENG:这问题改结束了吧
 
比较有挑战性,看来必须用BDE API来完成,
因为一些完整性校验(Validity Check)等,无法通过TTable和
Tssesion实现复制.
 哪位再试试? 
 
多人接受答案了。
 
后退
顶部