MVC LINQ中用封装的TSQL通用更新方法

今天用LINQ的update出现问题了,LINQ的BUG不少,呵呵,所以自己把TSQL拿出来,做了一个封装,适用的所有表,更新有两种,普通更新和记数更新

看代码:这两个方法是写在DAL里的数据操作基类里的,只有它的子类可以用它,所以用protected做为限制

   /// <summary>
        /// 通用更新方法
        /// </summary>
        /// <param name="tableName">表名</param>
        /// <param name="param">参数列表,奇数为字段,偶数为他前一奇数对应的值,索引0为要更新的主键,1为主键值</param>
        protected virtual void Update(string tableName, params object[] param)
        {
            StringBuilder sbSql = new StringBuilder();
            List<object> listParasm = new List<object>();
            listParasm.Add(param[0]);
            listParasm.Add(param[1]);
            int index = listParasm.Count;
            sbSql.AppendFormat("UPDATE [{0}] SET ", tableName);

            if (index == 0)
            {
                return;
            }
            else
            {
                for (int i = 2; i < param.Count(); i += 2)
                {
                    if (param[index + 1].GetType() == typeof(string))
                        sbSql.AppendFormat("{{{0}}} = '{{{1}}}',", index, index + 1);
                    else
                        sbSql.AppendFormat("{{{0}}} = {{{1}}},", index, index + 1);
                    listParasm.Add(param[index]);
                    listParasm.Add(param[index + 1]);
                    index++;
                    index++;
                }

                sbSql.Remove(sbSql.Length - 1, 1);//移除最后一个逗号
            }

            sbSql.Append(" WHERE [{0}] = {1}");
            db.ExecuteCommand(sbSql.ToString(), listParasm.ToArray());
        }

        /// <summary>
        ///  计数更新
        /// </summary>
        /// <param name="tableName">表名</param>
        /// <param name="param">参数列表,索引0为主键名,1表主键值,2为要计数的字段,3为增量</param>
        protected virtual void UpdateForCount(string tableName, params object[] param)
        {
            string sql = "update [{0}] set [{3}]=[{3}]+{4} where [{1}]={2}";
            List<object> listParasm = new List<object>
            {
                tableName,
                param[0],
                param[1],
                param[2],
                param[3],
            };
            db.ExecuteCommand(string.Format(sql, listParasm.ToArray()));
        }

本文转自博客园张占岭(仓储大叔)的博客,原文链接:MVC LINQ中用封装的TSQL通用更新方法,如需转载请自行联系原博主。

时间: 2024-12-03 15:47:41

MVC LINQ中用封装的TSQL通用更新方法的相关文章

一起谈.NET技术,ASP.NET MVC验证框架中关于属性标记的通用扩展方法

之前写过一篇文章<ASP.NET MVC中的验证>,唯一的遗憾就是在使用Data Annotation Validators方式验证的时候,如果数据库是Entityframework等自动生成的文件,就没有办法使用扩展属性标记进行标记.现在已经开始有了一些其它的Asp.net MVC 验证框架,使用上跟Data Annotation Validators差不太多,但是普遍有这样的问题,如果数据库是Entityframework生成的edm文件,没有办法进行扩展属性标记. 今天在网上发现了另外一

在Linq to Sql中管理并发更新时的冲突(3):使用记录的时间戳

在<在Linq to Sql中管理并发更新时的冲突(2):引发更新冲突>一文中 ,我们描述了Linq to Sql检测在更新时是否产生了冲突的基本方法:将该记录 每个字段原来的值和更新时的值进行对比,如果稍有不同则意味着记录被修改过 ,因此产生了更新冲突.不过您是否有这样的感觉,这种方法实在累赘了一些? 如果一个表中有数十个字段,那么更新就必须完整地检测一遍(不过我会在今后 的文章中提到这方面的控制).再者,如果其中某一个字段储存了洋洋洒洒上万 字的文章,那么在验证时仅仅是将它从Web服务器发

在Linq to Sql中管理并发更新时的冲突(2) 引发更新冲突

在上一讲中,我们提到了一些诸如"乐观并发控制"."悲 观并发控制"的概念,以及察看Linq to Sql自动生成sql语句的方法.从 这篇文章起我们将继续来查看Linq to Sql在管理并发更新时是如何发现冲突问 题的. 要使用Linq to Sql,我们自然需要一个数据库环境.为了说明问 题,我们这里使用一个非常简单的数据表. 我们这里创建了一个Video表,只有3个字段,没有约束,没有外键 --我们只要能够说明问题就可以了,不是吗? VideoID:主 键,i

《ASP.NET MVC验证框架中关于属性标记的通用扩展方法》之继续扩展

首先需要对xVal有点熟悉: http://www.codeplex.com/xval 建议下载最新源码而不是编译版本 再看两篇文章: http://goneale.com/2009/03/04/using-metadatatype-attribute-with-aspnet-mvc-xval- validation-framework/ 深山老林将之翻译为:<ASP.NET MVC验证框架中关于属性标记的通用扩展方法> http://www.cnblogs.com/wlb/archive/2

Extjs4使用mvc模式,封装Store层的ArrayStore无法动态加载后台数据

问题描述 Extjs4使用mvc模式,封装Store层的ArrayStore无法动态加载后台数据 store层代码 Ext.define('Desktop.store.function.FunctionStore'{ extend: 'Ext.data.ArrayStore' requires:['Desktop.model.function.UserModel'] model: 'Desktop.model.function.UserModel' autoLoad: true proxy:{

DataContext数据在F5刷新频繁时,出现数据读取错误(MVC LINQ)

这个问题是这样的,datacontext是linq to sql数据模型的底层数据库对象 所有LINQ数据表对象都是由它派生的,只要你建立一个数据库操作,就建立一个datacontext 对象,当然,你可以选择用静态的datacontext,但这是不推荐的,这在微软MSDN和阿布老兄上 已经说的很清楚了. 言归正传,datacontext对象在频繁调用时,会出现读取数据错误问题,这个我已经测试过,确实有这种情况,现在说一下解决方法 首先建立一个数据实体对象,它是与linq数据表相同的类型,如us

Spring MVC 中 短信验证码功能的实现方法_java

在外部网站中短信的验证很有必要,比如在实现注册.验证用户信息等的情况下.在SpringMVC中的实现如下: 短信接口 短信接口,有些企业会购买的有移动的短信平台接口.如果是个人或者是小企业可以使用一些云服务的.比如百度的API Store上面的. 我使用的是:http://apistore.baidu.com/apiworks/servicedetail/1018.html 当然短信接口肯定都是要付费的,而且是基于模板的,具体的使用说明可以看这个网址里面的使用说明. 前端界面 前端的界面,可能如

ssh-SSH中更新方法为什么不直接更新?

问题描述 SSH中更新方法为什么不直接更新? SSH中更新方法为什么不直接更新? 为什么不是: public String edit() throws Exception { (已经实现了ModelDriven接口) departmentService.update(department); return "toList"; } 而是: /** 修改 */ public String edit() throws Exception { // 1,从数据库取出原对象 Department

姚晓伟:史上最全网页快照天天更新方法

今天笔者继史上最全域名快速收录.最全外链方法.最全网站降权原因后来为大家分享一篇最全的网页快照天天更新方法.众所周知网页快照更新的快对加快网页收录.交换友情链接等都有很大帮助,目前尽管很多行业专家认为网页快照跟提升网页权重没多大关联,但笔者不这么认为,网页快照快是搜索引擎返回出来的一个信用值,说简单点就是它觉得你这个网站会有新鲜的东西值得蜘蛛每天去爬一爬,这样来理解大家还会觉得网页快照对权重提升没有作用吗? 好啦,我们进入正题,来看如何用最全面的方法迅速将自己落后已久或者新域名的快照整到隔夜更新