【问题标题】:How can I execute SQL statements against a Dataset如何针对数据集执行 SQL 语句
【发布时间】:2009-07-08 15:10:40
【问题描述】:

我希望能够将数据集用作内存数据存储。 我希望能够使用 SELECT、INSERT、UPDATE 和 DELETE、CREATE TABLE、DROP TABLE、ALTER TABLE ADD COLUMN、ALTER TABLE DROP COLUMN,并支持约束 PRIMARY KEY、UNIQUE、NOT NULL、FOREIGN KEY、REFERENCES。

【问题讨论】:

  • 您能否详细说明您为什么要这样做?这可能有助于产生更有用的答案。
  • 我们这么多人回答了 JJS 的问题真是太好了。但是,如果他回复告诉我们他真正想要什么,那就更好了。如果他真的回复了,看看有多少答案接近他想要的答案会很有趣。
  • 对不起各位。没有为此问题开启电子邮件更新。我会欢迎私信说我没有回复。用于询问 DataSet 结构的对象模型和接口已经很健壮,并且很好理解。如果替换 DataSet 和 DataTable 对象及其组成部分可以减少您的困惑,那么我愿意接受涉及该问题的建议。
  • 我终于找到了我的问题的答案,并将其添加为答案。在阅读我的一些 cmets 时,我意识到我对你们中的很多人都很苛刻,我很抱歉。我希望我在回答中引用的产品能够阐明我最初有兴趣获得的东西。

标签: .net sql dataset


【解决方案1】:

如果您想在内存数据存储上测试您的数据库命令,DataSet 不适合,因为它不是内存关系数据库引擎。正如其他人所说,您可以对 DataSet 进行各种查询,但不能对 DDL 命令进行查询。我查看了各种内存或嵌入式数据库引擎(SqlLite、HSQL、Firebird),但从未接近找到在内存中对 Sql Server 代码进行单元测试的好方法,这通常是由于这些引擎的限制(例如,没有存储过程)。

如果您的应用程序需要嵌入式数据库,请查看这些产品。 如果您需要测试 Sql Server 命令,则必须在 Sql Server 实例上运行它们(考虑 Express,轻量级且免费)。

【讨论】:

  • 我不想在内存存储上测试我的 DDL 命令。我更专注于使用 sql 提供的定义良好的语法来操作 DataSet 实例。
  • 那么你应该更新你的问题,说你实际上并不关心语法,它只是你需要的 API 的一个例子。
【解决方案2】:

这是.Net?什么版本? 3.5 及更高版本允许您在任何 IQueryable 上运行类似 sql 的 linq 查询

【讨论】:

  • 是的。除 .Net 外,我所知道的任何 API 中都没有数据集。 IQueryable 不支持修改对象架构的概念。如果我错了,请纠正我,但 Linq 没有定义任何查询运算符来操作查询对象的架构。
  • 当这个人甚至没有关于标准查询运算符的能力及其修改对象定义结构的能力的 RTFM 时,谁投票赞成。是的,有投影运算符,但这与 SQL 的 DDL 语法几乎不一样。
【解决方案3】:

听起来您需要一个内存中的数据库,而不是数据集。

【讨论】:

  • 见澄清评论。如果他们提供了一个完整的对象模型,它具有与 DataSet 非常相似的 API 来查询数据库的结构,我会很乐意使用内存数据库。大神推荐一下?
  • 当 Cody 甚至无法推荐带有 .Net API 的内存数据库时,谁投了赞成票?
【解决方案4】:

你想要 LINQ!它可以对您的数据执行您要求的所有操作......甚至更多,同时给您一种性感的感觉,它可能不应该那么容易。

它会震撼你的盒子(如果你习惯了 ado.net)

还可以查看 Linq2SQL,因为它在将内存中的数据写入/读取回数据库时提供了更多功能……如果您想使用 Web 服务,则可以使用 linq2xml。

【讨论】:

  • 我一定错过了 Linq 运算符,它允许我在表中添加或删除列。您能否向 MSDN 文档发送一个关于该方法是什么的 URL?
  • 老兄,使用谷歌,阅读一些教程,它不像这里的答案会阻止你工作。还有你的一些回复很粗鲁,不让我想花时间到处找你。这里的人正试图根据你告诉他们的内容来帮助你。
【解决方案5】:

简而言之,您不能对 DataSet 或任何其他 .NET 数据类型执行这些操作。这些命令不是数据本身固有的,它们是支持 SQL 的数据库软件的一部分;您只能将这些操作与支持它们的软件(如数据库服务器或嵌入式数据库)一起使用。

根据您的操作,linq 可能有用,但不提供准确的 SQL 语法或您提到的任何规范语言位。 (ALTER TABLE 等)

如果您的项目尚未使用外部数据库,您还可以考虑使用嵌入式数据库(sqlite、Firebird,不确定还有什么)。

【讨论】:

  • 我知道你不能在 DataSet 实例上自然地执行这些操作。我问是否有人知道能够执行这些操作的补充 API。
【解决方案6】:

抱歉,这不是 DataSet 的用途。

你为什么要这样做?

【讨论】:

  • 谁说这不是 DataSet 的用途? DataSet 具有完整的对象模型、众所周知的接口、设计器支持和可用的调试可视化工具。为什么我要重新发明轮子来显示有关“DataSet”的信息?
  • 谁说的?过去七年的使用经验,以及阅读 Microsoft 和其他任何人对它的评价。从来没有人建议使用 DataSet 来发出查询。过滤和排序(使用 DataView)是的,但不是通用查询平台。这就是 SQL Server Express 和 Compact 的用途。
【解决方案7】:

您不能,因为 DataSet 是您检索到的数据的客户端的内存中表示。

对于该数据的提供者来说,它也是不可知的。因此,您不能使用与数据来源相同的语法。

DataSet 有自己的过滤数据的语法,但它并不严重基于 SQL。

相反,您应该使用LINQ to DataSets,这将为您在数据集中查询数据提供更像 SQL 的体验。

【讨论】:

    【解决方案8】:

    如果您不想使用 LINQ(例如 .NET 2.0),则可以使用“select”方法提供具有“where-clause-like”语法的过滤器。这是一个 MSDN 链接:

    http://msdn.microsoft.com/en-us/library/system.data.datatable.select

    这是一个 DataTable 方法,所以我不知道它是否提供了您正在寻找的所有内容。此外,这只允许您选择数据集的一个子集,而不是执行更新/插入/删除。

    【讨论】:

      【解决方案9】:

      您可能需要考虑使用临时表。如果您的数据必须在数据库连接之间共享,甚至是标准表。

      如果您正在寻找内存数据集以提供它们提供的速度,您可能需要查看内存表存储(MySQL 和 PostGreSQL 会这样做,而其他人可以通过设置表存储空间来欺骗这样做例如在 ram-disk 上)。

      短期表格经常被忽视,但它们实际上非常有用。

      【讨论】:

        【解决方案10】:

        有人以商业产品的形式实现了这一点。 http://www.queryadataset.com 它支持我最初询问的所有功能 http://www.queryadataset.com/Documentation/Expressions/tabid/80/Default.aspx.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-02
          • 1970-01-01
          • 1970-01-01
          • 2012-04-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多