1

我有一个令人困惑的问题,我一直在努力解决数小时但无济于事。

我们的(普通观众)应用程序将最新版本的 MS-Access 数据库中的查询与最终用户当前安装的版本和更新/同步进行比较。相应的数据库。尽管此功能一直有效,但现在已损坏。我采用了最简单的测试来证明这种行为。OLEDB 未返回正确数量的查询。

打开 Access 2007 数据库后,我显示了查询的位置和正确数量:

?CurrentDB.Name
C:\Users\Ron\Documents\Database4.accdb
?CurrentDB.QueryDefs.Count
1 

以下简单表单调用 OleDbSchemaTable 方法,但返回错误的行数/查询数 (=0):

Public Class Form1
    Private ConnStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Ron\Documents\Database4.accdb"

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim dbo As DataTable = GetSchemaInfo()
        Debug.Print("Number of queries=" & dbo.Rows.Count)
    End Sub
    Private Function GetSchemaInfo()
        Try
            Dim db As DataTable
            Using conn = New OleDb.OleDbConnection(ConnStr)
                conn.Open()
                db = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Procedures, Nothing)
            End Using
            Return db

        Catch ex As Exception
            MsgBox(ex.Message)
            Return Nothing
        End Try
    End Function
End Class

即时窗口:查询数=0

我已经尝试了我能想到的一切(压缩/修复,在不同的机器上运行)。不幸的是,我只有一份 Access 2007 可供测试。这可能是病毒吗?

任何和所有的想法都值得赞赏。

4

2 回答 2

2

有 2 种类型的已保存查询。

  1. SELECT可以使用CREATE VIEWDDL 语句创建的简单查询。
  2. 所有其他查询。这些不能用创建CREATE VIEW但可以用CREATE PROCEDURE. 此类别中包括:“操作查询”(插入、更新、删除、“制作表”);参数查询;SELECT包含ORDER BY子句的简单查询;也许还有更多我现在不记得了。

模式视图包括第一种类型。模式过程包括第二种类型。 QueryDefs.Count为您提供所有已保存查询的计数,包括两种类型。

在您的数据库中尝试以下 VBA 过程。使用我的数据库,我在“立即”窗口中得到以下输出:

QueryDefs.Count: 66
Views: 34
Procedures: 32

不幸的是,我不知道如何将此 VBA 转换为 Dot.Net。也许这无关紧要。我只想强调QueryDefs.Count应该是视图数加上程序数。在我看来,您的代码只要求程序。

Public Sub CountQueries()
    Const adSchemaProcedures = 16
    Const adSchemaViews = 23
    Dim cn As Object
    Dim rs As Object
    Dim i As Long

    Debug.Print "QueryDefs.Count: " & CurrentDb.QueryDefs.Count

    Set cn = CurrentProject.Connection
    Set rs = cn.OpenSchema(adSchemaViews)
    i = 0
    With rs
        Do While Not .EOF
            i = i + 1
            'Debug.Print !TABLE_NAME '
            .MoveNext
        Loop
        .Close
    End With
    Debug.Print "Views: " & CStr(i)

    Set rs = cn.OpenSchema(adSchemaProcedures)
    i = 0
    With rs
        Do While Not .EOF
            i = i + 1
            'Debug.Print !PROCEDURE_NAME '
            .MoveNext
        Loop
        .Close
    End With
    Debug.Print "Procedures: " & CStr(i)

    Set rs = Nothing
    Set cn = Nothing
End Sub
于 2012-09-11T18:19:33.983 回答
1

MS Access 有两种模式,模式视图和模式过程。过程是操作查询,视图是选择查询。所以你需要

   OleDbSchemaGuid.Views

请注意,OleDbSchemaGuid 为备注字段返回错误的数据类型。

于 2012-09-11T18:19:22.383 回答