308507 HOW TO: 在 Visual C# .NET 中使用 SqlDataAdapter 对象更新 SQL Server 数据库 (From MKBA)

本文的发布号曾为 CHS308507
有关本文的 Microsoft Visual Basic .NET 版本,请参见 Q308055

概要

本文包含 Microsoft Visual C# .NET 代码示例,这些示例演示如何使用 SqlDataAdapter 对象,用运行在 DataSet 对象上的数据修改更新 SQL Server 数据库, DataSet 对象用该数据库中某个表的数据进行填充。

返回页首

要求

以下项目介绍了推荐使用的硬件、软件、网络基础结构、技巧、知识和所需的 Service Pack。
  • Microsoft Windows 2000 专业版、Windows 2000 Server、Windows 2000 Advanced Server 或 Windows NT 4.0 Server
  • Microsoft Visual Studio .NET
  • Microsoft SQL Server 7.0 或更高版本
本文假定您熟悉下列主题:
  • Visual Basic .NET
  • ADO .NET 基础和语法
返回页首

技术说明

SqlDataAdapter 对象是 ActiveX Data Objects (ADO) .NET DataSet 对象和 SQL Server 数据库之间的桥梁。 它是可用于执行以下操作的中间对象:用从 SQL Server 数据库检索到的数据填充 ADO .NET 数据集,然后更新数据库以反映通过使用 DataSet 对象对数据进行的更改(如插入、更新和删除)。

SqlDataAdapter 对象的 InsertCommandUpdateCommand DeleteCommand 属性用运行于 DataSet 对象上的数据修改来更新数据库。 这些属性是用于指定 INSERT、UPDATE 和 DELETE Transact-SQL 命令的 SqlCommand 对象,这些命令用于将数据集修改传递到目标数据库中。 分配给这些属性的 SqlCommand 对象可以用代码手动创建,也可以通过使用 SqlCommandBuilder 对象自动生成。

本文中的第一个代码示例演示如何使用 SqlCommandBuilder 对象自动生成 SqlDataAdapter 对象的 UpdateCommand 属性。 第二个示例使用一个不能使用自动命令生成的方案,以便演示如何手动创建 SqlCommand 对象并将其用作 SqlDataAdapter 对象的 UpdateCommand 属性。

返回页首
创建示例 SQL Server 表
若要创建示例 SQL Server 表(可用在本文中介绍的 Visual Basic .NET 代码示例中),请按照下列步骤操作:
  1. 打开 SQL Server 查询分析器,然后连接到要在其中创建示例表的数据库。 本文中的代码示例使用 SQL Server 附带的罗斯文 (Northwind) 数据库。
  2. 运行以下 Transact-SQL 语句以创建名为 CustTest 的示例表,然后向该表中插入一个记录:
    Create Table CustTest
    (
     CustID int primary key,
     CustName varchar(20)
    )
    
    Insert into CustTest values(1,'John')
返回页首
代码示例 1 - 自动生成的命令
如果用于检索填充 DataSet 的数据的 SELECT 语句基于单个数据库表,则可利用 CommandBuilder 对象自动生成 DataAdapter DeleteCommandInsertCommand UpdateCommand 属性。 这将简化并减少执行插入、更新和删除操作所必需的代码。

作为最低要求,必须设置 SelectCommand 属性才能使自动命令生成有效。 SelectCommand 检索的表架构决定自动生成的 INSERT、UPDATE 和 DELETE 语句的语法。

SelectCommand 还必须至少返回一个主键或唯一列。 如果什么也没有,则生成 InvalidOperation 异常,且不生成这些命令。

若要创建示例 Visual C# .NET 控制台应用程序(演示如何使用 SqlCommandBuilder 对象自动生成 SqlDataAdapter 对象的 DeleteCommandInsertCommand UpdateCommand SqlCommand 对象属性),请按照下列步骤操作:
  1. 新建一个 Visual C# .NET 控制台应用程序。
  2. 将 Class1 的默认内容替换为以下代码:
    using System.Data;
    using System.Data.SqlClient;
    using System;
    namespace Q308507 {
    class Class1 {
    static void Main(string[] args)	{
      
            SqlConnection cn = new SqlConnection();
            DataSet CustomersDataSet = new DataSet();
            SqlDataAdapter da;
            SqlCommandBuilder cmdBuilder;
      
            //Set the connection string of the SqlConnection object to connect
            //to the SQL Server database in which you created the sample
            //table.
            cn.ConnectionString = "Server=server;Database=northwind;UID=login;PWD=password;";
    
    cn.Open();      
    
            //Initialize the SqlDataAdapter object by specifying a Select command 
            //that retrieves data from the sample table.
            da = new SqlDataAdapter("select * from CustTest order by CustId", cn);
    
            //Initialize the SqlCommandBuilder object to automatically generate and initialize
            //the UpdateCommand, InsertCommand, and DeleteCommand properties of the SqlDataAdapter.
            cmdBuilder = new SqlCommandBuilder(da);
    
            //Populate the dataset by running the Fill method of the SqlDataAdapter.
            da.Fill(CustomersDataSet, "Customers");
    
            //Display the Update, Insert, and Delete commands that were automatically generated
            //by the SqlCommandBuilder object.
            Console.WriteLine("Update command Generated by the Command Builder : ");
            Console.WriteLine("==================================================");
            Console.WriteLine(cmdBuilder.GetUpdateCommand().CommandText);
            Console.WriteLine("         ");
    
            Console.WriteLine("Insert command Generated by the Command Builder : ");
            Console.WriteLine("==================================================");
            Console.WriteLine(cmdBuilder.GetInsertCommand().CommandText);
            Console.WriteLine("         ");        
    
            Console.WriteLine("Delete command Generated by the Command Builder : ");
            Console.WriteLine("==================================================");
            Console.WriteLine(cmdBuilder.GetDeleteCommand().CommandText);
    	Console.WriteLine("         ");
    
            //Write out the value in the CustName field before updating the data using the DataSet.
            Console.WriteLine("Customer Name before Update : " + CustomersDataSet.Tables["Customers"].Rows[0]["CustName"]);
    
            //Modify the value of the CustName field.
            CustomersDataSet.Tables["Customers"].Rows[0]["CustName"] = "Jack";
    
            //Post the data modification to the database.
            da.Update(CustomersDataSet, "Customers");        
    
            Console.WriteLine("Customer Name updated successfully");
    
            //Close the database connection.
    cn.Close();
    
            //Pause
    Console.ReadLine();
          }
       }
    }
  3. 修改以下代码以反映您的 SQL Server 和凭据:
    cn.ConnectionString = "Server=server;Database=northwind;UID=login;PWD=password;";
  4. 保存并运行该应用程序。将打开一个控制台窗口并显示以下输出:
    Update command Generated by the Command Builder : 
    ==================================================
    UPDATE CustTest SET CustID = @p1 , CustName = @p2 WHERE ( CustID = @p3 AND CustName = @p4 )
             
    Insert command Generated by the Command Builder : 
    ==================================================
    INSERT INTO CustTest( CustID , CustName ) VALUES ( @p1 , @p2 )
             
    Delete command Generated by the Command Builder : 
    ==================================================
    DELETE FROM  CustTest WHERE ( CustID = @p1 AND CustName = @p2 )   
          
    Customer Name before Update : John
    Customer Name updated successfully
  5. 按任意键以关闭控制台窗口并停止应用程序。
返回页首
代码示例 2 - 手动创建和初始化 UpdateCommand 属性
代码示例 1 生成的输出表明用于自动生成 UPDATE 语句的命令的逻辑是基于乐观并发的。也就是说,记录没有为进行编辑而被锁定,而且随时可以由其他用户或进程修改。 因为记录在从 SELECT 语句返回之后、UPDATE 语句发出之前可能已被修改,所以自动生成的 UPDATE 语句包含 WHERE 子句,以便只在行包含所有原始值并且未被删除时才更新行。 这样做的目的在于避免改写新数据。 如果自动生成的更新尝试更新的行已被删除或不包含在 DataSet 中找到的原始值,则该命令不影响任何记录并生成 DBConcurrencyException

如果您希望 UPDATE 语句不管原始值是否存在都完成,则必须显式设置 DataAdapter UpdateCommand 而不是依赖自动命令生成。

若要手动创建和初始化代码示例 1 中使用的 SqlDataAdapter 对象的 UpdateCommand 属性,请按照下列步骤操作:
  1. 将 Class1 的 Main 函数中的现有代码替换为以下代码,Class1 位于在代码示例 1 中创建的 C# .NET 控制台应用程序中:
    SqlConnection cn = new SqlConnection();
    DataSet CustomersDataSet = new DataSet();
    SqlDataAdapter da;
    SqlCommand DAUpdateCmd;
    
    cn.ConnectionString = "Server=server;Database=northwind;UID=login;PWD=password;";
    cn.Open();
    
    da = new SqlDataAdapter("select * from CustTest order by CustId", cn);
    
    //Initialize the SqlCommand object that will be used as the UpdateCommand for the DataAdapter.
    
    //Note that the WHERE clause uses only the CustId field to locate the record to be updated.
    DAUpdateCmd = new SqlCommand("Update CustTest set CustName = @pCustName where CustId = @pCustId", da.SelectCommand.Connection);
    
    //Create and append the parameters for the Update command.
    DAUpdateCmd.Parameters.Add(new SqlParameter("@pCustName", SqlDbType.VarChar));
    DAUpdateCmd.Parameters["@pCustName"].SourceVersion = DataRowVersion.Current;
    DAUpdateCmd.Parameters["@pCustName"].SourceColumn = "CustName";
    
    DAUpdateCmd.Parameters.Add(new SqlParameter("@pCustId", SqlDbType.Int));
    DAUpdateCmd.Parameters["@pCustId"].SourceVersion = DataRowVersion.Original;
    DAUpdateCmd.Parameters["@pCustId"].SourceColumn = "CustId";
    
    //Assign the SqlCommand to the UpdateCommand property of the SqlDataAdapter.
    da.UpdateCommand = DAUpdateCmd;        
    da.Fill(CustomersDataSet, "Customers");        
    
    Console.WriteLine("Customer Name before Update : " + CustomersDataSet.Tables["Customers"].Rows[0]["CustName"]);
    CustomersDataSet.Tables["Customers"].Rows[0]["CustName"] = "Jack";
    da.Update(CustomersDataSet, "Customers");        
    
    Console.WriteLine("Customer Name updated successfully");
    
    cn.Close();
    Console.ReadLine();
  2. 修改以下代码以反映您的 SQL Server 和凭据:
    cn.ConnectionString = "Server=server;Database=northwind;UID=login;PWD=password;";
  3. 运行“代码示例 1 - 自动生成的命令”一节中的第 1 步到第 4 步。 请注意,不再生成 DBConcurrencyException 错误信息。
返回页首

这篇文章中的信息适用于:

  • Microsoft ADO .NET(包含在 .NET 框架中)
  • Microsoft Visual C# .NET (2002)
最近更新:2002-2-24 (1.0)
关键字kbDSupport kbGrpDSVBDB kbhowto kbHOWTOmaster KB308507
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值