看看这个问题吧!对你有好处的!(100分)

  • 主题发起人 主题发起人 berg
  • 开始时间 开始时间
B

berg

Unregistered / Unconfirmed
GUEST, unregistred user!
怎么把一个数据库表中的记录全部删除(foxpro)
with query1 do
begin
close;
sql.Clear;
sql.Add('delete from 表名');
execsql;
end;
但这样我执行后,再打开表看,只是在记录上加了标记,而没有真正的把记录删除掉,
请问如何实现?
 
把delete 后面的from 去掉,执行完以后对表进行刷新看看~!
 
var
ssql:string;
begin
ssql:='delete dbo.table';
query1.sql.clear;
query1.sql.add(ssql);
query1.execsql;
ssql:=select * from dbo.table';
query1.sql.clear;
query1.sql.add (ssql);
query1.Open;
end;
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=389128
你看看这里的讨论结果吧。
 
这个问题涉及到dbf数据库记录的物理删除(pack),请打开BDE安装目录下的BDE32.hlp帮助
文件,并搜索pack这个关键字,找到BDE函数DbiPackTable,这个函数可以pack对应的表;
并参看相应的delphi示例(packtable过程),相信你可以解决这个问题了,别忘了use bde;
祝你好运!
 
把delete 后面的from 去掉,执行完以后对表进行刷新看看~!


来自:狮子王, 时间:2001-12-19 17:09:00, ID:798168
var
ssql:string;
begin
ssql:='delete dbo.table';
query1.sql.clear;
query1.sql.add(ssql);
query1.execsql;
ssql:=select * from dbo.table';
query1.sql.clear;
query1.sql.add (ssql);
query1.Open;
end;


 
to terry_lzs:
procedure PackTable(Table: TTable);
var
Props: CURProps;
hDb: hDBIDb;
begin
if not Table.Active then
raise EDatabaseError.Create('Table必需已经打开');
if not Table.Exclusive then
raise EDatabaseError.Create('Table必需以独占方式打开');
Check(DbiGetCursorProps(Table.Handle, Props));
if (Props.szTableType = szDBASE) then
Check(DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBASE, True))
else
raise EDatabaseError.Create('Table必需是dBASE或FoxPro类型');
Table.Open;
end;
我在你给我的帖子上看到的,可我不知道还用的了别的什么单元
我这样编译是不能通过的,总上提示:CURProps不可识别
 
to berg
use bde;
 
用BDE的API函数才能物理清除DBF表中的内容。
 
我用了 bde了,但还是出现我刚才说的情况
 
同意SOFTBOY的说法。FOXPRO的数据库要PACK。
 
谁能解释DbiPackTable的几个参数!
最好能有个示例,谢谢!
 
你用的是什么数据库?不如用显式事务的方式来试试:
先使用 BEGIN TRANSACTION;
然后是 你自己的SQL
最后用 commit;
 
to terry_lzs 和 softboy
能详细的讲一下dbipacktable的用法吗?
多谢了,实在是急着用!
 
用Delphi的帮助就有例子,附上:
procedure PackTable(Table: TTable);
var
Props: CURProps;
hDb: hDBIDb;
TableDesc: CRTblDesc;
begin
// Make sure the table is open exclusively so we can get the db handle...
if not Table.Active then
raise EDatabaseError.Create('Table must be opened to pack');
if not Table.Exclusive then

raise EDatabaseError.Create('Table must be opened exclusively to pack');

// Get the table properties to determine table type...
Check(DbiGetCursorProps(Table.Handle, Props));

// If the table is a Paradox table, you must call DbiDoRestructure...
if Props.szTableType = szPARADOX then begin
// Blank out the structure...
FillChar(TableDesc, sizeof(TableDesc), 0);
// Get the database handle from the table's cursor handle...

Check(DbiGetObjFromObj(hDBIObj(Table.Handle), objDATABASE, hDBIObj(hDb)));
// Put the table name in the table descriptor...
StrPCopy(TableDesc.szTblName, Table.TableName);
// Put the table type in the table descriptor...
StrPCopy(TableDesc.szTblType, Props.szTableType);
// Set the Pack option in the table descriptor to TRUE...
TableDesc.bPack := True;
// Close the table so the restructure can complete...
Table.Close;
// Call DbiDoRestructure...

Check(DbiDoRestructure(hDb, 1, @TableDesc, nil, nil, nil, False));
end
else
// If the table is a dBASE table, simply call DbiPackTable...
if (Props.szTableType = szDBASE) then
Check(DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBASE, True))
else
// Pack only works on PAradox or dBASE; nothing else...
raise EDatabaseError.Create('Table must be either of Paradox or dBASE ' +

'type to pack');

Table.Open;

end;
 
我是用了帮助上的例子,并在我的单元中引入了bde单元,
但编译时不能通过,提示CURProps,hDBIDb为不可识别的字符
我不知道除了引用bde单元外还要引用别的什么单元
 
我编译没有问题,我的全部使用单元如下。
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBTables, StdCtrls, BDE;
 
SoftBoy:要是使用ADO呢?
 
to jiangxiancheng 再麻烦你讲解一下
我用的是vfp,那么当我设置table1.tabletype为ttfoxpro,ttdbase,ttparadox时
都会出现异常(提示:'Table must be either of Paradox or dBASE type to pack')
是什么原因呢?我该把tabletype设置为什么呢?
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部