2012-09-11 94 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返回備忘錄字段的錯誤數據類型。

相關問題