解析T-SQL语句

时间:2010-11-12 00:09:55

标签: c# .net sql tsql ado.net

我正在为我的应用程序创建一个SQL脚本编辑器/执行程序组件,其性质与SQL Server Management Studio或旧的查询分析器非常相似。我正在使用C#,.NET Framework 3.5 SP1。我的问题是我希望组件解析SQL以确定它是否应该使用SqlCommand.ExecuteNonQuery(),SqlCommand.ExecuteScalar()或SqlDataAdapter.Fill(dataTable)来运行脚本。目的是允许用户执行非查询,但也返回结果集供用户查看,就像SSMS /查询分析器一样,但也隐藏了ADO.NET实现细节。

我通常默认使用SqlDataAdapter.Fill(dataTable)并始终返回DataTable供用户查看。这仍然会像ExecuteNonQuery那样运行非查询,但它有使用较慢的SqlDataAdapter类来运行的开销。在许多非查询情况下,这不是最佳的。

我采取的方法是允许用户选择结果类型,“Table”(将运行SqlDataAdapter.Fill(...),'Value'(将运行ExecuteScalar)或'None '(将运行ExecuteNonQuery)。但我不希望它们暴露给ADO.NET实现细节。我希望它们只需在文本框中键入一个SQL脚本,点击一个执行按钮,程序就会运行脚本并在数据网格中返回结果集(如果有的话)。

所以......我需要组件能够在执行之前解析SQL,以辨别是否会有运行脚本的结果集。

2 个答案:

答案 0 :(得分:6)

哟不解析文本,因为您没有客户端所需的信息来确定请求是否会返回结果。接受像execute usp_anonymousProcedure 1,2;这样的请求,你能告诉它是否会返回结果吗?显然不是。因此,您将请求发送到服务器并仅询问return the metadata about the result

SET FMTONLY ON;
  

仅返回客户端的元数据。   可以用来测试格式   没有实际运行的响应   查询。

您设置此项,在服务器上运行请求您的请求,然后您将知道请求返回的结果的形状。

答案 1 :(得分:1)

为什么不使用ExecuteReader执行SQL?

IDataReader将包含零个或多个结果集。

您可以遍历结果集,并使用DataTable.Load(IDataReader)将每个结果集加载到DataTable中 - 或者只使用IDataReader / IDataRecord成员来获取列名和数据。

我不知道你事先知道结果集的形状会带来什么好处,而且我很确定查询分析器之类的现有脚本执行程序不会这样做。