c# - 如何将 SQL 查询应用于 C# 数据表/数据集?

标签 c# sql datatable dataset

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

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

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

最佳答案

如果您的用户输入的不是最简单的选择语句,您将很难做到这一点。我想为您的项目编写一个完整的 SQL 解析器的成本会高得令人望而却步,但这实际上就是您所说的。

对于我们拥有的本地 ORM,我有一个类,它基本上将预定义的 SQL 查询转换为可以与 DataTable.Select 一起使用的东西,但是 where 子句是从SQL 参数。

可能的解决方案

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

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

我自己没有用过 Linqer。

一些其他的想法

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

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

关于c# - 如何将 SQL 查询应用于 C# 数据表/数据集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12513853/

相关文章:

c# - 不正确的语法错误

c# - Serilog.Sink.Mail 的动态应用设置

c# - 由于错误,可以从 VS Code 构建和部署 azure 函数

php - 如何从多个索引查询中获取 [id] 索引

c# - 如何查询数据表

c# - 多线程安全日志记录

sql - Firebird 将整数转换为时间或日期

sql - 您什么时候会在数据库标识字段上设置增量值?

c# 将 System.Data.DataSetExtensions 添加到 .net 核心 web api 应用程序

c# - 比较 2 个数据表以查找列之间的差异/准确性