c语言update更新字段为null,ibatis.net之我的调整:Update语句的动态set字段

动态Update语句

如果Map中指定多个字段

update Staff set Name=#Name#,InDate=#InDate# where StaffId=#StaffId#

使用以下代码会有麻烦

fcc18ed0481e6c9038a71c728ffb972d.png

第25行注释掉的话,你会发现InDate会被设置为null.而实际的工作我们并不希望一行数据所有字段都刷新一次,因为在大型系统里每次都这样做的话,风险太高。

但我觉得应调整原有的机制(改源代码),减少日常的开发工作。我准备使用“UpdateSetClip"代替Set部分

update Staff set [UpdateSetClip] where StaffId=#StaffId#

好了,修改好sqlMap,不断的跑代码,不断的调整程序,直到满意:)

这是调整的位置,使用了一个新增的方法CreateDync,意思为动态创建

1aa096f4be36df96861685047110287f.png

以下是主要代码,源代码文件:IBatisNet.DataMapper.Commands.DefaultPreparedCommand.cs

public void CreateDync(RequestScope request, ISqlMapSession session, IStatement statement, object parameterObject)

{

request.IDbCommand = new DbCommandDecorator(session.CreateCommand(statement.CommandType), request);

//request.PreparedStatement.()

if (_logger.IsDebugEnabled)

{

_logger.Debug("Statement Id: [" + statement.Id + "] PreparedStatement : [" + request.IDbCommand.CommandText + "]");

}

ApplyParameterMap(session, request.IDbCommand, request, statement, parameterObject);

//

string lastSql = applyParameterDyncSetClip(session, request.IDbCommand, request, statement, parameterObject);

request.IDbCommand.CommandText = lastSql;

}

///

/// 应用动态字段set语句

///

///

///

///

///

///

private string applyParameterDyncSetClip(ISqlMapSession session, IDbCommand command,

RequestScope request, IStatement statement, object parameterObject)

{

Dictionary dict = parameterObject as Dictionary;//将参数转为字典

if (dict == null)

return request.PreparedStatement.PreparedSql;

string _updateStr = "";//动态Set部分,以空格开始

int index = request.PreparedStatement.DbParametersName.Count;

foreach (var one in dict)//build command set DataParameter

{

if (request.PreparedStatement.DbParametersName.Contains(one.Key))

continue;

index++;

IDbDataParameter parameterCopy = request.IDbCommand.CreateParameter();

parameterCopy.ParameterName = string.Format("{0}param{1}", session.DataSource.DbProvider.ParameterPrefix, index);

parameterCopy.Value = one.Value;

request.IDbCommand.Parameters.Add(parameterCopy);

_updateStr += string.Format("{0} = {1},", one.Key, parameterCopy.ParameterName);

}

_updateStr = _updateStr.TrimEnd(',');

return request.PreparedStatement.PreparedSql.Replace("[UpdateSetClip]", _updateStr);

}

细心的朋友会发现这个只支持字典,是的。字典(key/value)将是开源HIS中经常会见到。其实XML、Json都可以使用key/value来表示。所以自定义类似乎并不是必选项。当然实体类(属性对应表的字段)依然是推荐的技术手段。真正讨论开源HIS源码的时候再详谈。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值