1

私は、何時間も無駄に取り組んできた厄介な問題を抱えています。

私たちの (一般向け) アプリケーションは、MS-Access データベースの最新バージョンのクエリを、エンド ユーザーが現在インストールしているバージョンおよび更新/同期と比較します。それに応じてDB。この機能は機能していましたが、現在は壊れています。動作を実証するために、最も簡単なテストに頼りました。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 のコピーは 1 つしかありません。これはウイルスでしょうか?

ありとあらゆるアイデアを歓迎します。

4

2 に答える 2

2

保存されるクエリには2つのタイプがあります。

  1. DDLステートメントSELECTで作成できる単純なクエリ。CREATE VIEW
  2. 他のすべてのクエリ。これらはで作成することはできませんが、で作成するCREATE VIEWことはできますCREATE PROCEDURE。このカテゴリには、次のものが含まれます。「アクションクエリ」(挿入、更新、削除、「テーブルの作成」)。パラメータクエリ; 句を含む単純なSELECTクエリ。ORDER BYそしておそらくもっと今のところ思い出せません。

スキーマビューには最初のタイプが含まれます。スキーマ手順には、2番目のタイプが含まれます。 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 には、スキーマ ビューとスキーマ プロシージャの 2 種類のスキーマがあります。プロシージャはアクション クエリであり、ビューは選択クエリです。だからあなたが必要です

   OleDbSchemaGuid.Views

OleDbSchemaGuid は、メモ フィールドに対して間違ったデータ型を返すことに注意してください。

于 2012-09-11T18:19:22.383 に答える