太奇怪了!!我用delphi6.0+access存储图片,后再用删除图片,比如
delete * from ok where id=3,那么id为3的这一行都已经被清空了,存储图像的字段也再这一行中.
但是为什么数据库大小没有变小呢?
于是我进入access查看,包括图片字段在内的整行已经清空了,而且也不能从数据库中读取出图片了,那为什么数据库的大小没有变小呢?清各位指教!!!

解决方案 »

  1.   

    远程连接access数据库的几个方法:  1.建立VPN(Virtual Private Network),这样你的电脑和主机的连接就与局域网无异,然后把服务器中mdb文件所在的 Folder共享即可。ADO连接如下:   oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=ServerNameDatabaseFolderDatabase.mdb;Jet OLEDB:Database Password=databasepw;Persist Security Info=False"   2.把Database放在Web Server上,使ADO或RDO通过RDS(Remote Data Service)及IIS来实现:    如果服务器像上面Jave大侠说那样设置了ODBC DSN的话:    oConn.Open "Provider=MS Remote;" & _ 
          "Remote Server=http://myServerName;" & _ 
          "Remote Provider=MSDASQL;" & _ 
          "DSN=AdvWorks;" & _ 
          "Uid=myUsername;" & _ 
          "Pwd=myPassword" 
       如果设置的是OLE DB Provider 的话:    oConn.Open "Provider=MS Remote;" & _ 
          "Remote Server=http://myServerName;" & _ 
          "Remote Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
          "Data Source=c:somepathmydb.mdb", _ 
          "admin", ""   3.自己编写服务器程序,通过TCP/IP,传递Recordset。   4.使用第三方控件,如:ADO Anywhere或UDAParts RDB等。   5.使用XMLHTTP其中有的不适合你的条件,有的不适合delphi来做。
      

  2.   

    这就是Access数据库需要压缩的原因了。Access和VFP表一样,通常做删除,只是标记为删除,实际上并示释放空间,而需要另外做压缩,才会真正释放空间。
      

  3.   

    压缩access数据库的语句:
    function TfrmMain.CompactDatabase(const AFileName, APassWord: string): Boolean;
    const
      SConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;'
        + 'Jet OLEDB:Database Password=%s;';
    var
      SPath: string;
      SFile: array[0..254] of Char;
      STempFileName: string;
      JE: OleVariant;  function GetTempDir: string;
      var
        Buffer: array[0..MAX_PATH] of Char;
      begin
        ZeroMemory(@Buffer, MAX_PATH);
        GetTempPath(MAX_PATH, Buffer);
        Result := IncludeTrailingBackslash(StrPas(Buffer));
      end;begin
      Result := False;
      SPath := GetTempDir; //取得Windows的Temp路径
      GetTempFileName(PChar(SPath), '~ACP', 0, SFile); //取得Temp文件名,Windows将自动建立0字节文件
      STempFileName := SFile; //PChar->String
      if not DeleteFile(STempFileName) then Exit; //删除Windows建立的0字节文件
      try
        JE := CreateOleObject('JRO.JetEngine'); //建立OLE对象,函数结束OLE对象超过作用域自动释放
        OleCheck(JE.CompactDatabase(Format(SConnectionString, [AFileName, APassWord]),
          Format(SConnectionString, [STempFileName, APassWord]))); //压缩数据库
        //复制并覆盖源数据库文件,如果复制失败则函数返回假,压缩成功但没有到函数的功能
        Result := CopyFile(PChar(STempFileName), PChar(AFileName), False);
        DeleteFile(STempFileName); //删除临时文件
      except
        //压缩失败
      end;
    end;