2012-09-11 56 views
1

我有一个令人困惑的问题,我一直在努力许多小时无济于事。VB.NET OleDB MSAccess GetOleDBSchema返回的查询数量不正确(过程)

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

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

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

下面的简单形式调用OleDbSchemaTable方法,但返回的错误行数/查询(= O) :

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的测试版本。这可能是病毒吗?

任何和所有的想法,赞赏。

回答

2

有两种类型的保存查询。

  1. 简单SELECT可以用CREATE VIEW DDL语句创建的查询。
  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 
+0

非常感谢(HansUp和Remou)。我不知道为什么使用“过程”先前在VB.NET OLEDB中同时处理Action和Select查询。 –

+0

我也不清楚,罗恩。如果之前的'SELECT'查询包含'ORDER BY'子句,则它们将是过程而不是从模式角度来看。 – HansUp

+0

这听起来合乎逻辑。只要它是一个(VIEW)或另一个(PROCEDURE),我终于可以解决这个问题。再次感谢! –

1

MS Access有两种类型的模式,模式视图和模式过程。过程是动作查询,视图是选择查询。因此,您需要

OleDbSchemaGuid.Views 

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