Table 类(数据表基类)
只修改数据表某条记录的部分字段(究极进化):
public class TableHelper
{
private Dictionary<string, object> temp;
public Dictionary<string, object> Temp { get { return temp; } } private SqlSugarClient db;
private HttpContext context;
public TableHelper(SqlSugarClient db)
{
this.db = db;
}
public TableHelper(SqlSugarClient db, HttpContext context)
{
this.db = db;
this.context = context;
} /// <summary>
/// 将对象类型的json数据转换成字典
/// </summary>
/// <typeparam name="T">数据表的模型类</typeparam>
/// <param name="data">json数据</param>
public void ToDictionary<T>(string data) where T : class
{
temp = new Dictionary<string, object>(); //重新实例化对象 T tableobj = JsonConvert.DeserializeObject<T>(data); //先反序列化
Type t = tableobj.GetType(); //获取对象的类型 foreach (PropertyInfo pi in t.GetProperties()) //遍历数据表对象的属性,将属性名和属性值存进字典里
{
if (pi.Name == "id")
{ }
else
{
Object value = pi.GetValue(tableobj);
if (value != null)
{
temp.Add(pi.Name, pi.GetValue(tableobj));
}
}
}
} /// <summary>
/// 额外添加要修改的字段(如果转换来的对象中已经存在该字段则不添加)
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
public void AddField(string key,object value)
{
foreach (string s in temp.Keys)
{
if (s == key)
{
}
else
{
temp.Add(key, value);
}
}
} public bool Update<T>(Dictionary<string, object> tableobj, int rowId) where T : class
{
return db.Update<T, int>(tableobj, rowId);
}
}
以下是以前写的(还是上边的写的更好):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;
using Newtonsoft.Json;
using SqlSugar;
using EQD.variable; namespace EQD.variable
{
/// <summary>
/// 这是一个数据表的基类,但要使用的前提是其他数据表要继承于它
/// </summary>
public class Table
{
private SqlSugarClient db = new SqlSugarClient(DBHelper.connectionString);
//public SqlSugarClient DB { get; set; } /// <summary>
/// 反序列化一下
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static Table DeserializeObject(string data)
{
Table table = new Table();
try
{
table = JsonConvert.DeserializeObject<Table>(data); //将要修改的内容全部转换成 dt
}
catch
{
}
return table;
} /// <summary>
/// 这是修改之后的更新方法(tableobj:反序列化之后包含要修改的内容的对象。contactsid:要修改的数据记录的id)
/// </summary>
/// <param name="tableobj">反序列化之后包含要修改的内容的对象</param>
/// <param name="contactsid">要修改的数据记录的id</param>
/// <returns></returns>
public bool Alter1(Table tableobj, int contactsid)
{
#region 将反序列化的对象中要修改的属性转换成字典集合
List<string> namelist = new List<string>();
List<Object> valuelist = new List<object>(); Type t = tableobj.GetType(); //获取对象的类型
foreach (PropertyInfo pi in t.GetProperties()) //遍历数据表对象的属性,分别将属性名和属性值存进两个集合里面
{
if (pi.Name == "id")
{ }
else
{
Object value = pi.GetValue(tableobj);
if (value != null)
{
namelist.Add(pi.Name);
valuelist.Add(value);
}
}
} Dictionary<string, object> temp = new Dictionary<string, object>(); for (int i = ; i < namelist.Count; i++)
{
temp.Add(namelist[i], valuelist[i]);
}
temp.Add("updateTime", DateTime.Now);
#endregion
bool result = db.Update<Table, int>(temp, contactsid); return result;
} #region 以下是原来写的内容
/// <summary>
/// 修改数据表中某条数据的内容
/// </summary>
/// <param name="tableobj">数据表的对象——一条数据</param>
/// <returns></returns>
public static Object Alter(Table tableobj)
{
List<string> namelist = new List<string>();
List<Object> valuelist = new List<object>(); Type t = tableobj.GetType(); //获取对象的类型
foreach (PropertyInfo pi in t.GetProperties()) //遍历数据表对象的属性,分别将属性名和属性值存进两个集合里面
{
if (pi.Name == "id")
{ }
else
{
Object value = pi.GetValue(tableobj);
if (value != null)
{
namelist.Add(pi.Name);
valuelist.Add(value);
}
}
} Dictionary<string, object> temp = new Dictionary<string, object>(); for (int i = ; i < namelist.Count; i++)
{
temp.Add(namelist[i], valuelist[i]);
}
temp.Add("updateTime", DateTime.Now);
return temp;
} //方法重载,只有第二个参数里包含的字段才能进行修改
public static Object AlterDate(Object tabledataobj, List<string> modifiableField)
{
List<string> namelist = new List<string>();
List<Object> valuelist = new List<object>(); Type t = tabledataobj.GetType();
foreach (PropertyInfo pi in t.GetProperties())
{
if (pi.Name == "id")
{ }
else
{
if (modifiableField.Contains(pi.Name))
{
Object value = pi.GetValue(tabledataobj);
if (value != null)
{
namelist.Add(pi.Name);
valuelist.Add(value);
}
}
}
} Dictionary<string, object> temp = new Dictionary<string, object>(); for (int i = ; i < namelist.Count; i++)
{
temp.Add(namelist[i], valuelist[i]);
}
temp.Add("updateTime", DateTime.Now);
return temp;
}
#endregion
}
}
调用:
//要传入的参数
string owner = context.Request.Form["owner"]; //修改人
int contactsid = Convert.ToInt32(context.Request.Form["contactsid"]); //要修改的联系人的id
//要修改的信息
string data = context.Request.Form["data"]; //这是一条json数据字符串,里面包含了要修改的信息的内容 Table table = new t_user();
table = Table.DeserializeObject(data); //如果传入的数据不对,则返回的 table 对象的属性全部为 null using (var db = new SqlSugarClient(DBHelper.connectionString))
{
try
{
var result = table.Alter1(table, contactsid);
}
catch (Exception e)
{ }
}
对于原来的代码里其实还是有一些很好的东西,比如动态生成对象且动态增加属性。但对于这个类,因为 SqlSuger 其实有对应的只修改某些列的方法,所以以上的代码还可以再调整,进行优化。
只数据部分字段:
var result = db.Queryable<t_user>().Where(u => u.CompanyId == comid && u.Isdel == false).OrderBy(u => u.addTime, OrderByType.Desc).ToPageList(page + , ); //先全部查出来,然后再用 tuple
List<Tuple<int, DateTime?>> list = new List<Tuple<int, DateTime?>>();
foreach (t_user u in result)
{
list.Add(new Tuple<int, DateTime?>(u.id,u.addTime));
}
Table 类(数据表基类)的更多相关文章
- 基于SqlSugar的开发框架循序渐进介绍(4)-- 在数据访问基类中对GUID主键进行自动赋值处理
我们在设计数据库表的时候,往往为了方便,主键ID一般采用字符串类型或者GUID类型,这样对于数据库表记录的迁移非常方便,而且有时候可以在处理关联记录的时候,提前对应的ID值.但有时候进行数据记录插入的 ...
- mysql批量插入数据的基类
自己设计的一个mysql数据库批量添加数据的基类.用于批量向mysql数据库添加数据,子类实现起来很简单,自测性能也还不错. 1.基类实现-BatchAddBase using System.Coll ...
- BIM工程信息管理系统-EF实体框架数据操作基类
EF实体框架数据操作基类主要是规范增.改.查.分页.Lambda表达式条件处理,以及异步操作等特性,这样能够尽可能的符合基类这个特殊类的定义,实现功能接口的最大化重用和统一. 1.程序代码 /// & ...
- 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)
[源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...
- C++//菱形继承 //俩个派生类继承同一个基类 //又有某个类同时继承俩个派生类 //成为 菱形继承 或者 钻石 继承//+解决
1 //菱形继承 2 //俩个派生类继承同一个基类 3 //又有某个类同时继承俩个派生类 4 //成为 菱形继承 或者 钻石 继承 5 6 #include <iostream> 7 #i ...
- 派生类地址比基类地址少4(子类与基类指针强行转换的时候,值居然会发生变化,不知道Delphi BCB是不是也这样) good
大家对虚表并不陌生,都知道每个含有虚函数的类对象都有1个虚指针,但是在现实使用中,却总是因为这而调试半天,才发现原来是虚指针惹的祸.我这几天在调试代码时候也中招了,我的问题是这样的,如下图,CTree ...
- 【Android进阶】为什么要创建Activity基类以及Activity基类中一般有哪些方法
现在也算是刚刚基本完成了自己的第一个商业项目,在开发的过程中,参考了不少人的代码风格,然而随着工作经验的积累,终于开始慢慢的了解到抽象思想在面向对象编程中的重要性,这一篇简单的介绍一下我的一点收获. ...
- C++ - 派生类访问模板基类(templatized base class)命名
派生类访问模板基类(templatized base class)命名 本文地址: http://blog.csdn.net/caroline_wendy/article/details/239936 ...
- laravel5.8笔记五:基类控制器和基类模型
建立基类的目的就是为了方便继承.比如:Admin模块访问,是否登陆.检测登陆可以写到基类里面 控制器基类 原始基类:app\Http\Controllers\Controller.php,我们下面要做 ...
随机推荐
- druid数据源连接oracle10g报错:not support oracle driver 1.0
jdbc驱动与数据库版本不一致,去数据库服务器的安装目录(cd $ORACLE_HOME)找jdbc->lib->ojdbcX.jar 替换到你项目中即可. oracle目录lib下jar ...
- Atom读写MarkDown插件选择,以及墙内安装markdown-preview-enhanced,及markdown和mermaid使用教程
1.Atom自带markdown-preview 功能太少,需要大量拓展. 2.markdown-preview-plus 功能还不错,但是其中的滚动条插件markdown-scroll-sync和最 ...
- 使用session和cookie实现用户登录:一个登录页面,一个servlet,一个登录成功页面
文件目录 1.登录页面 <%@ page language="java" contentType="text/html; charset=utf-8" p ...
- sai u 2016
再过20分钟,我就要结束2016年的工作回家过春节了.真是难过的一天啊,从来没有今天那么感受深刻,那么嫌弃时间太慢,没有归家心似箭,没有近乡情怯,只是好想,呵呵,来个午睡,来场电影,来点小说,哈哈哈. ...
- 第三方jar包上传私服和项目使用
下面只做个人日志记录,勿喜勿喷 使用两个浏览器,带着下面的问题去看:https://www.cnblogs.com/tyhj-zxp/p/7605879.html.就会清晰了 1.下载和安装nexus ...
- mySQL简单操作(二)
1.like子句 [where clause like '%com'] '%' '_' 2.正则 3.union操作符 用于连接多个select语句,[distinct]删除重复数据 select c ...
- 针对多条件查询,应对 url 无用 null 值现象处理
多条件查询 应对 url 无用 null 值现象 处理例如:http://xxoo.b2b.com/orders?city_id=5&repertory_id=7&area_id=39 ...
- \r \n \t \n\t
[root@localhost advanced_shell_script]# cat test15.sh #!/bin/bash #!/bin/bash # echo -e# 默认情况下,echo命 ...
- Bugku-CTF之过狗一句话(送给大家一个过狗一句话)
Day25 过狗一句话 http://123.206.87.240:8010/ 送给大家一个过狗一句话<?php $poc="a#s#s#e#r#t"; $poc_1=e ...
- Synchronized使用方法
Synchronized是我们常用来维持线程安全时使用的一个关键字,内部通过monitor(监视器锁,由C++实现)来实现.而monitor本质又是依赖底层操作系统的mutex lock来实现.而操作 ...