繁体   English   中英

如何解析 JET/ACE SQL

[英]How to parse JET/ACE SQL

我想强调的是,我正在寻找“正确”的方式来做这样的事情,特别是对于 Access。 下面是我想出的用于 SQL 服务器的解决方案,但如果它不正确,或者它不能在 Access 上运行,我也想知道。

出于提供 ProgressBar 的目的,我使用以下 function 生成一个(可能更有效) SQL 语句以返回将由 SQL 语句sql返回的记录数。 它适用于 SQL Server 2008 数据库。 我想对 Access 数据库使用类似的处理方法,但我没有发现与 JET/ACE 的 TSql100Parser 和 Sql100ScriptGenerator 类似的方法。 这样的事情存在吗? 有更好的通用解决方案吗?

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

我认为您不会为 Access 找到类似的东西。 这个解析器本身是相当新的。 我建议几乎唯一要做的就是使用基于正则表达式的解析。 如果你想要的只是一个列数,你可以使用正则表达式来定位列表并使用 split function 来计算列数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM