使用泛型,可以构建对数据库单表的基本增删改查。

首先有一数据库 Test_SqlServerHelper ,有2表

接下来创建项目,对数据库进行增删改查。

直接贴代码:(SqlServerHelper.cs)

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Data;
  6. using System.Data.SqlClient;
  7. using System.Configuration;
  8.  
  9. namespace SqlServerHelper
  10. {
  11. public static class SqlServerHelper
  12. {
  13. /// <summary>
  14. /// 数据库连接字符串
  15. /// </summary>
  16. private static readonly string connString = ConfigurationManager.ConnectionStrings["Test"].ToString(); //数据库连接字符
  17.  
  18. /// <summary>
  19. /// 根据id查询对象
  20. /// </summary>
  21. /// <typeparam name="T">对象类型</typeparam>
  22. /// <param name="id">对象实例的Id(泛型:类型int或string)</param>
  23. /// <param name="idName">条件的字段名称(主键名)</param>
  24. /// <returns></returns>
  25. public static T QueryById<T, I>(I id, string idName = "Id")
  26. {
  27. Type type = typeof(T);
  28. string columnString = string.Join(",", type.GetProperties().Select(p => string.Format("[{0}]", p.Name)));
  29. string sqlString = string.Format("select {0} from [{1}] where {2}={3}", columnString, type.Name, idName, id.GetType().Name.ToString() == "String" ? ("'" + id.ToString() + "'") : id.ToString());
  30. var t = Activator.CreateInstance(type);
  31. using (SqlConnection conn = new SqlConnection(connString))
  32. {
  33. conn.Open();
  34. SqlCommand sqlCommand = new SqlCommand(sqlString, conn);
  35. SqlDataReader reader = sqlCommand.ExecuteReader();
  36. reader.Read();
  37. SetValueByProperties(type, reader, t);
  38. }
  39. return (T)t;
  40. }
  41.  
  42. /// <summary>
  43. /// 获取数据列表
  44. /// </summary>
  45. /// <typeparam name="T">对象类型</typeparam>
  46. /// <returns></returns>
  47. public static List<T> QueryAll<T>()
  48. {
  49. Type type = typeof(T);
  50. string columnString = string.Join(",", type.GetProperties().Select(p => string.Format("[{0}]", p.Name)));
  51. string sqlString = string.Format("select {0} from [{1}]", columnString, type.Name);
  52. List<T> dataList = new List<T>();
  53. using (SqlConnection conn=new SqlConnection(connString))
  54. {
  55. conn.Open();
  56. SqlCommand sqlCommand = new SqlCommand(sqlString,conn);
  57. SqlDataReader reader = sqlCommand.ExecuteReader();
  58. if (reader.HasRows)
  59. {
  60. while (reader.Read())
  61. {
  62. var t = Activator.CreateInstance(type);
  63. SetValueByProperties(type, reader, t);
  64. dataList.Add((T)t);
  65. }
  66. }
  67. else
  68. {
  69. return null;
  70. }
  71. }
  72. return dataList;
  73. }
  74.  
  75. /// <summary>
  76. /// 插入对象
  77. /// </summary>
  78. /// <typeparam name="T">对象类型</typeparam>
  79. /// <param name="t">对象实例</param>
  80. /// <param name="idName">不插入的字段(自增键名)</param>
  81. /// <returns></returns>
  82. public static bool Insert<T>(T t, string idName = "Id")
  83. {
  84. Type type = typeof(T);
  85. string sqlString = "insert [{0}] ({1}) values ({2})";
  86. string columnString = string.Join(",", type.GetProperties().Where(p => p.Name != idName).Select(p => string.Format("[{0}]", p.Name)));
  87. string valueString = string.Join(",", type.GetProperties().Where(p => p.Name != idName).Select(p => string.Format("@{0}", p.Name)));
  88. sqlString = string.Format(sqlString, type.Name, columnString, valueString);
  89. using (SqlConnection conn = new SqlConnection(connString))
  90. {
  91. conn.Open();
  92. SqlCommand sqlCommand = new SqlCommand(sqlString, conn);
  93. SqlParameter[] sqlParameter = type.GetProperties().Where(p => p.Name != idName).Select(p=>new SqlParameter(string.Format("@{0}",p.Name),p.GetValue(t,null)??DBNull.Value)).ToArray();
  94. sqlCommand.Parameters.AddRange(sqlParameter);
  95. return sqlCommand.ExecuteNonQuery() > ;
  96. }
  97. }
  98.  
  99. /// <summary>
  100. /// 修改对象
  101. /// </summary>
  102. /// <typeparam name="T">对象类型</typeparam>
  103. /// <param name="t">对象实例</param>
  104. /// <param name="idName">自增键名或条件名</param>
  105. /// <returns></returns>
  106. public static bool Update<T>(T t, string idName = "Id")
  107. {
  108. Type type = typeof(T);
  109. string sqlString = "update [{0}] set {1} where {2}={3}";
  110. string setString = string.Join(",", type.GetProperties().Where(p => p.Name != idName).Select(p => string.Format("[{0}]=@{0}", p.Name)));
  111. sqlString = string.Format(sqlString, type.Name, setString, idName,"@"+idName);
  112. using (SqlConnection conn = new SqlConnection(connString))
  113. {
  114. conn.Open();
  115. SqlCommand sqlCommand = new SqlCommand(sqlString, conn);
  116. SqlParameter[] sqlParameter = type.GetProperties().Select(p => new SqlParameter(string.Format("@{0}", p.Name), p.GetValue(t, null) ?? DBNull.Value)).ToArray();
  117. sqlCommand.Parameters.AddRange(sqlParameter);
  118. return sqlCommand.ExecuteNonQuery() > ;
  119. }
  120. }
  121.  
  122. /// <summary>
  123. /// 设置值by属性(SQLreader)
  124. /// </summary>
  125. /// <param name="type">对象类型</param>
  126. /// <param name="reader">sqlreader</param>
  127. /// <param name="t">对象</param>
  128. private static void SetValueByProperties(Type type, SqlDataReader reader, object t)
  129. {
  130. foreach (var item in type.GetProperties())
  131. {
  132. if (reader[item.Name] is DBNull) //判空
  133. {
  134. item.SetValue(t, null);
  135. }
  136. else
  137. {
  138. item.SetValue(t, reader[item.Name]);
  139. }
  140. }
  141. }
  142. }
  143. }

这里使用二个数据库表类实体:(我是通过工具直接在数据库上导出来的)

  1. Dt_Fruits.cs
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4.  
  5. namespace SqlServerHelper
  6. {
  7. public class Dt_Fruits
  8. {
  9. private int id;
  10. public int Id
  11. {
  12. get { return id; }
  13. set { id = value; }
  14. }
  15.  
  16. private string name;
  17. public string Name
  18. {
  19. get { return name; }
  20. set { name = value; }
  21. }
  22.  
  23. private int sort;
  24. public int Sort
  25. {
  26. get { return sort; }
  27. set { sort = value; }
  28. }
  29.  
  30. private DateTime addTime;
  31. public DateTime AddTime
  32. {
  33. get { return addTime; }
  34. set { addTime = value; }
  35. }
  36. }
  37. }

Dt_User.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4.  
  5. namespace SqlServerHelper
  6. {
  7. public class Dt_User
  8. {
  9. private int id;
  10. public int Id
  11. {
  12. get { return id; }
  13. set { id = value; }
  14. }
  15.  
  16. private string name;
  17. public string Name
  18. {
  19. get { return name; }
  20. set { name = value; }
  21. }
  22.  
  23. private string mob;
  24. public string Mob
  25. {
  26. get { return mob; }
  27. set { mob = value; }
  28. }
  29.  
  30. private string sex;
  31. public string Sex
  32. {
  33. get { return sex; }
  34. set { sex = value; }
  35. }
  36.  
  37. private DateTime birthday;
  38. public DateTime Birthday
  39. {
  40. get { return birthday; }
  41. set { birthday = value; }
  42. }
  43.  
  44. private DateTime addTime;
  45. public DateTime AddTime
  46. {
  47. get { return addTime; }
  48. set { addTime = value; }
  49. }
  50. }
  51. }

以上都是准备工作,准备工作做好了,接下来就是,面向对象,直接操作类,快速对数据库:增删改查:

直接上代码:

  1. //查询所有:
  2. var userList = SqlServerHelper.QueryAll<Dt_User>();
  3.  
  4. //查询某一id:
  5. var oneFruits = SqlServerHelper.QueryById<Dt_Fruits,int>();//查到芒果的所有信息
  6.  
  7. //修改
  8. oneFruits.Name = "芒果:修改";
  9. bool updateRes = SqlServerHelper.Update<Dt_Fruits>(oneFruits);//修改了芒果--》芒果:修改
  10.  
  11. //添加
  12. var newUser = new Dt_User()
  13. {
  14. Name = "博客君",
  15. Sex = "男",
  16. Mob = "",
  17. Birthday = DateTime.Now,
  18. AddTime=DateTime.Now
  19. };
  20. bool addRes = SqlServerHelper.Insert<Dt_User>(newUser);

以下是增删改查的详细讲解:

查询整表  所有(数据量超过5000的不推荐这么查询,一般查询一下类型表什么的)

  1. //查询所有:
  2. var userList = SqlServerHelper.QueryAll<Dt_User>();

查询某一id  的数据

  1. //查询某一id:
  2. var oneFruits = SqlServerHelper.QueryById<Dt_Fruits,int>();//查到芒果的所有信息

查询到的数据就不截图了

修改某一id 的数据

  1. //修改
  2. oneFruits.Name = "芒果:修改";
  3. bool updateRes = SqlServerHelper.Update<Dt_Fruits>(oneFruits);//修改了芒果--》芒果:修改

添加一条数据

  1. //添加
  2. var newUser = new Dt_User()
  3. {
  4. Name = "博客君",
  5. Sex = "男",
  6. Mob = "",
  7. Birthday = DateTime.Now,
  8. AddTime=DateTime.Now
  9. };
  10. bool addRes = SqlServerHelper.Insert<Dt_User>(newUser);

最后数据变化:

是不是很棒,很轻松的对数据库,简单的增删改查!

这里可能会有博友会说,哎呀,拼接SQL语句的,好像性能,或者某方面看起来不好,其实呀,ADO.net 对于数据库访问,底层也是对SQL语句的封装的,好用就行了。以后如过有新表,就添加一对应新的C#模型就可以了,这种思想就衍生了现在很流行的EF框架哦。

还有!细心的朋友会发现:

我要查询一条数据,为什么还要传int,和1,其实是这样的,如果数据库主键名如果不是“id”,不用这样查询会拼接出错误的sql,因为id名是多变的,所以这里要传。int,表示数据库表的主键是int,对应传就行了。假如有些数据库表主键是“nvarchar,varchar 等”列如大型数据订单id等,这时候传string,(“10000101”)即可。

完整的写法是这样的:

  1.     //查询所有:
  2. var userList = SqlServerHelper.QueryAll<Dt_User>();
  3.  
  4. //查询某一id:
  5. var oneFruits = SqlServerHelper.QueryById<Dt_Fruits, int>(,nameof(Dt_Fruits.Id));//查到芒果的所有信息
  6.  
  7. //修改
  8. oneFruits.Name = "芒果:修改";
  9. bool updateRes = SqlServerHelper.Update<Dt_Fruits>(oneFruits,nameof(Dt_Fruits.Id));//修改了芒果--》芒果:修改
  10.  
  11. //添加
  12. var newUser = new Dt_User()
  13. {
  14. Name = "博客君",
  15. Sex = "男",
  16. Mob = "",
  17. Birthday = DateTime.Now,
  18. AddTime = DateTime.Now
  19. };
  20. bool addRes = SqlServerHelper.Insert<Dt_User>(newUser,nameof(Dt_Fruits.Id));

谢谢阅读,一起学习探讨!与君共勉!

用泛型创建SqlServerHelper类实现增删改查(一)的更多相关文章

  1. 使用MVC5+Entity Framework6的Code First模式创建数据库并实现增删改查功能

    此处采用VS2017+SqlServer数据库 一.创建项目并引用dll: 1.创建一个MVC项目 2.采用Nuget安装EF6.1.3 二.创建Model 在models文件夹中,建立相应的mode ...

  2. 【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创建

    数据库的创建和sql语句增删改查 1. 载入驱动. 2. 连接数据库. 3. 操作数据库. 创建表: create table person( _id integer primary key, nam ...

  3. 数据库开发基础-SQl Server 控制数据库的服务+数据库的创建与管理(增删改查)

    控制数据库的服务: 方法一: 1.Windows+R 打开运行  打开cmd 2.输入net start MSSQLserver 启动数据库服务 输入net stop MSSQLserver 关闭数据 ...

  4. BitAdminCore框架应用篇:(二)创建一个简单的增删改查模块

    NET Core应用框架之BitAdminCore框架应用篇系列 框架演示:http://bit.bitdao.cn 框架源码:https://github.com/chenyinxin/cookie ...

  5. 数据库开发基础-★SQl Server 控制数据库的服务+数据库的创建与管理(增删改查)★

    控制数据库的服务: 方法一: 1.Windows+R 打开运行  打开cmd 2.输入net start MSSQLserver 启动数据库服务 输入net stop MSSQLserver 关闭数据 ...

  6. linq的创建 和 数据的增删改查

    1.linq创建之前,一定要在sql做好数据表的主外键关系. 2.linq文件是以.dbml结尾,一般一个数据库的名字就是一个linq的名字 3,以实例来演示增删改查 数据库的名字为linq,里面有两 ...

  7. 利用SQLiteOpenHelper创建数据库,进行增删改查操作

    Android中提供SQLiteOpenHelper类,在该类的构造器中,调用Context中的方法创建并打开一个指定名称的数据库对象.继承和扩展SQLiteOpenHelper类主要做的工作就是重写 ...

  8. LinQ 创建连接、简单增删改查

    LINQ--语言集成查询(Language Integrated Query)是一组用于c#和Visual Basic语言的扩展.它允许编写C#或者Visual Basic代码以查询数据库相同的方式操 ...

  9. Day 18 :面向对象[基础,继承,组合]类的增删改查

    有的人说,编程有3种范式: 1.面向过程:就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了. 2.面向函数:面向函数是面向过程的升级版,也就是把每个 ...

随机推荐

  1. 如何编写通用的 Helper Class

    Github: https://github.com/nzbin/snack-helper Docs: https://nzbin.github.io/snack-helper 前言 什么是 help ...

  2. 我是如何理解Android的Handler模型_3

    AsyncTask则相当于现代化的电话系统,接线员的功能被完全封装了. 对于上例,新建更新TextView的类并继承AsyncTack类,如下: class UpdataTV extends Asyn ...

  3. 如何在ASP.NET Core Web API测试中使用Postman

    使用Postman进行手动测试 如果您是开发人员,测试人员或管理人员,则在构建和使用应用程序时,有时了解各种API方法可能是一个挑战. 使用带有.NET Core的Postman为您的Web API生 ...

  4. maven学习之1

    最近用maven的时候各种出问题,打算系统的学习一下maven,搞明白依赖之类的. (一)创建工程: mvn archetype:generate 这样就可以根据提示来建立一个maven项目,常用的有 ...

  5. 软件测试博客日记Day02-11.16日 —— 赵天宇 —— 禅道的使用和配置

    禅道 1. 安装 1. 进入禅道的官方下载地址:http://www.zentao.net/download/80053.html 2. 下载禅道开源版本. 3. 正常安装,注意一定要放在根目录下. ...

  6. python打包exe pyinstaller 简单使用

    源由 最近公司让做了一个小工具,使用python写的,写完之后要求能放在其它电脑上运行,于是就开始寻找方案; 按网上的说法 py2exe已经很久没更新了,资料也不多: 于是就采用pyinstaller ...

  7. vsftpd 安装

    vsftpd 安装 这里有最简洁的安装步骤 理想流程 [root@itdragon ~]# useradd ftpuser [root@itdragon ~]# passwd ftpuser Chan ...

  8. Lua API 小记1

    这些东西是平时遇到的, 觉得有一定的价值, 所以记录下来, 以后遇到类似的问题可以查阅, 同时分享出来也能方便需要的人, 转载请注明来自RingOfTheC[ring.of.the.c@gmail.c ...

  9. C语言之scanf

    #include<stdio.h>int main(){int num;int a,b,c,result,d,result1;scanf("int%d",&nu ...

  10. em单位使用小结

    em是一个css的单位. em是一个相对的单位.相对于当前对象内文本的字体尺寸.如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸.(引自CSS2.0手册) 一般在DOM元素中,当前 ...