SqlDataAdapter.Fill() vs DataTable.Load()

7

我来自这里,但我的情况有所不同。我需要将结果存储在DataTable中,我有两种潜在的方法:

public static DataTable SelectDataTable(string query, string ConnectionString)
{       
    using (SqlConnection myConnection = new SqlConnection(ConnectionString))
    {
        using (SqlDataAdapter myDataAdapter = new SqlDataAdapter(query, myConnection))
        {
            DataTable dt = new DataTable();
            myDataAdapter.Fill(dt);
            return dt;
        }
    }
}

并且

public static DataTable SelectDataTable(string query, string ConnectionString)
{
    using (SqlConnection myConnection = new SqlConnection(ConnectionString))
    {
        using (SqlCommand cmd = new SqlCommand(query, myConnection))
        {
            myConnection.Open();
            DataTable dt = new DataTable();
            dt.Load(cmd.ExecuteReader(CommandBehavior.CloseConnection));
            return dt;
        }
    }
}

所以我的问题是:

SqlDataAdapter+Fill()SqlDataReader+DataTable+Load()之间有什么区别?

以上两种方法哪种更好?

Joel的回答非常详细,这使得这个问题不是一个重复的问题

事实上,我并没有使用SqlDataReader的所有优点,我只用它来填充一个DataTable,这让我期望得到的答案是:它们一样吗?不幸的是,很难猜测在底层发生了什么。


Joel的回答非常详细,这是什么让这个问题不成立? - Zohar Peled
你可以在这里找到 dr 和 da 的区别答案 - 这是答案 - Pawel
2个回答

1

除非你在处理大数据,否则我不会期望使用DataReader相对于DataAdapter能带来巨大的性能提升。

话虽如此,Pawel 发布的链接有一个 相当不错的文章 解释了两者之间的差异和优势。

最主要的是,读取器只用于读取数据。它们实际上没有做其他任何事情。

因为它们不做太多其他事情,所以它们的性能开销相对较低。

DataAdapter将允许您做比Reader更多的事情,但在您的情况下,听起来您不需要做除读取记录以外的任何事情。

再次强调,除非您正在处理大数据(例如数十万/数百万行),否则我不会期望使用DataReader带来的性能节省非常明显。

这是只有您能够通过自己的数据基准测试来确定的事情。

如果这解决了您对DataAdapter和DataReader之间差异的困惑,请告诉我们。


0
许多年前,我最初使用 DataTable 和 Load。 后来我发现有数据丢失。
我相信我找到了一篇 StackOverFlow 的帖子,建议使用 DataAdapter 和 Fill 来解决这个问题。我照着做了,而且有效。
我有一个模糊的记忆,记得有人评论说 Fill 正确地填充了 Schema 数据,而 Load 没有。但是我可能记错了。就像我说的,那是很多年前的事情了。但是从那以后,我一直使用 Fill。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接