约束

public abstract class BaseModel
{
  public int Id { get; set; }
}

连接字符串

public static readonly string Customers = ConfigurationManager.ConnectionStrings["Customers"].ToString();

通用数据库字符串

public class SqlBuilder<T> where T : BaseModel
{
  public static readonly string FindSql = null;
  public static readonly string DeleteSql = null;
  public static readonly string FindAllSql = null;
  public static readonly string UpdateSql = null;

  static SqlBuilder()
  {
    Type type = typeof(T);
    FindSql = $"SELECT {string.Join(",", type.GetProperties().Select(a => $"[{a.Name}]")) } FROM [{type.Name}] where Id=@Id";

    DeleteSql = $"Delete from [{type.Name}] where Id=@Id"; ;
    FindAllSql = $"SELECT {string.Join(",", type.GetProperties().Select(a => $"[{a.Name}]")) } FROM [{type.Name}]";
    UpdateSql = $"update [{type.Name}] set {string.Join(",", type.GetProperties().Where(a => !a.Name.Equals("Id")).Select(a => $"[{a.Name}]=@ {a.Name}"))} where Id =@Id";
  }
}

一:添加

public bool Add<T>(T t) where T : BaseModel
{
  Type type = typeof(T);
  object oCompany = Activator.CreateInstance(type);
  // Id 是自动增长的,sql语句中应该去除Id的字段
  // GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)  过滤掉继承自父类的属性
  string props = string.Join(",", type.GetProperties().Where(p => !p.Name.Equals("Id")).Select(a => $"[{a.Name}]"));//获取属性名不等于id的所有属性数组
  string paraValues = string.Join(",", type.GetProperties().Where(p => !p.Name.Equals("Id")).Select(a => $"@[{a.Name}]"));//获取属性名不等于id的所有参数化数组
  string sql = $"Insert [{type.Name}] ({props}) values({paraValues})";
  var parameters = type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly).Select(item => new SqlParameter()
  {
    ParameterName = $"@{item.Name}",
    SqlValue = $"{item.GetValue(t)}"
  });
  //在拼接sql语句的时候,尽管ID 是Int类型,还是建议大家使用Sql语句参数化 (防止sql注入)
  using (SqlConnection connection = new SqlConnection(Customers))
  {
    SqlCommand sqlCommand = new SqlCommand(sql, connection);

    sqlCommand.Parameters.AddRange(parameters.ToArray());
    connection.Open();
    return sqlCommand.ExecuteNonQuery() > 0;
  }
}

二:删除

public bool Delete<T>(T t) where T : BaseModel
{
  Type type = t.GetType();
  string sql = SqlBuilder<T>.DeleteSql;
  //string sql = $"Delete from [{type.Name}] where Id=@Id";
  using (SqlConnection connection = new SqlConnection(Customers))
  {
    SqlCommand sqlCommand = new SqlCommand(sql, connection);
    sqlCommand.Parameters.Add(new SqlParameter("@Id", t.Id));
    connection.Open();
    return sqlCommand.ExecuteNonQuery() > 0;
  }
}

三:修改

public bool Update<T>(T t) where T : BaseModel
{
  Type type = typeof(T);
  object oCompany = Activator.CreateInstance(type);
  //string sql = $"update [{type.Name}] set {string.Join(",", type.GetProperties().Where(a => !a.Name.Equals("Id")).Select(a => $"[{a.Name}]=@ {a.Name}"))} where Id =@Id";
  string sql = SqlBuilder<T>.UpdateSql;
  var parameters = type.GetProperties().Select(item => new SqlParameter()
  {
    ParameterName = $"@{item.Name}",
    SqlValue = $"{item.GetValue(t)}"
  });
  //  在拼接sql语句的时候,尽管ID 是Int类型,还是建议大家使用Sql语句参数化防止sql注入)
  using (SqlConnection connection = new SqlConnection(Customers))
  {
    SqlCommand sqlCommand = new SqlCommand(sql, connection);

    sqlCommand.Parameters.AddRange(parameters.ToArray());
    connection.Open();
    return sqlCommand.ExecuteNonQuery() > 0;
  }
}

四:查询

//根据id查询

public T Find<T>(int id) where T : BaseModel
{
  Type type = typeof(T);
  object oCompany = Activator.CreateInstance(type);

  //string sql = $"SELECT {string.Join(",", type.GetProperties().Select(a => $"[{a.Name}]")) } FROM [{type.Name}] where Id=@Id";

  string sql = SqlBuilder<T>.FindSql;

  //  在拼接sql语句的时候,尽管ID 是Int类型,还是建议大家使用Sql语句参数化 (防止sql注入)
  using (SqlConnection connection = new SqlConnection(Customers))
  {
    SqlCommand sqlCommand = new SqlCommand(sql, connection);
    sqlCommand.Parameters.Add(new SqlParameter("@Id", id));
    connection.Open();
    SqlDataReader reader = sqlCommand.ExecuteReader();
    if (reader.Read()) 
    {
      ReaderToList(type, oCompany, reader);
      return (T)oCompany;
    }
    else
    {
      return null;
    }
  }
}

//查询所有

public List<T> FindAll<T>() where T : BaseModel
{
  Type type = typeof(T);
  //string sql = $"SELECT {string.Join(",", type.GetProperties().Select(a => $"[{a.Name}]")) } FROM [{type.Name}]";

  string sql = SqlBuilder<T>.FindAllSql;

  using (SqlConnection connection = new SqlConnection(Customers))
  {
    SqlCommand sqlCommand = new SqlCommand(sql, connection);

    connection.Open();
    SqlDataReader reader = sqlCommand.ExecuteReader();
    List<T> datalist = new List<T>();
    while (reader.Read()) 
    {
      object oCompany = Activator.CreateInstance(type);
      ReaderToList(type, oCompany, reader);
      datalist.Add((T)oCompany);
    }
  return datalist;
  }
}

//私有函数封装通用代码,引用类型可以不用返回

private static void ReaderToList(Type type, object oCompany, SqlDataReader reader)
{
  foreach (var prop in type.GetProperties())
  {
    prop.SetValue(oCompany, reader[prop.Name] is DBNull ? null : reader[prop.Name]);
  }
}

ADO.NET ORM数据库增删改查封装(工具一)的更多相关文章

  1. Django ORM 数据库增删改查

    Django ORM 数据库增删改查 增 # 创建.增加数据(推荐) models.UserInfo.objects.create(username=') # 创建.增加数据 dic = {'} mo ...

  2. Django之ORM数据库增删改查

    总结:ORM的 查.增.删.改 - 查 - client - 有一个展示页面(xxx_show.html) - 这一个页面一输入执行后,get请求向server端发送 - 这个展示页面有添加按钮.删除 ...

  3. Python cx_oracle自动化操作oracle数据库增删改查封装,优化返回查询数据

    # coding=utf-8 import cx_Oracle import os import json os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_C ...

  4. pyhton 自动化pymysql操作mysqldb数据库增删改查封装

    # coding=utf-8 import pymysql import os import configparser """ /* @:param: python ve ...

  5. node.js封装数据库增删改查

    数据库增删改查的封装 小编不容易 const sql = { insert: function (Collection, insertData) { return new Promise((resol ...

  6. go——beego的数据库增删改查

    一直都不理解使用go语言的时候,为什么还要自己去装beego,以为使用go便可以解决所有的问题,结果在朋友的点拨下,才意识到: go与beego的关系就好比是nodejs与thinkjs的关系,因此也 ...

  7. (转)SQLite数据库增删改查操作

    原文:http://www.cnblogs.com/linjiqin/archive/2011/05/26/2059182.html SQLite数据库增删改查操作 一.使用嵌入式关系型SQLite数 ...

  8. Android(java)学习笔记193:利用谷歌API对数据库增删改查(推荐使用)

    接下来我们通过项目案例来介绍:这个利用谷歌API对数据库增删改查 1.首先项目图: 2.这里的布局文件activity_main.xml: <LinearLayout xmlns:android ...

  9. Android SQLite 数据库 增删改查操作

    Android SQLite 数据库 增删改查操作 转载▼ 一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库--SQLite,SQLite3支持NU ...

随机推荐

  1. java基础-对象的初始化

    一 前言 本节内容将会提到方法重载,对象的初始化,对象的构造器,和this关键字的使用,以及会简要的概括一下java中对象回收机制.觉得文章不错的读者可以关注一下作者的博客和公众号(同博客名称) 二 ...

  2. java基础-谈谈你对面向对象的理解

    一 前言 本篇文章的核心知识如下,主要是帮助大家更好的理解面向对象编程: 二面向对象VS面向过程 2.1 面向过程编程 面向过程编程(Process Oriented Programming )其意指 ...

  3. Linux 的目录结构

    原文内容来自于LZ(楼主)的印象笔记,如出现排版异常或图片丢失等问题,可查看当前链接:https://app.yinxiang.com/shard/s17/nl/19391737/cbbf47b0-f ...

  4. 萌新入门Github请看这里,学不会远程教

    一些废话 本文的主旨是为初次接触Github的同学提供一个入门的教程,如果你已经是Github老鸟,可以忽略本文哦,另外本文只是抛砖引玉,其实最好的教程是官方文档!!! Github官网 Github ...

  5. c++-类与类的关系

    类与类的关系 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class A { publ ...

  6. Springboot Activiti6 工作流 集成代码生成器 shiro 权限 vue.js html 跨域 前后分离

    官网:www.fhadmin.org 特别注意: Springboot 工作流  前后分离 + 跨域 版本 (权限控制到菜单和按钮) 后台框架:springboot2.1.2+ activiti6.0 ...

  7. 基于vue+leaflet+echart的足迹分享评论平台

    (其实题目是随便取的,目的只是用来证明Vue+leaflet+springboot技术栈的可行性) 效果 小专栏不支持上传视频?想看的话可以去我的知乎看最新的文章,那个应该可以.在这里 主要功能描述 ...

  8. Java连载60-类之间的六种关系

    一.类之间的关系 1.泛化关系(UML图:实线空心三角形箭头,箭头指向被继承方) 类和类.接口与接口之间的继承称为泛化关系 public class A {} class B extends A{} ...

  9. IT兄弟连 HTML5教程 和页面布局有关的CSS属性

    使用DIV+CSS对网页进行标准化布局前,除了要掌握盒子模型,还要掌握定位和浮动两个比较重要的概念,它们可以控制在页面上排列和显示元素的方式.一个盒子是装内容的区块,如果多个盒子组合在一起使用,再通过 ...

  10. MySQL数据库基础笔记

    数据库 数据库就是存储和管理数据的仓库,用户可以对数据库中的数据进行增删改查等操作. 数据库的分类 关系型数据库(Oracle.MySQL.SQLite等) 非关系型数据库(Redis.MongoDB ...