0

我想强调的是,我正在寻找“正确”的方式来做这样的事情,尤其是 Access。下面是我想出的用于 SQL Server 的解决方案,但如果它不正确,或者它不适用于 Access,我也想知道这一点。

出于提供 ProgressBar 的目的,我使用以下函数来生成(可能更有效的)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
4

1 回答 1

0

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

于 2013-01-01T20:58:33.207 回答