~~~~~~~~~~~!!Help!!在Deiphi里如何物理删除Access数据库里的记录???(急用!晚上在线等待!) (100分)

  • 主题发起人 unclymouse
  • 开始时间
U

unclymouse

Unregistered / Unconfirmed
GUEST, unregistred user!
[blue][:(!]在Deiphi里如何物理删除Access数据库里的记录??
比如我有10条记录!ID是从1。。10
现在删除这10条记录之后,我再添加10条记录后新的记录ID就从11。。20啦
我想让新的记录ID变成1。。10。可以做的到吗??????
请各位大虾指点!![/blue]
 
何为物理删除???????????????
 
物理删除?那也还有逻辑删除了,我实在不明白?
 
删除记录后再压缩一下数据库不就行了。
 
懒虫007:
对不起,在ACCESS里我知道用压缩就可以物理删除,但是在DELPHI如何用
语句去控制物理删除呢?急!~~~~~~~~~~~~~~~~~~~~~~~~~~~````````
 
我也在关注这个问题。知道的就快说啊。
 
在DELPHI中没有办法,听都没听说过

http://www.delphibbs.com/delphibbs/dispq.asp?lid=1268352
这里是压缩的代码
 
这是在网上找到的一个例子,我没有试过,你试试看,如果不行的话再联系。
function CompactMdb(const sDBName:string):Boolean;
const sProvider = Provider='Microsoft.Jet.OLEDB.4.0;';

var oJetEng: JetEngine;
sOldMdb, sNewMdb,sTempfile: string;
begin
  ReSult:=True;
  sTempFile:=ExtractFilePath(sDBname)+Temp.mdb;
 sOldMdb := sProvider + Data Source=' + sDBName+';'
 + Jet OLEDB:Database Password=HeQing;'
 +Jet OLEDB:Engine Type=4;//access97
;//Jet OLEDB:Engine Type=5//acces2000
 sNewMdb := sProvider + Data Source=' + sTempFile+';'
+ Jet OLEDB:Database Password=XXXXX;'
  +Jet OLEDB:Engine Type=4;//access97
//Jet OLEDB:Engine Type=5 accees2000
 try
  try
    oJetEng := CoJetEngine.Create;
    oJetEng.CompactDatabase(sOldMdb, sNewMdb);
  if FileExists(sTempFile) then
  begin
    CopyFile(Pchar(sTempFile),PChar(sDBName),False);
    DeleteFile(sTempFile);
  end;
  except
    on E: Exception do
    ReSult:=False;
  end
  finally
  oJetEng := nil;
end;
end;

由于D6版本和ado的不同,也许编译不能通过,可以将不能通过的内容删除;
 
懒虫007:
呵呵。。。是不是我每在delphi里删除一条记录都要调用这段程序才能物理删除啊??
嘿嘿。。。有没有简单的方法啊??谢谢
 
另存为!
 
压缩Access

procedure TForm1.Button1Click(Sender: TObject);
var
dao:OLEVariant;
begin
// ADOTable1.Close;//压缩是以独占方式进行的;压缩前要关闭数据库连接。
// screen.Cursor:=crHourGlass;
dao:=CreateOleObject('DAO.DBEngine.36');//access2000要用dao3.6,在access97上用35和36都可以
dao.CompactDatabase('1.mdb','temp.mdb');
DeleteFile('4.mdb');
RenameFile('temp.mdb','4.mdb');
// adoconnection1.Open;
// adotable1.Active:=true;
// screen.Cursor:=crDefault;
Showmessage('本地数据库压缩完成');
 
看来没有别的方法了,因为DELPHI本身就不支持就一个功能。只能调用DAO或ADO来完成。
不好意思,我也没做过。
 
jsxjd:
我现在DELPHI里面用DELETE命令:每逻辑删除一条记录就想物理删除
有没有别的方法呢?
 
:懒虫007
谢谢!那你能不能告诉我一个方法,在ACCESS里面有没有可以对自动编号重新排序
的设置?我每次在删除一条记录之后,他的记录ID都不是从头开始,而是从上次删除的记录
的记录ID递增???
比如我有10条记录!记录号是从1。。10
删除这10条记录之后!我在加10条记录他就从11。。20啦
我想让他再从1。。10可以做的到吗??????
 
这个恐怕在ACCESS里面都不能够完成吧。
 
懒虫007:
比如我有10条记录!ID是从1。。10
现在删除这10条记录之后,我再添加10条记录之后新的记录ID就变成从11。。20啦
但是我想让新的记录ID变成1。。10。(因为前10个数据已经删了噻)
我是想在DELPHI里去用命令来实现的。可以不??
 
ID是自动的,就没法了!
 
不用自增的类型,自己写个增加ID的函数
供参考
Function ADO_AddID(ConnectionName:TADOConnection;TblName,IDFldName:String):Longword;
var
ID:Longword;
LastID:Longword;
tblInsert:TAdoTable;
begin
tblInsert:=TAdoTable.Create(nil);
with tblInsert do
try
if Active then Close;
Connection:=ConnectionName;
TableName:=TblName;
Open;
with tblInsert do
begin
last;
LastID:=0;
if FieldByName(IDFldName).AsInteger>0 then
LastID:=FieldByName(IDFldName).AsInteger
else
LastID:=0;
end;

Inc(LastID);
Close;
finally
Free;
end;
ID:=LastID;

Result:=ID;
end;
 
顶部