【问题标题】:How to apply SQL query to a C# DataTable/Dataset?如何将 SQL 查询应用于 C# DataTable/Dataset?
【发布时间】:2012-09-12 21:24:18
【问题描述】:

我有一个应用程序,用户可以在其中输入一个 sql 查询作为文本,我需要在我的应用程序中针对 C# DataTable/Dataset 运行它。有可能吗?

编辑: 根据答案和一些更多的研究,它无法完成 - 无法将 SQL 查询应用于您已经读入应用程序的表。查看可能的解决方法的答案。

编辑 2: 在我的案例中,最终的解决方案是使用 ANTLR 实现一个简单的解析器。它允许用户使用“AND”和“OR”关键字以及括号输入简单的查询。 ANTLR 生成的类会将其转换为一组指令,然后我可以使用这些指令来查询 C# 数据集。

【问题讨论】:

  • 是的,但这可能是个坏主意。是什么阻止了sql注入?你看过 SqlCommand 和 SqlDataAdapter 类吗?
  • 就您为教程/教育目的创建应用程序而言,这很好。否则,它会被认为是一种糟糕的编程习惯。你可以使用entityframework,最后你会有学习一些ORM工具的经验。
  • @Josh C. 快速查看 SqlCommand 和 SqlDataAdapter 类给我的印象是我只能将它们应用于数据库(因为连接字符串)。如何将它们应用于驻留在 C# 数据集中的 C# 数据表(即它已经读入内存)。
  • @DarshanJoshi 数据集/数据表存在于应用程序内部,不是实际的数据库,并且是只读的(没有连接回实时数据库)。同样,我不关心 sql 注入。我只是想要一种简单且高度可定制的方式让用户输入他们的搜索条件。
  • 你想对数据集/数据表运行基于 sql 的查询吗?

标签: c# sql datatable dataset


【解决方案1】:

其实有一个简单的解决方案。

  1. 将 DataTable 中的数据导出到 SQLite 内存数据库。
  2. 在 SQLite 内存数据库上运行 SQL。

【讨论】:

    【解决方案2】:

    如果您的用户将输入除了最简单的选择语句之外的任何内容,那么您将很难做到这一点。我想你的项目为 SQL 编写一个完整的解析器会非常昂贵,但这就是你所说的。

    对于我们自己开发的 ORM,我有一个类,它基本上将预定义的 SQL 查询转换为可以与 DataTable.Select 一起使用的东西,但 where 子句是从 SqlParameters 生成的。

    可能的解决方案

    也许你可以结合以下项目来接近你所追求的:

    Linqer (SQL to LINQ converter) 然后LINQ to DataSet

    我自己没有用过 Linqer。

    其他一些想法

    我相信您已经对此进行了一些思考,但是这样做的困难可能意味着如果您缩小一点,会有更好的方法。严格来说,使用未知查询查询缓存意味着您必须用所有可能的数据填充缓存,或者能够在提交查询时调用该数据。根据定义,这不能提供比直接查询源更好的性能,除非您在缓存过时之前充分访问缓存以使其值得。对于临时报告系统(我的假设),我倾向于怀疑情况是否如此,并且我还担心它在任何情况下都不会胜过数据库引擎,除非是边缘情况。

    @JoshC 还提到了使用 Sqlite 的可能性,还有可能符合要求的 SQL Server 2012 LocalDB,尽管这些肯定不是 .net 数据集。

    【讨论】:

    • 不必编写自己的 SQL 解析器正是我试图查看 .NET 是否已经支持可以接受 SQL 查询的方法的原因。根据迄今为止的答案,它看起来不像。
    【解决方案3】:

    如果您想在应用程序中针对 c# 数据表/数据集运行搜索字符串

    您可以在select 方法中使用过滤器表达式。

    myDataTable.Select("columnName1 like '%" + value + "%'");

    【讨论】:

    • 问题是,Select() 函数中的搜索字符串不是 sql 查询。我不能指望我的最终用户知道一些深奥的 .NET 语法,但我可以指望他们知道 SQL 语法。有什么方法可以将 sql 查询转换为可以应用于 C# 数据集的东西?
    • @Eternal21 如果您只是过滤,您可以将选择修剪到 where 子句。如果您基于选择隐藏/显示列,您可以从选择中解析列名并相应地修改视图。
    • 当列名中间有空格时,这是否有效?
    • 将列名括在方括号 [ ] 中以用于显式过滤器
    猜你喜欢
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    相关资源
    最近更新 更多