zoukankan      html  css  js  c++  java
  • Linq to sql 增、删、查、改、解决更新过程冲突的方法

    1.以Northwind数据库为例,以下是一个插入并查询显示的过程!

    (Customer是其中的一张表,这里实例化一个,并存入数据库!)

      NorthwindDataContext context = new NorthwindDataContext();
      Customer c = new Customer
      {
          CustomerID = "Test2",
          CompanyName = "Test Company2"
      };
     context.Customer.InsertOnSubmit(c);
     context.SubmitChanges();
      Customer c1 = context.Customers.Single(ct => ct.CustomerID == "Test2");    //查询语句
      Console.WriteLine(c1.CustomerID + "  " + c1.CompanyName);

    2.更新操作

       NorthwindDataContext ctx = new NorthwindDataContext();
       Customer alfki = ctx.Customers.Single(c => c.CustomerID == "ALFKI");   
       Console.WriteLine("Before update, the company name of Alfki is: " + alfki.CompanyName);
       alfki.CompanyName = "New Company Name";
       ctx.SubmitChanges();
       Customer newAlfki = ctx.Customers.Single(c => c.CustomerID == "ALFKI");
       Console.WriteLine("After update, the company name of Alfki is: " + alfki.CompanyName);

    3.删除操作

    //删除
      NorthwindDataContext context= new NorthwindDataContext();
      context.Log = Console.Out;
      IQueryable<Customer> a = context.Customer.Where(o => o.CustomerID.Equals("ALFKI")); 
    context.Customer.DeleteAllOnSubmit(a);
    context.SubmitChanges();

    3.解决更新过程冲突的方法

     数据库数据更新通常会遇到同步冲突的问题,比如获得数据以后,对数据进行一系列的操作,然后把新的数据更新回数据库。如果在数据进行操作的同时,有其它程序或者管理员改动了该数据的值,这样就会发生冲突。到底数据是应该保留现有的值呢还是把改动的值强行更新到数据库呢?Linq to SQL提供了很多方法来解决这种冲突问题。

      还是一段简单的更新代码:

      NorthwindDataContext ctx = new NorthwindDataContext();
    
      Customer alfki = ctx.Customers.Single(c => c.CustomerID == "ALFKI");
    
      alfki.CompanyName = "New Company Name";
    
      ctx.SubmitChanges();
    

     在SubmitChanges()加上断点然后运行,接着在数据库管理器中修改这条记录的CompanyName,最后回到vs界面,继续往下运行,这时会抛出ChangeConflictException,提示该行记录已经被删除或者被修改

    image

     在Linq to SQL中,解决冲突有几种方法:

    1. 在映射字段的Column Attribute中添加UpdateCheck属性
        [Column(Storage="_CompanyName", DbType="NVarChar(40) NOT NULL", CanBeNull=false, UpdateCheck=UpdateCheck.Never)]
        public string CompanyName {

            UpdateCheck的意思是在更新的时候是否检查冲突,分为三种,根据自己的需求进行选择:

    • Always    始终检查
    • Never     从不检查
    • WhenChanged     当数据有改动的时候检查

         2.  使用ObjectChangeConflict的Resolve方法,比如:

      try
      {
          ctx.SubmitChanges();
      }
      catch (ChangeConflictException)
      {
          foreach (ObjectChangeConflict confict in ctx.ChangeConflicts)
          {
              confict.Resolve(RefreshMode.KeepCurrentValues);
          }
      }
      finally
      {
          ctx.SubmitChanges();
      }
    

        这里RefreshMode就是表示解决冲突的方法,也有三种:

    •    KeepChanges  把改变过的属性值更新到数据库,没有改变过的属性值就用数据库的当前值
    •    KeepCurrentValues  把当前所有值更新到数据库
    •    OverwriteCurrentValues 使用数据库的当前值,不做强行更新
  • 相关阅读:
    Codeforces 1485C Floor and Mod (枚举)
    CodeForces 1195D Submarine in the Rybinsk Sea (算贡献)
    CodeForces 1195C Basketball Exercise (线性DP)
    2021年初寒假训练第24场 B. 庆功会(搜索)
    任务分配(dp)
    开发工具的异常现象
    Telink MESH SDK 如何使用PWM
    Telink BLE MESH PWM波的小结
    [LeetCode] 1586. Binary Search Tree Iterator II
    [LeetCode] 1288. Remove Covered Intervals
  • 原文地址:https://www.cnblogs.com/xushaoxin/p/3265069.html
Copyright © 2011-2022 走看看