我想强调的是,我正在寻找“正确”的方式来做这样的事情,尤其是 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