Ich möchte betonen, dass ich nach dem "richtigen" Weg suche, um so etwas im Allgemeinen und für Access im Besonderen zu tun. Was ich unten habe, ist die Lösung, die ich für die Verwendung auf einem SQL Server entwickelt habe, aber wenn es nicht richtig ist oder wenn es bei Access nicht funktioniert, würde ich das auch gerne wissen.Wie man JET/ACE SQL analysiert
Zum Zwecke der Bereitstellung einer ProgressBar habe ich die folgende Funktion, die ich verwenden, um eine (möglicherweise effizientere) SQL-Anweisung zu generieren, um die Anzahl der Datensätze, die von der SQL-Anweisung zurückgegeben werden sql. Es funktioniert gegen eine SQL Server 2008-Datenbank. Ich möchte eine ähnliche Behandlung für Access-Datenbanken verwenden, aber ich habe nichts analog zu TSql100Parser und Sql100ScriptGenerator für JET/ACE gefunden. Gibt es so etwas? Gibt es eine bessere allgemeine Lösung?
Imports Microsoft.Data.Schema.ScriptDom
Imports Microsoft.Data.Schema.ScriptDom.Sql
Private Function GetCountSQL(ByVal sql As String) As String
Dim _tsBatch As TSqlBatch
Dim _peErrors As IList(Of ParseError) = Nothing
Dim _tssFragment As TSqlScript
Dim _tspParser As New TSql100Parser(False)
Dim _retval As String = vbNullString
Dim _sgScriptGenerator As New Microsoft.Data.Schema.ScriptDom.Sql.Sql100ScriptGenerator
Dim _tsStatement As TSqlStatement
_tssFragment = _tspParser.Parse(New StringReader(sql), _peErrors)
If _peErrors Is Nothing OrElse _peErrors.Count = 0 Then
For Each _tsBatch In _tssFragment.Batches
For Each _tsStatement In _tsBatch.Statements
If TypeOf _tsStatement Is Microsoft.Data.Schema.ScriptDom.Sql.SelectStatement AndAlso CType(_tsStatement, Microsoft.Data.Schema.ScriptDom.Sql.SelectStatement).OrderByClause IsNot Nothing Then
CType(_tsStatement, Microsoft.Data.Schema.ScriptDom.Sql.SelectStatement).OrderByClause = Nothing
End If
Next
Next
_sgScriptGenerator.GenerateScript(_tssFragment, _retval)
_retval = String.Format("Select Count(*) FROM ({0}) SQ", _retval)
End If
Return _retval
End Function