在程序中如何修改表的一个字段?(100分)

  • 主题发起人 主题发起人 wrs
  • 开始时间 开始时间
W

wrs

Unregistered / Unconfirmed
GUEST, unregistred user!
在程序中如何修改表的一个字段?包括删除和增加,修改。
 
我以前答过此问题,
你要使用BDE的API函数 DbiDoRestructure
请参阅他的帮助文件里面有Delphi的例子
删除,增加,和修改.
不过限于Paradox,Dbase库.
 
能不有具体点,最好有源程序
 
我的观点是,保存旧表,创建新表,从旧表读入数据,删除旧表. 这种方法通用,但效率
可能就不敢说了. 考虑到修改数据表结构的情况不是经常出现的操作, 还是可以接
受的.
 
1.用SQL建表后后添加数据
2.用TABLE1.fieldsdef..参看已答问题
 
修改本地数据库rss的方法最直接
像SQL Server,Sybase等大型数据库最好
在用存储过程来修改,这样还有一个好处就是
您可以方便的把软件移植到其它的开发工具中

 
对paradox的库有好的办法可以实现字段的动态修改吗???
越简单越好。
 
没人肯贴出个程序来吗???
 
以下是SQLSERVER的例子:
card表结构如下:
ID int NOT NULL IDENTITY (1, 1),
card_start char(17) NULL,
card_end char(17) NULL,
flag char(1) NULL
要把card_start 和card_end改为16。
语句如下:
begin
TRANSACTION //开始事务
SET QUOTED_IDENTIFIER ON
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
GO
COMMIT
begin
TRANSACTION
CREATE TABLE dbo.Tmp_card
(
ID int NOT NULL IDENTITY (1, 1),
card_start char(16) NULL,
card_end char(16) NULL,
flag char(1) NULL
) ON "default"
GO //建新表
SET IDENTITY_INSERT dbo.Tmp_card ON //设自增字段不自增
GO
IF EXISTS(SELECT * FROM dbo.card)
EXEC('INSERT INTO dbo.Tmp_card(ID, card_start, card_end, flag)
SELECT ID, card_start, card_end, flag FROM dbo.card TABLOCKX')
GO //复制表内容
SET IDENTITY_INSERT dbo.Tmp_card OFF //自增有效
GO
DROP TABLE dbo.card //删除老表
GO
EXECUTE sp_rename 'dbo.Tmp_card', 'card' //命名
GO
COMMIT //执行事务
 
procedure fDbiDoRestructure(Tbl: TTable;
Field: TField;
MinVal, MaxVal, DefVal: pLongint;
Required: Bool);
var
hDb: hDbiDb;
TblDesc: CRTblDesc;
VChk: pVChkDesc;
Dir: String;
NumVChks: Word;
OpType: CROpType;
begin
NumVChks := 0;
SetLength(Dir, dbiMaxNameLen + 1);
Check(DbiGetDirectory(Tbl.DBHandle, False, PChar(Dir)));
SetLength(Dir, StrLen(PChar(Dir)));
VChk := AllocMem(sizeof(VChkDesc));
try
FillChar(TblDesc, sizeof(CRTblDesc), #0);
VChk.iFldNum := Field.Index + 1;
Tbl.DisableControls;
Tbl.Close;
Check(DbiOpenDatabase(nil, nil, dbiReadWrite, dbiOpenExcl, nil, 0, nil, nil, hDb));
Check(DbiSetDirectory(hDb, PChar(Dir)));
with VChk^do
begin
bRequired := Required;
if MinVal <> nil then
begin
Inc(NumVChks);
bHasMinVal := True;
move(MinVal^, aMinVal, sizeof(MinVal^));
end
else
bHasMinVal := False;
if MaxVal <> nil then

begin
Inc(NumVChks);
bHasMaxVal := True;
move(MaxVal^, aMaxVal, sizeof(MaxVal^));
end
else
bHasMaxVal := False;
if DefVal <> nil then
begin
Inc(NumVChks);
bHasDefVal := True;
move(DefVal^, aDefVal, sizeof(DefVal^));
end
else
bHasDefVal := False;
end;
TblDesc.iValChkCount := NumVChks;
TblDesc.pVChkDesc := VChk;
OpType := crADD;
TblDesc.pecrValChkOp := @OpType;
StrPCopy(TblDesc.szTblName, Tbl.TableName);
StrCopy(TblDesc.szTblType, szParadox);
Check(DbiDoRestructure(hDb, 1, @TblDesc, nil, nil, nil, False));
finally
Check(DbiCloseDatabase(hDb));
FreeMem(VChk, sizeof(VChkDesc));
Tbl.EnableControls;
Tbl.Open;
end;
end;
 
wrs, 你想捣乱吗?
 
是不是wrs=www?
 
后退
顶部