ADO.NET时间戳使用

出处http://support.microsoft.com/zh-cn/kb/317095

技术分享概要

本分步指南使用 Microsoft SQL Server时间戳字段以减少发送到服务器的数据量检测更新冲突。默认情况下, CommandBuilder对象 ( SqlClientCommandBuilderOleDbCommandBuilder) 生成基于所有字段值的碰撞检测。通过使用自定义的UpdateCommand,您可以指定要使用的列。

创建 SQL Server 表

若要创建测试表,并插入一些测试记录,请使用下面的脚本:
CREATE TABLE [tblQ317095] (
[ID] int IDENTITY (1,1) NOT NULL, 
[CharData] varchar (10) NOT NULL,
[TimeStampCol] timestamp NULL)
ALTER TABLE [tblQ317095] WITH NOCHECK ADD CONSTRAINT [PK_tblQ317095] PRIMARY KEY ([ID])
INSERT INTO tblQ317095 ([CharData]) VALUES (‘AAA‘)
INSERT INTO tblQ317095 ([CharData]) VALUES (‘BBB‘)
INSERT INTO tblQ317095 ([CharData]) VALUES (‘CCC‘)
				

创建 Visual C#.NET 应用程序

  1. 创建一个新 Visual C#.NET Windows 应用程序。
  2. 从工具箱中的Windows 窗体选项卡,向窗体添加下列控件:
    • 将一个按钮控件添加为cmdUpdate。
    • txtID、 以及 txtCharData,txtTimeStamp 添加三个 文本框 控件。(设 txtIDtxtTimeStamp只读,以显示这些字段不能被更新)。
    • 添加一个DataGrid控件。
  3. 系统System.Data.SqlClient 命名空间上使用 using 语句,以使您无需限定在以后在代码中的这些命名空间中声明。下面的代码添加到 Form1 的通用声明部分:
    using System.Data;
    using System.Data.SqlClient;
    					
  4. 向该类中添加以下声明:
    SqlConnection con = new SqlConnection();
    SqlDataAdapter da;
    DataSet ds = new DataSet();
    SqlCommand daUpdateCommand;
    DataTable dt;
    					
  5. 将下面的代码添加到Form_Load事件:
    con.ConnectionString = "Server=(local);Database=pubs;Trusted_Connection=yes;";
    con.Open();
    da = new SqlDataAdapter("SELECT * FROM tblQ317095 ORDER BY ID", con);
    daUpdateCommand = new SqlCommand("UPDATE tblQ317095 SET CharData = @pCharData WHERE TimeStampCol = @pTimeStamp",da.SelectCommand.Connection);
    
    //This is the field that you are updating.
    daUpdateCommand.Parameters.Add(new SqlParameter("@pCharData", SqlDbType.VarChar, 10));
    daUpdateCommand.Parameters["@pCharData"].SourceVersion = DataRowVersion.Current;
    daUpdateCommand.Parameters["@pCharData"].SourceColumn = "CharData";
    
    //Use the TimeStamp to locate your row.
    daUpdateCommand.Parameters.Add(new SqlParameter("@pTimeStamp", SqlDbType.Binary));
    daUpdateCommand.Parameters["@pTimeStamp"].SourceVersion=DataRowVersion.Original;
    daUpdateCommand.Parameters["@pTimeStamp"].SourceColumn = "TimeStampCol";
    
    da.UpdateCommand = daUpdateCommand;
    //Fetch the data.
    da.FillSchema(ds, SchemaType.Source, "tblQ317095");
    da.Fill(ds, "tblQ317095");
    dt=ds.Tables["tblQ317095"];
    //Show the data in the textboxes.
    
    txtID.Text = dt.Rows[0][0].ToString() ;
    txtCharData.Text =dt.Rows[0][1].ToString() ;
    txtTimeStamp.Text= dt.Rows[0][2].ToString();
    					
  6. 修改 (在步骤 5 中的代码的第一行) 中的连接字符串属性对应于您的 SQL Server 连接信息。请确保您连接到数据库运行的 SQL 脚本,以创建测试表。
  7. 将下面的代码添加到cmdUpdate_Click事件:
    dt.Rows[0]["CharData"] = txtCharData.Text;
    try
    {
    	da.Update(dt);
    	MessageBox.Show("Update was successful");
    }
    catch (System.Data.DBConcurrencyException dbException)
    {
    	MessageBox.Show(dbException.Message.ToString());
    	DataSet DsModified;
    	DsModified = ds.GetChanges(DataRowState.Modified);
    	dataGrid1.DataSource = DsModified.Tables[0];
    	dataGrid1.CaptionText = "Modified Rows";
    	ds.RejectChanges();
    }
    catch (Exception genException)
    {
    	MessageBox.Show(genException.Message);
    }
    		
    con.Close();			
    					

C#.NET 应用程序进行测试

  1. 运行应用程序 (在Form_Load事件中提取数据),请在调试菜单上单击开始
  2. 在查询分析器 (或企业管理器),更新为新值的记录 #1 中的CharData字段。
  3. 返回到应用程序并将CharData更改为一个不同的值。
  4. 单击窗体上的按钮。请注意您会收到一个异常。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。