从某个数据库表导入数据时,使用哪种方法效率更高:DataAdapter 和 DataSet 还是 DataReader?
6 回答
我会选择你最喜欢的那个,一旦你发现使用其中一个的瓶颈就决定优化。如果您只是在计划一个新应用程序,那么让它以 Okay 的性能工作比陷入尝试选择“最佳”方法更有意义。
Use case is important here. How are you going to use the data once it's marshaled into your application?
If you need only iterate through it, a DataReader has the least memory overhead of your listed technologies.
DataAdapter provides more capabilities in exchange for more memory, and is specificaly going to involve the overhead of DataTable. This is in exchange for a more convenient API.
DataSet is heaviest (before you get to typed datasets, at least), but provides the abilitiy to get in-memory relationships between DataRows.
There is a range of capabilities versus cost in terms of memory and programming efficiency - memory is relatively cheap in many use cases, and programmer time and maintainability of code may be more important in the long run.
在后台,DataAdapter 使用 DataReader 实际查询数据并填充数据表/数据集。所以一天结束时,使用哪一个并不重要,但我建议使用 DataAdapter,因为它更容易编写代码,并且不易出错。
数据阅读器将以渐进的方式读取数据,允许您一次处理一行,它快速且重量轻,但主要是向前的。
数据适配器和数据集,实际上使用 DataReader 来获取数据并将结果存储在内存中填充表需要更长的时间,但在此之后访问和更新要快得多,直到您将数据持久化回数据库。
如果速度很重要,请使用数据阅读器,否则使用数据集,因为它更具可读性和可管理性。
因为听起来您正在寻找程序效率。我倾向于使用数据读取器作为访问方法的业务对象类。这将使您能够创建可维护的代码并提高速度。
您可以使用迭代 DataReader 的方法创建一个对象,如下例所示。这给了你所有的速度,在我看来它是相当可维护的。这很可能是 DataSet 为您提供的类型,只是没有更多代码行来概括检索数据所需的功能。
像这样的东西:
public class Table1
{
public int Col1 { get; set; }
public String Col2 { get; set; }
public List<Table1> GetTable1()
{
List<Table1> tableContents = new List<Table1>();
SqlCommand cmd = new SqlCommand("SELECT * FROM Table1");
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
tableContents.Add(new Table1
{
Col1 = (int)rdr["Col1"],
Col2 = (string)rdr["Col2"]
});
}
return tableContents;
}
}
方法很多,希望对你有帮助
DataReader 比 DataAdapter 更“有效”,但它有局限性。这可能是最适合您的问题的方法,但如果没有更多细节,很难说。
正如约翰所说,获得可行的解决方案可能是您的首要任务。