有什么更好的:DataSet或DataReader?

我刚刚看到这个话题: Datatable与数据集,但它并没有解决我的疑问。让我更好地解释,我正在做数据库连接,需要显示在GridView的结果。 (我之前和VB6一起使用过RecordSet,DataSet和DataSet非常相似,所以使用DataSet要容易得多)。然后一个人告诉我DataSet并不是最好的方法。

那么,我应该“学习”DataReader还是继续使用DataSet? 数据表? 有什么优点/缺点?

这取决于你的需求。 其中一个最重要的区别是,DataReader将保留与数据库的开放连接,直到DataSet成为内存中的对象。 如果您将控件绑定到DataReader,则它仍然是打开的。 另外,DataReader是一种只读方法来读取无法操作的数据。 使用DataSet,您可以前后移动,并根据需要操作数据。

一些额外的function:DataSets可以序列化并用XML表示,因此可以轻松地传递给其他层。 DataReaders不能被序列化。

另一方面,如果你有大量的行从数据库中读取,那么你需要交给业务规则的某个进程,DataReader可能会更有意义,而不是加载所有行的DataSet,占用内存并可能影响可扩展性。

下面是一个有点过时但有用的链接: 对比ADO.NET DataReader和DataSet 。

这基本上是:“哪个更好:一个水桶还是水pipe?”

DataSet是这里的桶; 它可以让你随身携带一组断开的数据并使用它 – 但是你将承担携带桶的费用(所以最好把它保持在一个你喜欢的大小)。

一个数据阅读器是软pipe:当数据经过你的时候,它提供对数据的单向/一次访问; 您不必一次性携带所有可用的水,但需要连接到水龙头/数据库。

同样,您可以用软pipe填充一个桶,您可以使用数据读取器填充DataSet

我试图做的一点是,他们做不同的事情…

我不经常亲自使用DataSet ,但有些人喜欢它们。 但是,我确实使用数据读取器进行BLOB访问等。

除了Marc的观点之外,你可以使用没有数据库的DataSet。

您可以从XML文件中填写,也可以从程序中填写。 用一个数据库中的行填充它,然后转向并写出到另一个数据库。

DataSet是关系模式的完全内存表示。 无论你是否使用它与一个实际的关系数据库取决于你。

不同需求,不同解决scheme。

正如你所说,数据集是最相似的VB6logging集。 也就是说,拉下你需要的数据,把它传递出去,用它做什么。 哦,然后当你完成后最终摆脱它。

数据读取器是有限的,但是当你需要读取一次数据时,它会提供更好的性能。 例如,如果你自己填充一个网格 – 即拉取数据,遍历它,为每一行填充网格,然后丢弃数据 – datareader比数据集好得多。 另一方面,如果你有任何更新数据的意图,甚至不要尝试使用datareader …

所以,是的,学习它 – 但只有在适当的时候使用它。 数据集给你更多的灵活性。

要回答你的第二个问题 – 是的,你应该了解DataReader。 如果有的话,所以你知道如何使用它们。

我认为你在这种情况下使用DataSets更好 – 因为你正在做数据绑定和所有(我正在考虑CPU周期vs人力)。

至于哪一个会有更好的performance。 这很大程度上取决于你的情况。 例如,如果你正在编辑你要绑定的数据,并且修改了这些变化,那么使用DataSets会更好

DataReader的

DataReader用于从数据库中读取数据,在从数据库中获取数据的过程中,它是一个只读和转发的面向连接的体系结构。 与数据集相比,DataReader将以非常快的速度读取数据。 一般来说,我们将使用ExecuteReader对象将数据绑定到datareader。

要将DataReader数据绑定到GridView,我们需要编写如下所示的代码:

 using(SqlConnection conn = new SqlConnection("Data Source=abc;Integrated Security=true;Initial Catalog=Test")) { con.Open(); SqlCommand cmd = new SqlCommand("Select UserName, First Name,LastName,Location FROM Users", conn); SqlDataReader sdr = cmd.ExecuteReader(); gvUserInfo.DataSource = sdr; gvUserInfo.DataBind(); conn.Close(); 

数据集

DataSet是一个不连通的定向体系结构,意味着在使用数据集时不需要主动连接,它是DataTables和表之间关系的集合。 它用于保存多个数据表。 您可以select数据表格,根据表格创build视图,并通过关系询问子行。 DataSet还提供了丰富的function,如将数据保存为XML和加载XML数据。

 SqlConnection conn = new SqlConnection("Data Source=abc;Integrated Security=true;Initial Catalog=Test"); conn.Open(); SqlCommand cmd = new SqlCommand("Select UserName, First Name,LastName,Location FROM Users", conn); SqlDataAdapter sda = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); da.Fill(ds); gvUserInfo.DataSource = ds; gvUserInfo.DataBind();