2010-06-28 29 views
5

Tôi đang cố gắng tạo một VBScript nhỏ để biên dịch một tệp cơ sở dữ liệu MS Access 2007.Tại sao tôi không thể sử dụng "CompactDatabase" trong DAO.DBEngine.36 bằng VBscript?

Mã tôi có là:

Set acc2007 = CreateObject("DAO.DBEngine.36") 
acc2007.CompactDatabase "C:\test.accdb", "C:\test2.accdb", Nothing, Nothing, ";pwd=test" 
Set acc2007 = Nothing

Tôi nhận được lỗi này khi tôi chạy ba dòng với "test.vbs cscript" từ 32-bit cmd.exe:

C: \ test.vbs (10, 1) DAO.DbEngine: Định dạng cơ sở dữ liệu không được nhận dạng 'C: \ test.accdb'.

Cơ sở dữ liệu được tạo bằng MS Access 2007, khi tôi mở bằng cách bấm đúp vào biểu tượng tôi nhập mật khẩu "kiểm tra" và sau đó tôi mở bình thường. Nó nói "Access 2007" ở phía trên để nó có định dạng đúng.

Dưới đây là tài liệu hướng dẫn của hàm Tôi đang cố gắng để sử dụng: http://msdn.microsoft.com/en-us/library/bb220986.aspx

Đối tượng DAO.DBEngine.36 được tạo thành công kể từ khi tôi không nhận được bất kỳ lỗi nào trên dòng đó. Điều gì có thể sai?

+1

Đó là lý do tại sao bạn nên kiểm tra mã cho tệp .ldb (tệp khóa) trước và chỉ tiếp tục nếu không tìm thấy. – Fionnuala

+0

Tôi có thể sống hạnh phúc với điều đó. =) Chúc mừng. – Mike

Trả lời

6

DAO 3.6 không hỗ trợ định dạng cơ sở dữ liệu ACCDB mới. Hãy thử DAO.DBEngine.120 để thay thế.

Dưới đây là ví dụ hoạt động trên hệ thống của tôi.

Dim objFSO 
Dim objEngine 
Dim strLckFile 
Dim strSrcName 
Dim strDstName 
Dim strPassword 

strLckFile = "C:\Access\webforums\foo.laccdb" 
strSrcName = "C:\Access\webforums\foo.accdb" 
strDstName = "C:\Access\webforums\compacted.accdb" 
strBackup = "C:\Access\webforums\foobackup.accdb" 
strPassword = "foo" 

Set objEngine = CreateObject("DAO.DBEngine.120") 

Set objFSO = CreateObject("Scripting.FileSystemObject") 
If Not (objFSO.FileExists(strLckFile)) Then 
    If (objFSO.FileExists(strBackup)) Then 
     objFSO.DeleteFile strBackup 
    End If 
    If (objFSO.FileExists(strDstName)) Then 
     objFSO.DeleteFile strDstName 
    End If 
    objFSO.CopyFile strSrcName, strBackup 

    ''dbVersion120 = 128 
    objEngine.CompactDatabase strSrcName, strDstName, , 128, ";pwd=" & strPassword 

    objFSO.DeleteFile strSrcName 
    objFSO.MoveFile strDstName, strSrcName 
End If 'LckFile 

Note: Tôi quyết định làm một bản sao lưu cơ sở dữ liệu của tôi trước khi nhỏ gọn. Cuối cùng, tôi xóa cơ sở dữ liệu gốc (chưa được biên dịch) và đổi tên cơ sở dữ liệu đã được nén thành tên gốc. Nếu bạn không quan tâm đến điều đó, bạn có thể đơn giản hóa điều này bằng cách loại bỏ các công cụ objFSO.

Chỉnh sửa: Đã sửa đổi để kiểm tra tệp khóa; nếu không tìm thấy gì cả.

+0

Tôi có thể hôn bạn, mặc dù tôi sẽ giải quyết bằng cách bắt tay bạn. :) Cảm ơn bạn rất nhiều, công trình này! Cơ sở dữ liệu Access 2007 được nén thành công và không thay đổi định dạng sang cơ sở dữ liệu Access trước đó (như nó sẽ với các phương thức khác), và nó cũng sửa chữa cơ sở dữ liệu với trạng thái không nhất quán!Đối với bất cứ ai mà đọc điều này nhưng không làm cho nó hoạt động: Nếu bạn đang ở trên một Windows 64bit, hãy nhớ chạy tập lệnh thông qua một cmd 32bit (được tìm thấy trong SysWOW64). Cảm ơn bạn một lần nữa HansUp, điều này không thể hữu ích hơn. – Mike

3

Lệnh trên sẽ không làm việc cho Access 2007 và 2010.

Trong khi tất cả các phiên bản của Windows sẽ trở lại năm 2000, và có lẽ ngay cả Windows 98, tàu với một bản sao của động cơ phản lực, cho Access 2007 và xa hơn nữa , nếu bạn đang sử dụng định dạng MỚI (accdb), thì bạn cần phải sử dụng phiên bản mới của động cơ phản lực gọi là ACE. Lưu ý rằng công cụ dữ liệu này KHÔNG được cài đặt mặc định trên Windows, vì vậy bạn phải tải xuống từ Microsoft.

Tất nhiên giả sử bạn đã cài đặt Access 2007, sau đó bạn CÓ động cơ phản lực mới (ACE) và bạn KHÔNG cần tải xuống và cài đặt phần mềm được đề cập ở trên.

Tên đối tượng mới bạn cần là DAO.DBEngine.120, vì vậy thay đổi mã của bạn để:

Set acc2007 = CreateObject("DAO.DBEngine.120") 

Lưu ý rằng một phiên bản 64 bit cũng có sẵn.

+0

Cảm ơn bạn. – Mike

Các vấn đề liên quan