使用 Visual C# .NET 从数据集对象更新数据库

本文介绍如何使用数据集对象从数据库加载数据、修改数据并更新回数据库的过程。涵盖数据集的概念、数据集对象的创建、数据修改及更新操作。

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

本任务的内容

概要

数据集对象是 Microsoft .NET 框架中数据访问的关键部分,是可保存表、视图和关系的内存中对象。本文介绍了如何获取包含数据(从数据库加载)的 数据集、如何修改此数据,以及接着如何再将其发回数据库以更新原始数据源。

返回页首

要求

下表概括了推荐使用的硬件、软件、网络结构以及所需的服务包:
  • Microsoft Windows 2000 Professional、Microsoft Windows 2000 Server、Microsoft Windows 2000 Advanced Server 或 Microsoft Windows NT 4.0 Server
  • Microsoft SQL Server 7.0 版、Microsoft SQL Server 2000 或安装了 PUBS 示例数据库的 Microsoft Data Engine (MSDE)
  • Microsoft Visual Studio .NET
本文假定您熟悉以下主题:
  • 数据库技术
  • 结构化查询语言 (SQL)
返回页首

如何从数据集对象更新数据库

本节演示如何使用 数据集对象更新数据库中的数据。还可以使用 SqlCommand 对象直接在数据库中插入、更新和删除数据,记住这一点很重要。

如想更好地理解本文,请单击下面的文章编号以查看 Microsoft 知识库中的文章:
  • 314145 HOW TO: Populate a DataSet Object from a Database by Using Visual C# .NET(使用 Visual C# .NET 从数据库填充数据集对象)
314145 一文中讲述了如何从数据库检索数据和将此数据传送到 数据集中,并讲述了为什么 数据集独立于数据库以及它与数据库有何区别。

加载 数据集后,就可以修改数据了。 数据集将跟踪这些更改。 可将 数据集对象视为从数据库检索出的缓存于内存中的数据。 数据集对象由一个包含表、关系和约束的集合构成。

若要更新 数据集并将这些更新发回数据库,请按照下列步骤操作:
  1. 打开 Microsoft Visual Studio .NET。
  2. 在 Visual C# .NET 中新建一个控制台应用程序。 Visual Studio 在默认情况下将创建一个静态类和一个空的 Main() 过程。
  3. 确保该项目包含对 System System.Data 命名空间的引用。对 SystemSystemData System.Data.SqlClient 命名空间使用 using 语句,这样,在后面的代码中就不需要限定这些命名空间中的声明了。必须在任何其他声明之前使用这些语句。
        
    using  System;
    using  System.Data;
    using  System.Data.SqlClient;
  4. 在修改数据并将更改发回数据库之前,必须将该信息加载到 DataSet (数据集)中。 有关详细过程,请参见314145。为避免重复,将不详细提供该步骤中的代码。

    以下代码中的连接字符串指向其“sa”帐户具有空密码的本地计算机(或运行这段代码的计算机)上的 SQL Server。如果需要的话,请用您自己的设置替换该字符串。总之,先创建连接,然后创建数据适配器;该适配器用于将数据填充到 DataSet 中。
        
    string  sConnectionString;

    //  Modify the following string to correctly connect to your SQL Server.
    sConnectionString  =   " Password=;User ID=sa; "
        
    +   " Initial Catalog=pubs; "
        
    +   " Data Source=(local) " ;

    SqlConnection objConn
        
    =   new  SqlConnection(sConnectionString);
    objConn.Open();

    //  Create an instance of a DataAdapter.
    SqlDataAdapter daAuthors 
        
    =   new  SqlDataAdapter( " Select * From Authors " , objConn);

    //  Create an instance of a DataSet, and retrieve data from the Authors table.
    DataSet dsPubs  =   new  DataSet( " Pubs " );
    daAuthors.FillSchema(dsPubs,SchemaType.Source, 
    " Authors " );
    daAuthors.Fill(dsPubs,
    " Authors " );
  5. 现在已经加载了数据,您可以对其进行修改。添加行(或记录)有多种方法。该代码示例使用一个三步式过程:
      • DataTable 获取一个新的 DataRow 对象。
      • 根据需要设置 DataRow 字段的值。
      • 将新对象传递到 DataTable.Rows 集合的 Add 方法中。

    将以下代码粘贴到第 4 步中的代码的后面:
        
    // ****************
    //  BEGIN ADD CODE 
    //  Create a new instance of a DataTable.
    DataTable tblAuthors;
    tblAuthors 
    =  dsPubs.Tables[ " Authors " ];

    DataRow drCurrent;
    //  Obtain a new DataRow object from the DataTable.
    drCurrent  =  tblAuthors.NewRow();

    //  Set the DataRow field values as necessary.
    drCurrent[ " au_id " =   " 993-21-3427 " ;
    drCurrent[
    " au_fname " =   " George " ;
    drCurrent[
    " au_lname " =   " Johnson " ;
    drCurrent[
    " phone " =   " 800 226-0752 " ;
    drCurrent[
    " address " =   " 1956 Arlington Pl. " ;
    drCurrent[
    " city " =   " Winnipeg " ;
    drCurrent[
    " state " =   " MB " ;
    drCurrent[
    " contract " =   1 ;

    //  Pass that new object into the Add method of the DataTable.
    tblAuthors.Rows.Add(drCurrent);
    Console.WriteLine(
    " Add was successful, Click any key to continue!! " );
    Console.ReadLine();

    //  END ADD CODE 
  6. 将以下代码粘贴到第 4 步中的代码的后面:若要编辑现有行,请获取相应的 DataRow 对象,然后为一列或多列提供新值。必须先找到正确的行,由于您加载了表的架构和数据(在第 4 步中对 FillSchema 的调用),因此这一过程非常简单。有了架构,表就知道哪个列是它的主键,同时 Rows 集合的 Find 方法也就可用了。
    Find 方法将返回 DataRow 对象,此对象的主键(在本例中为 au_id)已有了一个具体的值。有了该 DataRow 之后,您就可以修改列了。您无需包装 BeginEdit EndEdit 中的修改,但进行包装可简化 DataSet 必须完成的工作,并且使 DataSet 可以在调用 EndEdit 的同时执行它的验证检查。将以下代码粘贴到 ADD 代码之后:
    // *****************
    //  BEGIN EDIT CODE 

    drCurrent 
    =  tblAuthors.Rows.Find( " 213-46-8915 " );
    drCurrent.BeginEdit();
    drCurrent[
    " phone " =   " 342 "   +  drCurrent[ " phone " ].ToString().Substring( 3 );
    drCurrent.EndEdit();
    Console.WriteLine(
    " Record edited successfully, Click any key to continue!! " );
    Console.ReadLine();

    //  END EDIT CODE  
  7. 将以下代码粘贴到第 4 步中的代码的后面:若要用所有这些更改更新原数据库,请将 DataSet 传递到 DataAdapter 对象的 Update 方法中。

    但是,在您调用 Update 前,必须设置 DataAdapter 对象的 InsertCommandUpdateCommandDeleteCommand 属性。可手动编写 SQL 并用相应的 SqlCommand 对象填充这三个属性,但也可以使用 Visual Studio .NET 自动生成这三个命令。

    若要在需要时生成所需的命令,必须创建 SqlCommandBuilder 对象的实例并在构造函数中使用 DataAdapter。如果想使用此方法(在以下代码示例中阐释),您的表必须有主键信息。若要访问主键信息,请调用 FillSchema,然后将 DataAdapter MissingSchemaAction 属性设置为 AddWithKey,或在代码中手动设置主键。将以下代码粘贴到 EDIT 代码之后:
        
    // *****************
    //  BEGIN SEND CHANGES TO SQL SERVER 

    SqlCommandBuilder objCommandBuilder 
    =   new  SqlCommandBuilder(daAuthors);
    daAuthors.Update(dsPubs, 
    " Authors " );
    Console.WriteLine(
    " SQL Server updated successfully, Check Server explorer to see changes " );
    Console.ReadLine();

    //  END SEND CHANGES TO SQL SERVER
  8. 将以下代码粘贴到第 4 步中的代码的后面:若要完全删除某一行,请使用 DataRow 对象的 Delete 方法。请注意,Rows 集合包含 Remove RemoveAt 两个方法,它们似乎可以删除行,而实际上只是从集合中移除行。只有 Delete 方法才会将删除结果发回源数据库中。将以下代码粘贴到 SEND CHANGES TO SQL SERVER 代码之后:
        
    // *****************
    // BEGIN DELETE CODE 

    drCurrent 
    =  tblAuthors.Rows.Find( " 993-21-3427 " );
    drCurrent.Delete();
    Console.WriteLine(
    " Record deleted successfully, Click any key to continue!! " ); 
    Console.ReadLine();

    // END DELETE CODE 
  9. 将以下代码粘贴到第 4 步中的代码的后面:将这些更改发送到 SQL Server 以移除早先添加的记录。将以下代码粘贴到 DELETE 代码之后:
        
    // *****************
    //  CLEAN UP SQL SERVER
    daAuthors.Update(dsPubs,  " Authors " );
    Console.WriteLine(
    " SQL Server updated successfully, Check Server explorer to see changes " );
    Console.ReadLine();
  10. 将以下代码粘贴到第 4 步中的代码的后面:保存项目。
  11. 将以下代码粘贴到第 4 步中的代码的后面:在调试菜单上,单击开始以运行该项目。请注意,将出现几个消息框,它们指示代码的执行进度并让您能够在执行过程中查看数据的当前状态。
返回页首

完整代码列表

  
using  System;
using  System.Data;
using  System.Data.SqlClient;

namespace  PopulateDataSet
{

///   <summary>
///  Summary description for Class1.
///   </summary>
class  Class1
    {
static   void  Main( string [] args)
        {
            
string  sConnectionString;

//  Modify the following string to correctly connect to your SQL Server.
            sConnectionString  =   " Password=;User ID=sa; "
                
+   " Initial Catalog=pubs; "
+   " Data Source=(local) " ;

            SqlConnection objConn
                
=   new  SqlConnection(sConnectionString);
objConn.Open();

//  Create an instance of a DataAdapter.
            SqlDataAdapter daAuthors 
=   new  SqlDataAdapter( " Select * From Authors " , objConn);

            
//  Create an instance of a DataSet, and retrieve 
            
//  data from the Authors table.
            DataSet dsPubs  =   new  DataSet( " Pubs " );
            daAuthors.FillSchema(dsPubs,SchemaType.Source, 
" Authors " );
            daAuthors.Fill(dsPubs,
" Authors " ); 
            
// ****************
//  BEGIN ADD CODE 
//  Create a new instance of a DataTable.
            DataTable tblAuthors;
tblAuthors 
=  dsPubs.Tables[ " Authors " ];

            DataRow drCurrent;
//  Obtain a new DataRow object from the DataTable.
drCurrent  =  tblAuthors.NewRow();

//  Set the DataRow field values as necessary.
drCurrent[ " au_id " =   " 993-21-3427 " ;
drCurrent[
" au_fname " =   " George " ;
drCurrent[
" au_lname " =   " Johnson " ;
drCurrent[
" phone " =   " 800 226-0752 " ;
drCurrent[
" address " =   " 1956 Arlington Pl. " ;
drCurrent[
" city " =   " Winnipeg " ;
drCurrent[
" state " =   " MB " ;
drCurrent[
" contract " =   1 ;

            
//  Pass that new object into the Add method of the DataTable.
tblAuthors.Rows.Add(drCurrent);
            Console.WriteLine(
" Add was successful, Click any key to continue!! " );
Console.ReadLine();

//  END ADD CODE   
            
// *****************
//  BEGIN EDIT CODE 

drCurrent 
=  tblAuthors.Rows.Find( " 213-46-8915 " );
drCurrent.BeginEdit();
drCurrent[
" phone " =   " 342 "   +  drCurrent[ " phone " ].ToString().Substring( 3 );
drCurrent.EndEdit();
            Console.WriteLine(
" Record edited successfully, Click any key to continue!! " );
Console.ReadLine();
            
//  END EDIT CODE   
            
// *****************
//  BEGIN SEND CHANGES TO SQL SERVER 

            SqlCommandBuilder objCommandBuilder 
=   new  SqlCommandBuilder(daAuthors);
daAuthors.Update(dsPubs, 
" Authors " );
            Console.WriteLine(
" SQL Server updated successfully, Check Server explorer to see changes " );
Console.ReadLine();
            
//  END SEND CHANGES TO SQL SERVER 
            
// *****************
// BEGIN DELETE CODE 

drCurrent 
=  tblAuthors.Rows.Find( " 993-21-3427 " );
drCurrent.Delete();
            Console.WriteLine(
" SRecord deleted successfully, Click any key to continue!! " ); 
Console.ReadLine();
       
// END DELETE CODE  
            
// *****************
//  CLEAN UP SQL SERVER
daAuthors.Update(dsPubs,  " Authors " );
            Console.WriteLine(
" SQL Server updated successfully, Check Server explorer to see changes " );
Console.ReadLine();             
            
        }
    }
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值