SubSonic中的字段付值--MakeOld Update
根据设计当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相关推荐
- 【原创】数据库中时间字段的值读取到DataSet中后,毫秒部分丢失。
数据库中时间字段的值读取到DataSet中后,毫秒部分丢失. 在网上查了些解决方案,说读取时间时,先转化为DateTime类型,然后在ToString("yyyy-MM-dd HH:mm:s ...
- java解析sql查询字段_sql解析json格式字段 如何获取json中某个字段的值?
java将json数据解析为sql语句?小编给你倒一杯热水.可你惦记着其他饮料,所以你将它放置一旁.等你想起那杯水时,可惜它已经变得冰冷刺骨. 图片中是json数据,每个数据的开头都有表名称,操作类型 ...
- Oracle怎么获取json类型字符串值,sql解析json格式字段 如何获取json中某个字段的值?...
java将json数据解析为sql语句?小编给你倒一杯热水.可你惦记着其他饮料,所以你将它放置一旁.等你想起那杯水时,可惜它已经变得冰冷刺骨. 图片中是json数据,每个数据的开头都有表名称,操作类型 ...
- Js读取Cookie中指定字段的值,Js中读取某个Cookie,Js中根据Cookie的key得到对应的value,Js正则表达式匹配指定的Cookie
Js中想要读取Cookie中指定字段的值,可以遍历Cookie根据指定Key提取Cookie,或者使用正则表达式匹配Cookie,代码如下: /*** @description: 遍历cookie得到 ...
- 根据list中某个字段的值排序_MySql中常用函数
一.group_concat group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符']) group_conc ...
- 小程序开发--- 1. 获取数组中某个字段的值或获取列表索引
最近开始自己琢磨开发微信小程序,遇到些问题,现在做一下总结. 今天有遇到一个需要获取到列表中某一项值,并在其他地方调用的问题.其实思路和获取列表索引的道理一样.如果你还不知道如何获取列表的索引,那么现 ...
- 关于MySQL中date字段默认值为“0000-00-00 00:00:00“导致MyBatisPlus无法正常list()而报系统异常错误码500的问题
今天在SpringBoot整合MyBatisPlus的时候,使用自动代码生成的功能,对User表生成了entity.mapper.service代码,之后编写测试类调用userService.list ...
- linux下统计log文件中某个字段的值,并计算出平均值
测试场景:统计log文件output.txt中字段"framesPerSecond"的所有值的平均值 分成两个步骤: 进入对应点log文件所在目录下 第一步:统计出字符串出现的次数 ...
- canal同步mysql到kafka_使用Canal同步MySQL数据到Kafka 得到的数据中sql字段无值-问答-阿里云开发者社区-阿里云...
这个应该跟你的binlog记录模式有关系,binlog有3中模式,ROW(行模式), Statement(语句模式), Mixed(混合模式)三种模式的用法如下: ROW(行模式):记录那条数据修改了 ...
最新文章
- 面向对象的基本设计原则【转】
- android:Activity启动模式
- 4.2.3 OS之减少磁盘延迟时间的方法(交替编号、错位命名)
- 深度学习工具那么多,究竟哪款最适合你?| 线下沙龙 × 报名
- spring整合mybatis基于xml配置
- 剑指offer--替换空格
- 凸多边形面积_C++计算任意多边形的面积
- android 如何读取cgi_Python基础教程(十):CGI编程、MySQL数据库
- 容器编排技术 -- Kubernetes Pod 优先级和抢占
- JS身份证合法性校验完全版
- JVM优化系列-常用GC参数总结
- ram自己写?用IP?
- 剑指 只出现一次的数字
- 张宇1000题高等数学 第九章 一元函数积分学的计算
- matlab三角函数用法
- 电力-104规约实际测试2
- android微信运动页面开发,微信小程序仿微信运动步数排行(交互)
- Tomcat环境搭建与常见问题详解
- HTG评论D-Link DWA-192:您渴望的尖叫快速死亡星状Wi-Fi适配器
- 申请MallBook分账需要准备哪些材料呢?