2012-04-10 17 views
0

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 

Antwort

0

Ich glaube nicht, dass Sie so etwas für Access finden. Dieser Parser selbst ist ziemlich neu. Ich würde vorschlagen, dass das einzige, was zu tun wäre, Regex-basierte Analyse zu verwenden wäre. Wenn Sie nur eine Spaltenanzahl haben möchten, können Sie regex verwenden, um die Liste zu finden, und eine Split-Funktion, um die Spalten zu zählen.