SqlCommand 还是 SqlDataAdapter?

13

我正在创建类似小型收银应用程序的东西,用于记录客户,雇员,服务,销售和预约。我正在使用Windows表单以及其中的数据网格。我已经创建了我将在应用程序中使用的数据库。我想知道我应该使用SqlCommand-SqlDataReader还是SqlDataAdapter-DataSet。哪种方法更好?


可能是SqlDataAdapter vs SqlDataReader的重复问题。 - John Saunders
可能是SqlDataAdapter vs SqlDataReader的重复问题。 - George Lanetz
6个回答

16

这高度取决于您想要执行的操作类型。

以下是我的建议。

  1. 如果您希望更快地读取数据,请选择SQLDataReader,但这需要在读取之后进行操作。

    开放连接

    读取数据

    关闭连接。 如果忘记关闭连接,则会影响性能。

  2. 选择SQLDataAdapter

    • 如果您希望更快速地读取并利用ADO.net的离线架构的优势
    • 这将自动打开/关闭连接。
    • 还可以自动处理DataSet中的更新回到数据库。(SqlCommandBuilder)
  3. 使用SQLCommand(当您读取SQLDataReader以读取数据时,它也会出现)以及插入和更新。

    • 这将为插入和更新提供更好的性能。

如果您使用的是.NET Framework 3.5 sp1或更高版本,则建议使用Linq to SQL或Entity Framework也可以达到您的目的。

谢谢。


4

SqlDataAdapter

  • SqlDataAdapter会将数据存储在客户端并根据需要更新数据库。因此,它消耗更多的内存。
  • 另一方面,在insert/delete/update/select命令中,您不需要连接到数据库。
  • SqlDataAdapter在内部管理连接,因此您不必担心这个问题。

SqlDataAdapter提供良好的功能是以更多的内存消耗为代价的。通常用于需要多个用户连接到数据库的系统。
因此,如果您不处于这种情况,请选择SqlCommand和连接模式。


3
如果您只是读取数据而不进行更新/插入/删除操作,则使用SqlDataReader速度更快。您还可以将其与DataSet结合使用。如果您使用using语句包装数据访问对象,则运行时会为您处理连接清理逻辑。
我经常使用的同步访问模式类似于以下内容:
DataTable result = new DataTable();
using (SqlConnection conn = new SqlConnection(MyConnectionString))
{
    using (SqlCommand cmd = new SqlCommand(MyQueryText, conn))
    {
        // set CommandType, parameters and SqlDependency here if needed
        conn.Open();
        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            result.Load(reader);
        }
    }
}

如果要进行更新/删除/插入操作,考虑使用SqlDataAdapter可能是值得的,但通常仅当您已经将数据放在DataSet中时才需要。否则,有更快速/更好的方法来完成这些事情。


1
数据适配器是否是插入数百万条记录(我在数据集中有 2-3 百万条记录)的好选择? - Learning-Overthinker-Confused

2

如果您了解这些组件(Core ADO.NET)(Command、Connection、DataAdapter),那么我建议使用Entity Data ModelLinq-SQL

SqlDataAdapter是一个帮助类,它隐式地使用SqlCommandSqlConnectionSqlDataReader


1

DataReader – DataReader是一种只向前、只读的数据流,从数据库中检索数据非常高效,因为每次只有一条记录被带入内存。缺点是:连接对象一次只能包含一个DataReader,所以我们必须在使用完后显式关闭DataReader,这将释放连接供其他用途使用。DataAdapter对象将管理打开和关闭连接以执行命令。

DataAdapter – 表示一组SQL命令和数据库连接,用于填充DataSet并更新数据源。它作为DataSet和数据源之间的桥梁,用于检索和保存数据。DataAdapter通过映射Fill(将DataSet中的数据更改为与数据源匹配的数据)和Update(将数据源中的数据更改为与DataSet中的数据匹配的数据)来提供此桥梁。通过使用DataAdapter,DataAdapter也会根据需要自动打开和关闭连接。


1

SQL命令更易于操作,但不自动化。SQL数据适配器不太容易,但是自动化。

*自动化意味着它可以自动管理服务器的打开和关闭等操作。

它们两者在数据方面具有相同的功能。


您需要通过一些代码片段展示它的优越性。 - NitinSingh

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