根据设计当MakeOld后(在读取数据库后,或者手动调用),对记录(SubSonic生成的类)属性附值时,Sonic会检测这个Value是否与原来的不同,只有值不同时才会附值成功,并将该列添加到DirtyColumns,而DirtyColumns中的列才会被Update采用,一般情况下 只要所有列中有一个列的是Dirty==true(被更改过),那么在Save时就会采用Update,

注意:SubSonic中判断是否采用Update判断“全部字段集合”中是否存在一个字段被更改,而生成Update命令时使用的集合是DirtyColumns集合,而不是直接从全部字段集合中查找那些被更改的字段,在多数情况下不会出问题,但有些时候可能带来意想不到的问题,参考下面的场境3。

//=============参考代码1================

public bool IsDirty
            {
                get
                {
                    foreach(TableColumnSetting setting in this)
                    {
                        if(setting.IsDirty)
                            return true;
                    }
                    return false;
                }
                //set
                //{
                //    foreach (TableColumnSetting setting in this)
                //        setting.IsDirty = value;
                //}
            }

//============参考代码2============

public QueryCommand GetSaveCommand(string userName)
        {
            if(IsNew)
                return GetInsertCommand(userName);

if(IsDirty)
                return GetUpdateCommand(userName);

return null;
        }

如果您对记录未做任何更改而直接调用 .Save()时会根据IsNew与IsDirty的取值来决定采用Insert或Update。

如果两个多是false,那么就返回null.那么Save操作将什么都不做。

//============参考代码3============

QueryCommand cmd = GetSaveCommand(userName);
                if(cmd == null)
                    return;

场境1:

Employe emp=new Employe(1);//加载一个员工数据

//这个时候 IsNew=false,IsDirty=false

emp.Name=emp.Name; //没有改变

emp.Save();//这里的Save方法将不做任何处理

场境2:

Employe emp=new Employe(1);

emp.Name=txtName.txt;//假设您在文本框中调整了Name取值

//这个时候 isNew=false;IsDirty=true;

emp.Save();将使用Update,并且只更新Name字段。

场境3:(报错)

Employe emp=new Employe(1);

Employe backEmp=new Employe();

backEmp.CopyFrom(backEmp);

//copyFrom后会backEmp.IsDirty全部是true

//参考代码7

backEmp.Name="xxxx";

backEmp.MackOld();//将IsNew设置成False

backEmp.Save(); //报错,IsDirty=True,而DirtyColumns为空,

//生成 Update Employe Set Where EmpoyeId=1 这样的错误TSQL

场境4:(报错)

Employe emp=new Employe(1);

Employe backEmp=new Employe();

backEmp.CopyFrom(backEmp);

backEmp.MackOld();

backEmp.Name=backEmp.Name;

backEmp.Save();//这时IsDirty是True,而DirtyColumns为空

正确作法,应该在backEmp.MackOld();后再调用backEmp.MackClear();

//=============参考代码8=================

/// <summary>
        /// Called after any property is set. Sets IsDirty to <c>true</c>.
        /// </summary>
        public void MarkClean()
        {
            foreach(TableSchema.TableColumnSetting setting in columnSettings)
                setting.IsDirty = false;
            DirtyColumns.Clear();
        }

//========参考代码4==========

/// <summary>
        /// Called after Update() invokation. Sets IsNew to <c>false</c>.
        /// </summary>
        public void MarkOld()
        {
            IsLoaded = true;
            _isNew = false;
        }

//========参考代码5======================

/// <summary>
        /// Copies the passed-in instance settings to this instance
        /// </summary>
        /// <param name="copyInstance">The copy instance.</param>
        public void CopyFrom(T copyInstance)
        {
            if(copyInstance == null)
                throw new ArgumentNullException("copyInstance");

foreach(TableSchema.TableColumnSetting setting in copyInstance.columnSettings)
                SetColumnValue(setting.ColumnName, setting.CurrentValue);
        }

//========参考代码6======================

/// <summary>
        /// Sets a value for a particular column in the record
        /// </summary>
        /// <param name="columnName">Name of the column, as defined in the database</param>
        /// <param name="oValue">The value to set the type to</param>
        public void SetColumnValue(string columnName, object oValue)
        {
            columnSettings = columnSettings ?? new TableSchema.TableColumnSettingCollection();

// add the column to the DirtyColumns
            // if this instance has already been loaded
            // and this is a change to existing values
            if(IsLoaded && !IsNew)
            {
                TableSchema.Table schema = GetSchema();
                object oldValue = null;
                string oldValueMsg = "NULL";
                string newValueMsg = "NULL";
                bool areEqualOrBothNull = false;

try
                {
                    oldValue = columnSettings.GetValue(columnName);
                }
                catch {}

if(oldValue == null && oValue == null)
                    areEqualOrBothNull = true;
                else
                {
                    if(oldValue != null)
                    {
                        oldValueMsg = oldValue.ToString();
                        areEqualOrBothNull = oldValue.Equals(oValue);
                    }

if(oValue != null)
                        newValueMsg = oValue.ToString();
                }

TableSchema.TableColumn dirtyCol = schema.GetColumn(columnName);

if(dirtyCol != null && !areEqualOrBothNull)
                {
                    string auditMessage = String.Format("Value changed from {0} to {1}{2}", oldValueMsg, newValueMsg, Environment.NewLine);
                    TableSchema.TableColumn dirtyEntry = DirtyColumns.GetColumn(columnName);
                    if(dirtyEntry != null)
                    {
                        DirtyColumns.Remove(dirtyEntry);
                        auditMessage = String.Concat(dirtyCol.AuditMessage, auditMessage);
                    }

dirtyCol.AuditMessage = auditMessage;
                    DirtyColumns.Add(dirtyCol);
                }
            }

columnSettings.SetValue(columnName, oValue);//这里最终调用参考代码7

}

//============参考代码7============

/// <summary>
            /// Gets or sets the current value.
            /// </summary>
            /// <value>The current value.</value>
            public object CurrentValue
            {
                get { return _currentValue; }
                set
                {
                    if(value == null && _currentValue == null)
                        return;

if(value != null)
                    {
                        if(value.Equals(_currentValue))
                            return;
                    }

_currentValue = value;
                    _isDirty = true;
                }
            }

转载于:https://www.cnblogs.com/wdfrog/archive/2010/06/30/1768159.html

SubSonic中的字段付值--MakeOld Update相关推荐

  1. 【原创】数据库中时间字段的值读取到DataSet中后,毫秒部分丢失。

    数据库中时间字段的值读取到DataSet中后,毫秒部分丢失. 在网上查了些解决方案,说读取时间时,先转化为DateTime类型,然后在ToString("yyyy-MM-dd HH:mm:s ...

  2. java解析sql查询字段_sql解析json格式字段 如何获取json中某个字段的值?

    java将json数据解析为sql语句?小编给你倒一杯热水.可你惦记着其他饮料,所以你将它放置一旁.等你想起那杯水时,可惜它已经变得冰冷刺骨. 图片中是json数据,每个数据的开头都有表名称,操作类型 ...

  3. Oracle怎么获取json类型字符串值,sql解析json格式字段 如何获取json中某个字段的值?...

    java将json数据解析为sql语句?小编给你倒一杯热水.可你惦记着其他饮料,所以你将它放置一旁.等你想起那杯水时,可惜它已经变得冰冷刺骨. 图片中是json数据,每个数据的开头都有表名称,操作类型 ...

  4. Js读取Cookie中指定字段的值,Js中读取某个Cookie,Js中根据Cookie的key得到对应的value,Js正则表达式匹配指定的Cookie

    Js中想要读取Cookie中指定字段的值,可以遍历Cookie根据指定Key提取Cookie,或者使用正则表达式匹配Cookie,代码如下: /*** @description: 遍历cookie得到 ...

  5. 根据list中某个字段的值排序_MySql中常用函数

    一.group_concat group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符']) group_conc ...

  6. 小程序开发--- 1. 获取数组中某个字段的值或获取列表索引

    最近开始自己琢磨开发微信小程序,遇到些问题,现在做一下总结. 今天有遇到一个需要获取到列表中某一项值,并在其他地方调用的问题.其实思路和获取列表索引的道理一样.如果你还不知道如何获取列表的索引,那么现 ...

  7. 关于MySQL中date字段默认值为“0000-00-00 00:00:00“导致MyBatisPlus无法正常list()而报系统异常错误码500的问题

    今天在SpringBoot整合MyBatisPlus的时候,使用自动代码生成的功能,对User表生成了entity.mapper.service代码,之后编写测试类调用userService.list ...

  8. linux下统计log文件中某个字段的值,并计算出平均值

    测试场景:统计log文件output.txt中字段"framesPerSecond"的所有值的平均值 分成两个步骤: 进入对应点log文件所在目录下 第一步:统计出字符串出现的次数 ...

  9. canal同步mysql到kafka_使用Canal同步MySQL数据到Kafka 得到的数据中sql字段无值-问答-阿里云开发者社区-阿里云...

    这个应该跟你的binlog记录模式有关系,binlog有3中模式,ROW(行模式), Statement(语句模式), Mixed(混合模式)三种模式的用法如下: ROW(行模式):记录那条数据修改了 ...

最新文章

  1. 面向对象的基本设计原则【转】
  2. android:Activity启动模式
  3. 4.2.3 OS之减少磁盘延迟时间的方法(交替编号、错位命名)
  4. 深度学习工具那么多,究竟哪款最适合你?| 线下沙龙 × 报名
  5. spring整合mybatis基于xml配置
  6. 剑指offer--替换空格
  7. 凸多边形面积_C++计算任意多边形的面积
  8. android 如何读取cgi_Python基础教程(十):CGI编程、MySQL数据库
  9. 容器编排技术 -- Kubernetes Pod 优先级和抢占
  10. JS身份证合法性校验完全版
  11. JVM优化系列-常用GC参数总结
  12. ram自己写?用IP?
  13. 剑指 只出现一次的数字
  14. 张宇1000题高等数学 第九章 一元函数积分学的计算
  15. matlab三角函数用法
  16. 电力-104规约实际测试2
  17. android微信运动页面开发,微信小程序仿微信运动步数排行(交互)
  18. Tomcat环境搭建与常见问题详解
  19. HTG评论D-Link DWA-192:您渴望的尖叫快速死亡星状Wi-Fi适配器
  20. 申请MallBook分账需要准备哪些材料呢?

热门文章

  1. 进程(并发,并行) join start 进程池 (同步异步)
  2. div 超出高度滚动条,超出宽度点点点
  3. 一个配置web.xml的编程方法
  4. Repeater的嵌套
  5. AIX errdemon 命令
  6. Cacti Plugin Architecture安装
  7. 实体以及实体型和实体集
  8. linux ntp连接失败,linux ntp服务器连接异常
  9. eclipse怎样改编码格式_Eclipse中各种编码格式及设置
  10. 解决AttributeError: 'str' object has no attribute 'decode'报错问题