本文的发布号曾为 CHS308507
概要
本文包含 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 对象的 InsertCommand、 UpdateCommand 和 DeleteCommand 属性用运行于 DataSet 对象上的数据修改来更新数据库。 这些属性是用于指定 INSERT、UPDATE 和 DELETE Transact-SQL 命令的 SqlCommand 对象,这些命令用于将数据集修改传递到目标数据库中。 分配给这些属性的 SqlCommand 对象可以用代码手动创建,也可以通过使用 SqlCommandBuilder 对象自动生成。
本文中的第一个代码示例演示如何使用 SqlCommandBuilder 对象自动生成 SqlDataAdapter 对象的 UpdateCommand 属性。 第二个示例使用一个不能使用自动命令生成的方案,以便演示如何手动创建 SqlCommand 对象并将其用作 SqlDataAdapter 对象的 UpdateCommand 属性。
返回页首
创建示例 SQL Server 表
若要创建示例 SQL Server 表(可用在本文中介绍的 Visual Basic .NET 代码示例中),请按照下列步骤操作:- 打开 SQL Server 查询分析器,然后连接到要在其中创建示例表的数据库。 本文中的代码示例使用 SQL Server 附带的罗斯文 (Northwind) 数据库。
- 运行以下 Transact-SQL 语句以创建名为 CustTest 的示例表,然后向该表中插入一个记录:
Create Table CustTest ( CustID int primary key, CustName varchar(20) ) Insert into CustTest values(1,'John')
代码示例 1 - 自动生成的命令
如果用于检索填充 DataSet 的数据的 SELECT 语句基于单个数据库表,则可利用 CommandBuilder 对象自动生成 DataAdapter 的 DeleteCommand、 InsertCommand 和 UpdateCommand 属性。 这将简化并减少执行插入、更新和删除操作所必需的代码。作为最低要求,必须设置 SelectCommand 属性才能使自动命令生成有效。 SelectCommand 检索的表架构决定自动生成的 INSERT、UPDATE 和 DELETE 语句的语法。
SelectCommand 还必须至少返回一个主键或唯一列。 如果什么也没有,则生成 InvalidOperation 异常,且不生成这些命令。
若要创建示例 Visual C# .NET 控制台应用程序(演示如何使用 SqlCommandBuilder 对象自动生成 SqlDataAdapter 对象的 DeleteCommand、 InsertCommand 和 UpdateCommand SqlCommand 对象属性),请按照下列步骤操作:
- 新建一个 Visual C# .NET 控制台应用程序。
- 将 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(); } } }
- 修改以下代码以反映您的 SQL Server 和凭据:
cn.ConnectionString = "Server=server;Database=northwind;UID=login;PWD=password;";
- 保存并运行该应用程序。将打开一个控制台窗口并显示以下输出:
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
- 按任意键以关闭控制台窗口并停止应用程序。
代码示例 2 - 手动创建和初始化 UpdateCommand 属性
代码示例 1 生成的输出表明用于自动生成 UPDATE 语句的命令的逻辑是基于乐观并发的。也就是说,记录没有为进行编辑而被锁定,而且随时可以由其他用户或进程修改。 因为记录在从 SELECT 语句返回之后、UPDATE 语句发出之前可能已被修改,所以自动生成的 UPDATE 语句包含 WHERE 子句,以便只在行包含所有原始值并且未被删除时才更新行。 这样做的目的在于避免改写新数据。 如果自动生成的更新尝试更新的行已被删除或不包含在 DataSet 中找到的原始值,则该命令不影响任何记录并生成 DBConcurrencyException。如果您希望 UPDATE 语句不管原始值是否存在都完成,则必须显式设置 DataAdapter 的 UpdateCommand 而不是依赖自动命令生成。
若要手动创建和初始化代码示例 1 中使用的 SqlDataAdapter 对象的 UpdateCommand 属性,请按照下列步骤操作:
- 将 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();
- 修改以下代码以反映您的 SQL Server 和凭据:
cn.ConnectionString = "Server=server;Database=northwind;UID=login;PWD=password;";
- 运行“代码示例 1 - 自动生成的命令”一节中的第 1 步到第 4 步。 请注意,不再生成 DBConcurrencyException 错误信息。
这篇文章中的信息适用于:
- Microsoft ADO .NET(包含在 .NET 框架中)
- Microsoft Visual C# .NET (2002)
最近更新: | 2002-2-24 (1.0) |
关键字 | kbDSupport kbGrpDSVBDB kbhowto kbHOWTOmaster KB308507 |