2009-12-21 21 views
5

Tôi đang cố gắng lấy danh sách tất cả các bảng từ cơ sở dữ liệu định dạng Access 2007 ACCDB bằng cách sử dụng Excel VBA.Không thể đọc bản ghi; không có quyền đọc trên 'MSysObjects'

Tôi đã theo bài này:

How can I get table names from an MS Access Database?

Sử dụng:

SELECT MSysObjects.Name AS table_name 
FROM MSysObjects 
WHERE 
     (((Left([Name],1))<>"~") 
    AND ((Left([Name],4))<>"MSys") 
    AND ((MSysObjects.Type) In (1,4,6))) 
order by MSysObjects.Name 

nhưng tôi nhận được lỗi này.

Không thể đọc bản ghi; không có quyền đọc trên 'MSysObjects'

Tôi muốn chỉ có thể lấy tên bảng bằng cách sử dụng câu lệnh SQL chứ không phải phương thức OpenSchema.

Tôi nghĩ vấn đề là với Quyền truy cập. Tôi không chắc.

Có ai có ý tưởng nào không?

+0

Môi trường lập trình của bạn là gì? Bạn sẽ sử dụng kết quả để làm gì? –

+0

Ngoài ra, định dạng tệp của bạn là gì - ACCDB hoặc MDB? –

+0

Cảm ơn câu hỏi của bạn. Tôi đang sử dụng ACCDB. – VBGKM

Trả lời

0

Dường như vấn đề về quyền. Hãy thử mở cơ sở dữ liệu và đi đến các điều khoản bảo mật (trong Tools-> security -> User và quyền của nhóm) Đảm bảo rằng bạn có quyền truy cập quản trị vào cơ sở dữ liệu.

Nếu bạn không bạn có thể phải đăng nhập vào cơ sở dữ liệu như một người dùng mà không và cấp cho mình quyền

+0

-1 Công cụ-> Bảo mật-> Quyền người dùng và Nhóm không tồn tại trong Access 2007 – jaywon

+2

@jaywon: lựa chọn menu đó tồn tại nếu bạn đang xem tệp MDB. Nó sẽ không hiển thị nếu bạn đang xem một tập tin ACCDB, mà không có sự hỗ trợ cho an ninh mức độ người dùng máy bay phản lực. Vì vậy, bình luận của bạn là WRONG. –

2

Sử dụng DAO TableDefs bộ sưu tập

Sub TableDefs() 

    Dim db As dao.Database 
    Dim tdfLoop As dao.TableDef 

    Set db = CurrentDb 
    With db 
     Debug.Print .TableDefs.Count & " TableDefs in " & .name 
     For Each tdfLoop In .TableDefs 
      Debug.Print " " & tdfLoop.name 
     Next tdfLoop 
    End With 

End Sub 
+0

Điều đó có vẻ hợp lý, nhưng OP nói "Tôi muốn có thể lấy tên bảng chỉ bằng cách sử dụng câu lệnh SQL" – Fionnuala

+0

Không có gì trong câu hỏi ban đầu cho thấy rằng điều này đang được thực hiện từ bên ngoài Access, do đó, có vẻ như với tôi rằng bạn sẽ nhận được một danh sách các bảng, bạn sẽ làm điều gì đó với chúng. Ngắn sử dụng chuỗi SQL làm hàng nguồn của một combo/listbox, bạn sẽ sử dụng mã để sử dụng danh sách kết quả, trong trường hợp này, nó hầu như không tạo ra bất kỳ sự khác biệt nào cho dù bạn sử dụng bộ sưu tập TableDefs đi qua Recordset dựa trên câu lệnh SQL. –

+1

Remou, chắc chắn, ông nói chỉ sử dụng một câu lệnh SQL. Tôi hình dung nếu anh ta không có câu trả lời ngay bây giờ thì anh ấy nên thử các giải pháp thay thế. –

0

tôi đã có thể làm cho công việc mã với một tệp MDB. Tôi đã có tùy chọn để đặt quyền người dùng bằng cách sử dụng "Công cụ cơ sở dữ liệu - Người dùng và Quyền" trên ruy-băng. Tùy chọn này chỉ có sẵn cho các tệp MDB. Bây giờ vấn đề là làm cho nó hoạt động với một tập tin ACCDB.

Đây là mã của tôi:

Dim DBFile As String 
Dim Connection As ADODB.Connection 
Dim Recordset As New ADODB.Recordset 

DBFile = "C:\Documents and Settings\User\Desktop\Son.mdb" 

Set Connection = New ADODB.Connection <br/> 
Connection.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source= " & DBFile & ";" 

SQLString = "SELECT MSysObjects.Name AS table_name" & _ 
"FROM MSysObjects WHERE (((Left([Name],1))<>" & """~""" & ")" & _ 
"AND ((Left([Name], 4))<>" & """MSys""" & ")" & _ 
"AND ((MSysObjects.Type) In (1,4,6)));order by MSysObjects.Name" 

Set Recordset = New ADODB.Recordset 
Recordset.Open SQLString, Connection 

Vấn đề là tôi không thể làm cho nó làm việc với các file ACCDB.

+0

Bạn có đang chạy mã từ Access hoặc Excel không? –

1

Đây là những gì làm việc cho tôi, vì đây là lần đầu tiên vì vậy câu hỏi mà đi lên cho việc này:

  1. này là một tập tin MDB. Không biết về người khác. Tôi hiểu đây không phải là câu hỏi được yêu cầu. Tuy nhiên, các câu hỏi/câu trả lời của StackOverflow cũng được nhiều người khác đến đây thông qua google, như tôi đã làm, và tôi đang sử dụng MDB. Tôi hy vọng câu trả lời này được sử dụng cho người khác.

  2. Mở giao diện truy cập MS. Đã không tìm ra cách để làm điều này mà không có nó, xin lỗi, mặc dù nó có khả năng có thể.

  3. Chuyển đến Công cụ ... Tùy chọn ...

  4. Bấm tab "View"

  5. chọn "Hidden đối tượng", "Hệ thống các đối tượng"

  6. tab gần

  7. Go vào Tools ... An ninh .. người dùng và Nhóm quyền

  8. Chọn tất cả các tên bảng bao gồm MSysObjects

  9. bấm tất cả các "điều khoản" hộp kiểm để họ thiết lập là "kiểm tra" cho tất cả các mục

  10. áp dụng/OK khi cần thiết

+0

Tôi đã giải quyết rằng ở điểm # 1. Câu hỏi ở đây là sử dụng cho những người sử dụng cả hai định dạng. Nếu bạn google cho thông báo lỗi này, đây là câu hỏi SO xuất hiện. Vì vậy, có một câu trả lời làm việc cho một số là tốt hơn so với không có câu trả lời nào cả. – zzzeek

7

Kể từ db của bạn là định dạng ACCDB, bạn sẽ được làm việc như sử dụng Admin. Bạn có thể xác nhận điểm đó trong cửa sổ ngay lập tức. (Đến đây với Ctrl +g)

? CurrentUser() 
Admin 

Kể từ quản không đã đọc (SELECT) cho phép trên MSysObjects, thực thi một lệnh DDL để cung cấp cho quản phép đó.

strDdl = "GRANT SELECT ON MSysObjects TO Admin;" 
CurrentProject.Connection.Execute strDdl 
+1

+1 Tuyệt vời! Điều này cũng cho phép ACE/OLEDB truy cập MSysObjects trong tệp .accdb từ bên ngoài Access. – agentnega

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