ADO.NET_数据库访问断开模式

本文深入探讨了数据集(DataSet)与DataAdapter在数据库应用中的角色与功能,包括如何填充数据集、更新数据以及使用SqlCommandBuilder生成协调SQL语句以实现数据与数据库的同步。重点介绍了DataAdapter对象在数据库交互过程中的作用,以及SqlDataAdapter作为具体实现的实例,展示了其在SQLServer数据库场景下的应用。此外,文章还阐述了如何通过SqlCommandBuilder自动生成单表更新的T-SQL语句,以确保本地数据集的更改能够准确地反映在关联的数据库实例中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DataSet - 数据集 - 是支持N层模式及XML交换的重要部分。它特别应用于要进行大量数据处理而不需要与数据库进行交互的情况下。

【DataAdapter对象】表示一组 SQL 命令和一个数据库连接,它们用于填充 DataSet 和更新数据源。

DataAdapter 用作 DataSet 和数据源之间的桥接器以便检索和保存数据。DataAdapter 通过映射 Fill(这更改了 DataSet 中的数据以便与数据源中的数据相匹配)和 Update(这更改了数据源中的数据以便与 DataSet 中的数据相匹配)来提供这一桥接器。

如果所连接的是 SQL Server 数据库,则可以通过将 SqlDataAdapter 与关联的 SqlCommand 和 SqlConnection 对象一起使用,从而提高总体性能。对于支持 OLE DB 的数据源,请使用 DataAdapter 及其关联的 OleDbCommand 和 OleDbConnection 对象。对于支持 ODBC 的数据源,请使用 DataAdapter 及其关联的 OdbcCommand 和 OdbcConnection 对象。对于 Oracle 数据库,请使用 DataAdapter 及其关联的 OracleCommand 和 OracleConnection 对象。

当创建 DataAdapter 的实例时,读/写属性将被设置为初始值。
【DataAdapter对象】

【.NET 提供程序及其 DataAdapter 类】
.NET Framework 数据提供程序DataAdapter 类
SQL 数据提供程序SqlDataAdapter
OLE DB 数据提供程序OleDbDataAdapter
Oracle 数据提供程序OracleDataAdapter
ODBC 数据提供程序OdbcDataAdapter
【SqlDataAdapter对象】表示用于填充 DataSet 和更新 SQL Server 数据库的一组数据命令和一个数据库连接。无法继承此类。

SqlDataAdapter 是 DataSet 和 SQL Server 之间的桥接器,用于检索和保存数据。SqlDataAdapter 通过对数据源使用适当的 Transact-SQL 语句映射 Fill(它可更改 DataSet 中的数据以匹配数据源中的数据)和 Update(它可更改数据源中的数据以匹配 DataSet 中的数据)来提供这一桥接。更新是逐行进行的。对于每个已插入、修改和删除的行,Update 方法会确定已对其执行的更改的类型(Insert、Update 或 Delete)。根据更改类型,执行 Insert、Update 或 Delete 命令模板将已修改的行传播给数据源。当 SqlDataAdapter 填充 DataSet 时,它为返回的数据创建必需的表和列(如果这些表和列尚不存在)。但是,除非 MissingSchemaAction 属性设置为 AddWithKey,否则这个隐式创建的架构中不包括主键信息。也可以使用 FillSchema,让 SqlDataAdapter 创建 DataSet 的架构,并在用数据填充它之前就将主键信息包括进去。

SqlDataAdapter 与 SqlConnection 和 SqlCommand 一起使用,以便在连接到 SQL Server 数据库时提高性能。

SqlDataAdapter 还包括 SelectCommand、InsertCommand、DeleteCommand、UpdateCommand 和 TableMappings 属性,以便于数据的加载和更新。

当创建 SqlDataAdapter 的实例时,读/写属性将被设置为初始值。

InsertCommand、DeleteCommand 和 UpdateCommand 是泛型模板,通过参数机制由来自每个修改行的各个值自动填充。

对于传播给 Update 上的数据源的每一列,应向 InsertCommand、UpdateCommand 或 DeleteCommand 添加一个参数。DbParameter 对象的 SourceColumn 属性将被设置为列的名称。此设置指示该参数值并非手动设置,而是获取自当前处理的行中的特定列。
【SqlDataAdapter常用属性】
  • AcceptChangesDuringFill
    决定在把行复制到DataTable中时对行所做的修改是否可以接受
  • DeleteCommand
    获取或设置一个 Transact-SQL 语句或存储过程,以从数据集删除记录。
  • InsertCommand
    获取或设置一个 Transact-SQL 语句或存储过程,以在数据源中插入新记录。
  • SelectCommand
    获取或设置一个 Transact-SQL 语句或存储过程,用于在数据源中选择记录。
  • TableMappings
    容纳一个集合,该集合提供返回行和数据集之间的主映射
  • UpdateCommand
    获取或设置一个 Transact-SQL 语句或存储过程,用于更新数据源中的记录。
【SqlDataAdapter常用方法】
  • Fill()
    用于添加或刷新数据集,以便使数据集与数据源匹配
  • FillSchema()
    用于在数据集中添加DataTable,以便与数据源的结构匹配
  • Update()
    将DataSet里面的数值存储到数据库服务器上
【构建DataAdapter对象】
  • SqlDataAdapter sda = new SqlDataAdapter();
    //创建适配器时,必须单独设置它的属性。
  • SqlDataAdapter sda = new SqlDataAdapter(cmd);
    //接受Command对象作为参数。这个Command对象将被分配给SelectCommand属性。
  • SqlDataAdapter sda = new SqlDataAdapter(sSqlSelect, conn);
    //用 SelectCommand 和一个连接字符串初始化 SqlDataAdapter 类的新实例。
  • SqlDataAdapter sda = new SqlDataAdapter(sSqlSelect, sConnString);
    //用 SelectCommand 和一个连接字符串初始化 SqlDataAdapter 类的新实例。
【DataAdapter和DataSet】
  • .NET数据提供程序的任务是用合适的数据填充DataSet对象,并为该数据提供到这个数据库的接口。
  • DataSet对象的功能是,当应用程序在其上运行时,在本地数据,并且维护数据,包括所有的修改、添加和删除。
  • DataAdapter对象将所有的修改发送给数据库,这需要调用对象的Update方法。
  • DataAdapter类:表示一组数据命令和一个数据库连接,它们用于填充DataSet和更新数据源。
  • DataAdapter用作DataSet和数据源之间的桥接器以便检索和保存数据。DataAdapter通过映射Fill(这更改了DataSet中的数据以便与数据源中的数据相匹配)和Update(这更改了数据源中的数据以便与DataSet中的数据相匹配)来提供这一桥接器。
【填充数据集】调用Fill方法,根据SelectCommand属性中的Command对象用数据填充数据集,用于填充的数据将取决于为这个方法提供的参数:
  • Fill(DataSet):从数据存储器填充数据集,并为数据集中所产生的表命名。
  • Fill(DataTable):从数据存储器填充数据表。
  • Fill(dataSet, srcTable):从数据存储器填充数据集中指定表。
  • File(dataSet,startRecord,maxRecords,scrTable):填充数据集指定的数据包(从指定的记录开始,包括要获取的最大记录数)。
如果DataSet数据是从数据库来的, 那么DataAdapter是它们的桥梁.(注意,在更新时要先创建CommandBuilder对象,或设置它们各自的Command, 如InsertCommand等)

SqlConnection con=new SqlConnection("Server=.;"Database=userinfo,uid=sa;pwd=;");
SqlDataAdapter sda=new SqlDataAdapter("Select * from userlogin", con);
DataSet ds=new DataSet();
sda.Fill(ds);
//这里对数据集进行操作
......
//下面代码把对数据集的修改更新回数据库,它用于生成更新语句
SqlCommandBuilder scb=new SqlCommandBuilder(sda);
sda.Update(ds);
【更新数据】
  • 数据集断开与数据存储器的连接时,在本地维护数据。可以在本地修改数据,即更新、添加或删除记录。这些修改不会影响数据库。要保存这些修改,必须调用DataAdapter对象的Update方法。这个方法将使用InsertCommand、UpdateCommand和DeleteCommand属性中的命令,对数据库做一些修改。
  • DataAdapter对象的Update方法:
    • Update(DataRow[]):在所提供的DataRow对象组中更新数据行。
    • Update(DataSet):更新数据集。
    • Update(DataTable):更新数据表。
    • Update(DataSet,srcTable):更新数据集中已标识的表。
  • SqlDataAdapter不会自动生成实现DataSet 的更改与关联的SQL Server实例之间的协调所需的T-SQL语句。
  • 可以创建一个SqlCommandBuilder对象来自动生成用于单表更新的T-SQL 语句。
  • SqlCommandBuilder将生成其他任何未设置的 Transact-SQL 语句。
  • SqlCommandBuilder (SqlDataAdapter)构造函数:使用关联的 SqlDataAdapter对象初始化SqlCommandBuilder类的新实例。
【SqlCommandBuilder对象】自动生成单表命令,用于将对 DataSet 所做的更改与关联的 SQL Server 数据库的更改相协调。无法继承此类。 

SqlDataAdapter 不会自动生成实现 DataSet 的更改与关联的 SQL Server 实例之间的协调所需的 Transact-SQL 语句。但是,如果设置了 SqlDataAdapter 的 SelectCommand 属性,则可以创建一个 SqlCommandBuilder 对象来自动生成用于单表更新的 Transact-SQL 语句。然后,SqlCommandBuilder 将生成其他任何未设置的 Transact-SQL 语句。

每当设置了 DataAdapter 属性,SqlCommandBuilder 就将其本身注册为 RowUpdating 事件的侦听器。一次只能将一个 SqlDataAdapter 与一个 SqlCommandBuilder 对象(或相反)互相关联。

为了生成 INSERT、UPDATE 或 DELETE 语句,SqlCommandBuilder 会自动使用 SelectCommand 属性来检索所需的元数据集。如果在检索到元数据后(例如在第一次更新后)更改 SelectCommand,则应调用 RefreshSchema 方法来更新元数据。

SelectCommand 还必须至少返回一个主键列或唯一的列。如果什么都没有返回,就会产生 InvalidOperation 异常,不生成命令。

SqlCommandBuilder 还使用由 SelectCommand 引用的 Connection、CommandTimeout 和 Transaction 属性。如果修改了这些属性中的一个或多个,或者替换了 SelectCommand 本身,用户则应调用 RefreshSchema。否则,InsertCommand、UpdateCommand 和 DeleteCommand 属性都保留它们以前的值。

如果调用 Dispose,则会解除 SqlCommandBuilder 与 SqlDataAdapter 的关联,并且不再使用生成的命令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜晚回家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值