65.9K
CodeProject 正在变化。 阅读更多。
Home

用于 DataSets 的 SQL 执行引擎

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.31/5 (5投票s)

2006 年 6 月 29 日

3分钟阅读

viewsIcon

48995

downloadIcon

319

描述了一种对内存中的 DataSet 执行 SQL 语句并返回包含结果表的新 DataSet 的粗略方法。

Sample Image

引言

.NET 中的 DataSet 是本地操作数据的强大工具。 但是,尽管它们具有灵活性,但它们可能很耗时且难以使用。 我相信很多人都希望能够直接对 DataSet “执行一些 SQL”,并在新的 DataSet 中呈现结果。 就目前而言,如果我想获取 DataSet 并操作其内容,我必须创建 DataView、克隆表、创建计算列、循环遍历行进行复制等等。

附加的代码库展示了一种启用此功能的粗略方法。 它利用了 DataTable 可以很容易地转换为 .CSV(逗号分隔值)表,并且 Microsoft 提供了用于.CSV文件的 ODBC 驱动程序这一事实。

通过将 DataSet 中的所有 DataTable 转换为 .CSV 文件,然后使用 ODBC Microsoft Text Driver 对它们执行一些 SQL,我们可以生成一个新的 DataSet

使用代码

如果构建解决方案,将创建一个名为 DataSetSQLEngine.dll.dll 文件。 这公开了一个公共类,其中包含一个公共共享函数 executeSQLDataset()。 该函数的参数是一个源 DataSet、要执行的 SQL 字符串以及一个可选的用于存储临时创建的 .CSV 文件的文件夹路径。 如果未传递此路径,将使用本地临时文件夹。 如果从 ASP.NET 使用该库,您可能需要传递一个位于应用程序根文件夹下的路径,因为 ASPNET 用户可能无权访问系统临时文件夹。

如果出现任何问题,例如 SQL 语法错误或 IO 错误,将会引发错误,因此您应该始终将这些调用包装在 Try...Catch 块中。

Dim newDS As DataSet = _
   DataSetSQLEngine.DataSetSQLEngine.executeSQLDataset(ds, _
   "Select * From myTable.csv as myTable order by dateStamp")

请注意,在示例中,您必须将表引用为 aTable.CSV。 默认情况下,ODBC 驱动程序会查找扩展名为 .txt 的文件。 您可能可以在驱动程序中设置一个选项以强制其默认为 .csv;我没有仔细查找。 如果有人找到它,请告诉我。

Microsoft Text Driver ODBC 驱动程序似乎使用构建 Access 的 Jet 引擎,并且似乎支持 Access SQL 实现。 似乎也可以使用标准 Access 函数,这是一个奖励。

包含的项目 SQLEngineExample 有一个非常简单的例子,可以让您很好地了解该函数的工作方式。

关注点

如前所述,此实现非常粗略,在某些情况下无法提供可用的解决方案。 例如,如果性能至关重要,那么此解决方案会惨败,因为它需要大量的磁盘 IO 和表扫描。 此外,我还没有用许多不同类型的数据对其进行测试。 在依赖它之前,您需要使用任何数据对其进行充分测试。

在查询中使用字符串值时,请确保使用单引号;双引号会导致错误。

另一个限制是,Text ODBC 驱动程序仅支持 SELECTINSERT,不支持 UPDATEDELETE。 虽然,我不知道你为什么会用这个库做除了 SELECT 以外的任何事情…… 只是需要注意的事情。

如果您采用附加的项目并添加更强大的错误检查,或者以任何方式提高可用性,请告诉我,我将上传它(并且很可能自己使用它!)。

我想借此机会请求 Microsoft 将此功能作为 .NET DataSet 实现的一部分添加,最好是包含 T-SQL 的语法。

历史

  • 26/06/06 - 添加了原型版本。
© . All rights reserved.