• DataAdapter数据集DataSet和数据库的同步(4):数据适配器事件


    /*--===------------------------------------------===---
    CommandBuilder:
    如果DataTable映射到单个数据库表或者从单个数据库表生成,
    可以利用CommandBuilder对象自动生成DataAdapter的3个命令:
    DeleteCommand, UpdateCommand, InsertCommand.

    为了生成Insert,Update,Delete语句,CommandBuilder会自动
    使用SelectCommand属性来检索所需的元数据集.
    SelectComandText里面必须要有主键字段,否则无法Builder~!

    ★数据适配器事件★
    1.OnRowUpdating:在数据行更新前执行
    2.OnRowUpdated:在数据行更新后执行,可以检查单条更新于巨的执行结果.
    其EventArgs属性表如下
        Command    要执行的数据库命令
        Errors        错误
        Row        要更新的行
        StatementType    要执行的命令类型,可能为增删改查之一
        RecordsAffected    要影响的行数
        TableMapping    更新所使用的DataTableMapping

                许明会    2007年12月22日 23:24:25
    --===------------------------------------------===---
    */

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

    namespace xumh
    {
        
    public class runMyApp
        
    {
            
    static void ShowTable(DataTable dataTable)
            
    {
                
    foreach(DataRow row in dataTable.Rows)
                
    {
                    
    for(int i=0;i<dataTable.Columns.Count; i++)
                        Console.Write(
    "{0}\t",row[i]);
                    Console.WriteLine();
                }

            }


            
    static void Main()
            
    {
                SqlConnection cn 
    = new SqlConnection(@"server=.; database=northwind; integrated security=true ");
                
    //预订事件
                SqlDataAdapter da = new SqlDataAdapter("select employeeid,firstname,lastname,title from employees",cn);
                da.RowUpdating 
    += new SqlRowUpdatingEventHandler(Updating);
                da.RowUpdated 
    += new SqlRowUpdatedEventHandler(Updated);
                
                
    //显示原始数据
                DataSet dsEmployees = new DataSet();
                da.Fill(dsEmployees);
                ShowTable(dsEmployees.Tables[
    0]);
                
    //更改数据
                Console.ReadLine();
                dsEmployees.Tables[
    0].Rows[0]["FirstName"= "Nancy"//XuMinghui
                SqlCommandBuilder builder = new SqlCommandBuilder(da);//SqlCommandBuilder
                
    //Console.WriteLine(da.UpdateCommand.CommandText);//查看自动生成的CommandText
                da.Update(dsEmployees);
                ShowTable(dsEmployees.Tables[
    0]);
            }

            
    //Updating:控制数据集的共享冲突,数据行只能被修改一次
            static void Updating(object adapter, SqlRowUpdatingEventArgs e)
            
    {
                Console.WriteLine(
    "RowUpdating:"+e.StatementType.ToString());
                
    switch(e.StatementType)
                
    {
                    
    case StatementType.Update:
                    
    {
                        SqlConnection cn 
    = new SqlConnection(@"server=.; database=northwind; integrated security=true ");
                        
    string strCmd = "select firstname,lastname from employees where firstname='"
                            
    + e.Row["firstname",DataRowVersion.Original] +"'";
                        
    //上面,取firstname得原始值,如果数据库中查不到,证明正在试图修改已经修改过的数据集
                        SqlCommand cmd = new SqlCommand(strCmd,cn);
                        cn.Open();
                        
    if(0==cmd.ExecuteNonQuery())
                        
    {
                            Console.WriteLine(
    "数据已经修改过,数据集过时!");
                            e.Status 
    = UpdateStatus.ErrorsOccurred; //报错
                        }

                        cn.Close();
                        
    break;
                    }

                }

            }

            
    //Updated:更新出错,继续处理
            static void Updated(object adapter, SqlRowUpdatedEventArgs e)
            
    {
                
    if(e.StatementType == StatementType.Update)
                
    {
                    
    if(e.Status == UpdateStatus.ErrorsOccurred)
                        e.Status 
    = UpdateStatus.SkipCurrentRow;//更新出错,继续处理
                }

            }

        }

    }
  • 相关阅读:
    服务器日常维护
    每日哲言
    JAVA经典算法40题(原题+分析)之分析
    如何在苹果笔记本上装win7系统
    酷派改变者S1(C105/C105-6/C105-8) 解锁BootLoader 并刷入recovery root
    努比亚 Z17 mini s (Nubia NX589J) 解锁BootLoader 并刷入recovery ROOT
    努比亚 Z17s (Nubia NX595J) 解锁BootLoader 并刷入recovery ROOT
    努比亚 N2(Nubia NX575J) 解锁BootLoader 并进入临时recovery ROOT
    三星A3、A5、A7、G7、J5、J7、S6系列等新机型的部分手机解锁 ROOT刷机
    [2月1号] 努比亚全机型ROM贴 最全最新NubiaUI5.0 ROOT 极速体验
  • 原文地址:https://www.cnblogs.com/flaaash/p/1011129.html
Copyright © 2020-2023  润新知