我说一个最实用的方法。直接drop表,然后建立。

解决方案 »

  1.   

    Satoni的方法不行但那个了点。
      

  2.   

    你提交了没有,不会是*.DBF,DBF的还要pack一下
      

  3.   

    Access数据库就是这样的~~不管你作什么操作~~数据库的容量会越来越大的~~~
    所以程序中需要提供数据库压缩功能~~
      

  4.   

    调用Dao~~~你搜索一下以前的帖子吧~~搜索“压缩”~~
    好多的~~~
      

  5.   

    Function tmsaUtility.Compactmdb(mdbFileName:String): Boolean;
    var db : OLEVariant;
        tempFile : String;
    begin
        result := true;
        try
        screen.cursor := crSQLWait ;
        db := GetDAO_Object ;
        result := false;
        try
        tempFile := ExtractFilePath (mdbFilename) + '\msaTemp.mdb';
        db.CompactDataBase(mdbFIleName,tempFile);
        DeleteFile(mdbFileName);
        RenameFile (tempFile,mdbFileName);
        Result := true;
        Except on EOLEexception do
        Result := false;
        end
        finally
        db := Unassigned ;
        screen.cursor := crDefault ;
        end;end;随便搜索一下~~到处都是~~
      

  6.   

    别忘了Uses Dao97~~~~Function tmsaUtility.Compactmdb(mdbFileName:String): Boolean;
    var db : OLEVariant;
        tempFile : String;
    begin
        result := true;
        try
        screen.cursor := crSQLWait ;
        db:=CoDBEngine.Create;
        result := false;
        try
        tempFile := ExtractFilePath (mdbFilename) + '\msaTemp.mdb';
        db.CompactDataBase(mdbFIleName,tempFile);
        DeleteFile(mdbFileName);
        RenameFile (tempFile,mdbFileName);
        Result := true;
        Except on EOLEexception do
        Result := false;
        end
        finally
        db := Unassigned ;
        screen.cursor := crDefault ;
        end;end;那个只不过是给你一个参考~~没有必要全部照搬~~领会意思是最重要的~~
      

  7.   

    可我压缩的时候怎么总是报告ole错误??
      

  8.   

    呵呵~~不好意思~~看错了~~定义应该是这样的
    var
      db:_DBEngine;
      

  9.   

    Function tmsaUtility.Compactmdb(mdbFileName:String): Boolean;
    var db:_DBEngine; 
        tempFile : String;
      

  10.   

    我是这样写的:
    procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
    var db:_DBEngine;
       temppath:string;
       sourcedb,destdb:string;
    begin
      db:=CoDBEngine.Create;
      temppath:=Extractfilepath(application.ExeName);
      sourcedb:=temppath+'data.mdb';
      destdb:=temppath+'temp.mdb';
      db.CompactDatabase(sourcedb,destdb,'',0,'');
    end;可在关闭的时候报告OLE error 80040112:(
      

  11.   

    还有我的是Access97,不是2000的。
      

  12.   

    压缩完成以后需要删除原来的旧的数据库~~把新的数据库命名为原来的名字~~
      try
        db.CompactDatabase(SourceFileName,TargetFileName,'',0,'');
        db.FreeLocks;
      except
        Exit;
      end;
      DeleteFile(SourceFileName);
      RenameFile(TargetFileName,SourceFileName);
      

  13.   

    我跟了一下程序,在db:=CoDBEngine.Create;就报告了OLE error 80040112错误,为什么呢?
      

  14.   

    要不然试试下面的
    var
      db:DBEngine;
      temppath:string;
      sourcedb,destdb:string;
    begin
      db:=CoDBEngine.Create;
      temppath:=Extractfilepath(application.ExeName);
      sourcedb:=temppath+'data.mdb';
      destdb:=temppath+'temp.mdb';
      db.CompactDatabase(sourcedb,destdb,'',0,'');
    end;
      

  15.   

    刚才我用Access压缩那个数据库,结果从1.78M变成了246k了,可怎么就不能在程序里边实现呢:(
      

  16.   

    现在不是你的Access有问题~~就是你的Delphi有问题~~
      

  17.   

    对了~~你不是Delphi6吧?
      

  18.   

    是delphi5,在没有写压缩数据库代码前一切正常的。
      

  19.   

    就这一段~~~~其他的什么都不写~~~procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    var
      db:DBEngine;
      temppath:string;
      sourcedb,destdb:string;
    begin
      db:=CoDBEngine.Create;
      temppath:=Extractfilepath(application.ExeName);
      sourcedb:=temppath+'data.mdb';
      destdb:=temppath+'temp.mdb';
      db.CompactDatabase(sourcedb,destdb,'',0,'');
    end;
      

  20.   

    唉,什么都不写,都写上面的代码还是报告同样的错误,编译不错,运行错误。还能真的是delphi5的问题?
      

  21.   

    如果是机器问题,问题出在那儿呢?我现在编译了两个版本的exe文件,过几天看能不能找机器测试一下。
      

  22.   

    谢谢,tikkypeng(千两狂死郎)了,先给你50分,等再有问题另外再请教你了。
      

  23.   

    access 数据表清空了以后不会真正删除数据
    选择压缩数据表就可以真正的清空了
      

  24.   

    用truncate table ,不用delete from 
      

  25.   

    对了,我的ACCESS库也是这个问题,才30条主细记录,就100多兆,吓死人,
    用DELPHI可以压缩,但是不是必须要有相应的ADO动态库?这样安装程序太大了!
    谁有好办法?
    ????
      

  26.   

    是啊是啊,在ASP里怎么压缩呢?
      

  27.   

    用asp可以这样做。
    我原来打算写在线维护的。后来发现这样压缩要独占数据库的。:(
    <% Const Jet_Conn_Partial = "Provider=Microsoft.Jet.OLEDB.4.0; Data source="
    Dim strDatabase, strFolder, strFileName'################################################# 
    '# Edit the following two lines
    '# Define the full path to where your database is
    strFolder = "e:\wwwroot\2\" 
    '# Enter the name of the database
    strDatabase = "dv3sr2.mdb"
    '# Stop editing here
    '##################################################Private Sub dbCompact(strDBFileName)
    Dim SourceConn
    Dim DestConn
    Dim oJetEngine
    Dim oFSOSourceConn = Jet_Conn_Partial & strFolder & strDatabase
    DestConn = Jet_Conn_Partial & strFolder & "Temp" & strDatabaseSet oFSO = Server.CreateObject("Scripting.FileSystemObject")
    Set oJetEngine = Server.CreateObject("JRO.JetEngine")With oFSO      If Not .FileExists(strFolder & strDatabase) Then
              Response.Write ("Not Found: " & strFolder & strDatabase)
              Stop
          Else
                    If .FileExists(strFolder & "Temp" & strDatabase) Then
                          Response.Write ("Something went wrong last time " _
                          & "Deleting old database... Please try again")
                          .DeleteFile (strFolder & "Temp" & strDatabase)
                    End If
          End If
    End WithWith oJetEngine
    .CompactDatabase SourceConn, DestConn
    End WithoFSO.DeleteFile strFolder & strDatabase
    oFSO.MoveFile strFolder & "Temp" _
    & strDatabase, strFolder& strDatabaseSet oFSO = Nothing
    Set oJetEngine = Nothing
    End SubPrivate Sub dbList()
    Dim oFolders
    Set oFolders = Server.CreateObject("Scripting.FileSystemObject")
      Response.Write ("<Select Name=""DBFileName"">")
      For Each Item In oFolders.GetFolder(strFolder).Files
      If LCase(Right(Item, 4)) = ".mdb" Then
          Response.Write ("<Option Value=""" & Replace(Item, strFolder, "") _
          & """>" & Replace(Item, strFolder, "") & "</Option>")
      End If
    Next
    Response.Write ("</Select>")Set oFolders = Nothing
    End Sub
    %>
    <%
    ' Compact database and tell the user the database is optimized
    Select Case Request.form("cmd")
    Case "Compact"
    dbCompact Request.form("DBFileName")
    Response.Write ("Database " & Request.form("DBFileName") & " is optimized.")
    End Select
    %><p><font size="4">Compact and repair database</font></p>
    <form method="POST" action="">
    <p><%dbList%><input type="submit" value="Compact" name="cmd"></p>
    </form>
      

  28.   

       我觉得这种情况和SQL SERVER所采用的在多个信息页存贮有关!
       可以试试以下方法:使用TRUNCATE TABLE ,因为它是一次删除含有多个表行的多个信息页,而DELETE TABLE 语句依次只删除各个行.使用TRUNCATE TABLE删除的表行,不能恢复;她不象DELETE TABLE,不保留被删除行的备份!
      

  29.   

    同意!就用truncate table <table name>
      

  30.   

    采用datadesktop设计的数据库BDE在delphi中删除是逻辑删除,如果要物理删除需要动手术!
      

  31.   

    truncate命令
    安全又省气
    但要小心
    打错表名,哭都没办法了
    小心,功能真的很强劲