利用反射插入数据库与更新数据库

public int Insert<T>(T m) where T : class
{
  PropertyInfo[] pInfos = m.GetType().GetProperties();
  FieldInfo[] fInfos = m.GetType().GetFields();

  List<string> lstCol = new List<string>();
  List<OleDbParameter> lstParam = new List<OleDbParameter>();

  for (int i = 0; i < pInfos.GetLength(0); i++)
  {
    PropertyInfo pInfo = pInfos[i];
    object value = pInfo.GetValue(m, null);
    string name = pInfo.Name;
    string DeclarType = pInfo.PropertyType.Name;
    if (DeclarType.ToUpper().Contains("DateTime".ToUpper()))
    {
      value = ((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss.fff");
    }

    lstCol.Add(name);
    lstParam.Add(new OleDbParameter("@" + name, value));
  }

  string Keys = " " + string.Join(",", lstCol.ToArray());
  string Values = " " + "@" + string.Join(",@", lstCol.ToArray());

  string sql;
  sql = @"Insert into " + GetTableName() + "("
  + Keys
  + ")values("
  + Values
  + ")";

  string ErrorMsg;
  return DBAHelp.DBA_ExecuteNonQuery(sql, (OleDbParameter[])(lstParam.ToArray()), out ErrorMsg);

}

public int Update<T>(T m, string UpdateKey) where T : class
{
  string FullName = m.GetType().FullName;
  T mNew = Activator.CreateInstance(m.GetType()) as T;

  PropertyInfo[] pInfos = m.GetType().GetProperties();
  PropertyInfo[] pInfosNew = mNew.GetType().GetProperties();

  List<string> lstCol = new List<string>();
  List<OleDbParameter> lstParam = new List<OleDbParameter>();

  OleDbParameter KeyParam = null;
  string sKey = "";

  for (int i = 0; i < pInfos.GetLength(0); i++)
  {
    PropertyInfo pInfo = pInfos[i];
    object value = pInfo.GetValue(m, null);
    string name = pInfo.Name;

    PropertyInfo pInfoNew = pInfosNew[i];
    object valueNew = pInfoNew.GetValue(mNew, null);

    if (UpdateKey.ToUpper() == name.ToUpper())
    {
      KeyParam = new OleDbParameter("@" + name, value);
      sKey = name + "[email protected]" + name;
    }
    else if (!value.Equals(valueNew))
    {
      string Line = name + "[email protected]" + name;
      lstCol.Add(Line);
      lstParam.Add(new OleDbParameter("@" + name, value));
    }
  }

  string Lines = string.Join(",", lstCol.ToArray());
  if (KeyParam != null)
  {
    lstParam.Add(KeyParam);
  }

  string sql;
  sql = @"Update " + GetTableName() + " Set "
  + Lines
  + " Where "
  + sKey
  + "";

  string ErrorMsg;
  return DBAHelp.DBA_ExecuteNonQuery(sql, (OleDbParameter[])(lstParam.ToArray()), out ErrorMsg);
}

时间: 2024-08-25 09:53:42

利用反射插入数据库与更新数据库的相关文章

【WindowsPhone】利用反射初始化和添加 SQLite数据库

首先引用命名空间 using System.Reflection 了解一下 Assembly 类 // // 摘要: // 表示一个程序集,它是一个可重用.无版本冲突并且可自我描述的公共语言运行时应用程序构造块. public abstract class Assembly 我们把Model类都约定好放在同一个命名空间下,下面以User类为例: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 u

利用反射技术实现POJO的数据库操作

记得第一次写项目的时候,傻傻的数据库一张表,代码里就写一个DAO类,几张表就写几个DAO类,大量的重复代码,自己粘着都嫌烦,后来接触了Hibernate,不得不说对我们这种小白用处还是很大的,那么多的实体类,一个DAO就可以实现基本的数据库操作了,于是我用的不亦乐乎,但到底是怎么做的,从来没有考虑过,现在用这些框架已经有一段时间了,原谅我脑洞大开,想自己实现一下这种类似的功能: 在准备写之前,我们需要一些规则: 1.由实体类名,可以知道我这个类是存放在哪张表里---这里我采用的是和t_类名 2.

EF core (code first) 通过自定义 Migration History 实现多租户使用同一数据库时更新数据库结构

前言 写这篇文章的原因,其实由于我写EF core 实现多租户的时候,遇到的问题. 具体文章的链接: Asp.net core下利用EF core实现从数据实现多租户(1) Asp.net core下利用EF core实现从数据实现多租户(2) : 按表分离   (主要关联文章) 这里我遇到的最主要问题是:由于多租户的表使用的是同一个数据库.由于这个原因,无法通过 Database.EnsureCreated() 自动创建多个结构相同但名字不同的表. 所以我在文中提到,需要自己跑脚本去创建多有的

Exchange Server 2016管理系列课件49.DAG管理之更新数据库副本

在什么情况下需要更新数据库副本 更新(亦称为种子设定)是将邮箱数据库副本添加到数据库可用性组 (DAG) 中另一邮箱服务器的过程.新添加的副本将成为被动副本的基线数据库,其中将重播从主动副本复制的日志文件.在下列情况下必须设定种子: 1.新建数据库的被动副本时. 对于新的邮箱数据库副本,可以推迟种子设定:但最终每个被动数据库副本都必须设定种子,才能用作冗余数据库副本. 2.任一数据库副本进行脱机碎片整理后. 种子设定的方法 1.自动种子设定 自动种子设定在数据库创建期间执行,用于在目标邮箱服务器

利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理

利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理 2018-3-10 15:18 | 发布:Admin | 分类:代码库 | 评论:0 | 浏览:45 | 该类在MVC中可以方便管理配置信息,可以直接把Model储存进数据库或者从数据库去除数据转为Model. 1 何为配置项目? 比如网站的名称,页脚信息,meta中的KeyWord信息等,如果不想硬编码到网页里,就需要使用配置文件进行储存,通常都是储存到数据库中.使用的时候读取出来

利用反射处理多个表结构相同的数据的查询和数据库表的关联

最近做一个项目,需要对人口数据进行查询,但是人口数据分布在不同的街道表中,首先进行了数据表结构的统一,每个数据表以街道名开头,然后其他的名字都一样 前期将各个表中的字段也进行了统一 抽象出一张字典表 将街道编号和街道的名字的首字母连接起来,因为查询的时候是利用街道编号来的,这样可以根据街道标号拼出相对于的街道表的名字,(每个人口相关的表不止一张,因此需要统一):在查询过程中,将查询到的结构返回一个LIST,(不同的表在dao中当然对于不同的类啊,返回来再判断是哪一类),然后利用反射Field[]

NPOI操作excel——利用反射机制,NPOI读取excel数据准确映射到数据库字段

> 其实需求很明确,就是一大堆不一样的excel,每张excel对应数据库的一张表,我们需要提供用户上传excel,我们解析数据入库的功能实现. 那么,这就涉及到一个问题:我们可以读出excel的表头,但是怎么知道每个表头具体对应数据库里面的字段呢? 博主经过一段时间的思考与构思,想到一法:现在的情况是我们有excel表A,对应数据库表B,但是A与B具体属性字段的映射关系我们不知.那我们是不是可以有一个A到B的映射文件C呢? 我想,说到这,大家就很明了了... 第一步:为每张excel创建一个与

通用的通过模型插入或更新数据库

public class DALInsertUpdate<T> where T : new() { /// <summary> /// 通过模型把非(KeyAttribute)属性插入到指定表 /// </summary> /// <param name="TableName">要插入到的表名</param> /// <param name="Model">要插入的模型</param>

C#使用DataSet Datatable更新数据库的三种实现方法

本文以实例形式讲述了使用DataSet Datatable更新数据库的三种实现方法,包括CommandBuilder 方法.DataAdapter 更新数据源以及使用sql语句更新.分享给大家供大家参考之用.具体方法如下: 一.自动生成命令的条件 CommandBuilder 方法 a)动态指定 SelectCommand 属性 b)利用 CommandBuilder 对象自动生成 DataAdapter 的 DeleteCommand.InsertCommand 和 UpdateCommand