【发布时间】:2010-11-12 00:09:55
【问题描述】:
我正在为我的应用程序制作一个 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 类来运行事物的开销。这在许多非查询情况下并不是最优的。
我采用的方法是允许用户选择结果类型,“表”(将运行 SqlDataAdapter.Fill(...)、“值”(将运行 ExecuteScalar)或“无” '(将运行 ExecuteNonQuery)。但我不希望他们暴露于 ADO.NET 实现细节。我希望他们只需在文本框中键入 SQL 脚本,点击执行按钮,程序就会运行脚本并在数据网格中返回一个结果集(如果有)。
所以...我需要组件能够在执行 SQL 之前对其进行解析,以辨别运行脚本是否会产生结果集。
【问题讨论】:
-
当涉及到这样的事情时,我通常会问自己“我将如何人工决定使用哪一个?”问问自己,你什么时候使用它们?从那里您将知道如何让应用程序做出决定;你基本上是在为此写一个人工智能。在我看来,除非你预先知道数据太大或者只是一个单一的值,否则很难判断使用哪一个,除非它实际执行语句,否则应用程序不会知道这一点。
-
而且,由于您基本上是在编写 AI,因此您需要担心它会变得具有自我意识,并决定它知道您的用户应该比他们更好地运行哪些查询。 :)