2009-07-08 53 views
0

我希望能够使用数据集作为内存数据存储。我希望能够使用SELECT,INSERT,UPDATE和DELETE,CREATE TABLE,DROP TABLE,ALTER TABLE ADD COLUMN,ALTER TABLE DROP COLUMN,并支持约束PRIMARY KEY,UNIQUE,NOT NULL,FOREIGN KEY,REFERENCES。如何针对数据集执行SQL语句

+0

你可以扩展你为什么要这么做吗?这可能有助于产生更有用的答案。 – 2009-07-08 15:39:46

+0

很多人都回答JJS的问题,真是太棒了。但是,如果他回复告诉我们他真正想要的东西,情况会更好。如果他曾回复过,那么看看有多少答案接近他想要的就会很有趣。 – 2009-07-08 15:56:12

+0

对不起。没有打开此问题的电子邮件更新。我会欢迎一个私人消息,说我的答复不是即将到来的。 询问DataSet结构的对象模型和接口已经很强大,并且很好理解。如果替换DataSet和DataTable对象及其组成部分将减少您的困惑,那么我接受有关这方面的建议。 – JJS 2009-07-13 23:42:19

回答

0

对不起,这不是一个DataSet的用途。

你为什么要这样做?

+0

谁说这不是DataSet的用途? DataSet具有完整的对象模型,众所周知的接口,设计器支持和可用的调试可视化器。为什么我会重新发明轮子以显示有关“DataSet”的信息(如果存在)? – JJS 2009-07-13 23:52:17

+0

谁说的?过去七年使用它的经验,以及阅读微软和其他人对此的看法。没有人曾经建议DataSet是发布查询的对象。过滤和排序(使用DataView)yes,但不是通用查询平台。这就是SQL Server Express和Compact的用途。 – 2009-07-14 00:01:57

2

这是.Net?什么版本? 3.5及更高版本让你在任何IQueryable的

+0

是的。除了.Net以外,DataSet在我所知的任何API中都不可用。 IQueryable不支持修改对象模式的概念。如果我错了,请纠正我,但Linq没有定义任何查询操作符来操纵查询对象的模式。 – JJS 2009-07-13 23:45:47

2

运行类似SQL的LINQ查询听起来像是你需要一个在内存数据库,而不是一个数据集。

3

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

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

1

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

根据你在做什么,linq可能是有用的,但不能提供准确的SQL语法或任何你所提到的规范语言位。 (ALTER TABLE等)

如果你的项目还没有使用外部数据库,你也可以考虑使用嵌入式数据库(sqlite,Firebird,不知道还有什么)。

1

你想要LINQ!它可以执行您根据您的数据所要求的所有操作......并且更多地为您提供性感觉,它可能不应该那么容易。

它会动摇你的盒子(如果你习惯反正ADO.NET)

也期待在LINQ2SQL,因为它提供多一点,当谈到写作/内存中的数据读取你的背部到数据库。 ..或者linq2xml如果你想使用web服务。

0

您不能这样做,因为DataSet是您检索的数据的客户端上的内存中表示形式。

这也是不可知该数据的提供者。因此,您无法使用与数据来自的数据源相同的语法。

的DataSet有它的过滤数据自己的语法,但它没有被大量基于SQL。

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

0

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

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

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

0

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

如果您正在寻找内存数据集以获取它们提供的速度,您可能需要查看内存中的表存储(MySQL和PostGreSQL可以执行此操作,而其他操作可以通过设置表存储来欺骗)例如在RAM磁盘上的空间)。

短寿命表经常被忽略,但它们实际上非常有帮助。