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

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

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

直接贴代码:(SqlServerHelper.cs)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Configuration; namespace SqlServerHelper
{
public static class SqlServerHelper
{
/// <summary>
/// 数据库连接字符串
/// </summary>
private static readonly string connString = ConfigurationManager.ConnectionStrings["Test"].ToString(); //数据库连接字符 /// <summary>
/// 根据id查询对象
/// </summary>
/// <typeparam name="T">对象类型</typeparam>
/// <param name="id">对象实例的Id(泛型:类型int或string)</param>
/// <param name="idName">条件的字段名称(主键名)</param>
/// <returns></returns>
public static T QueryById<T, I>(I id, string idName = "Id")
{
Type type = typeof(T);
string columnString = string.Join(",", type.GetProperties().Select(p => string.Format("[{0}]", p.Name)));
string sqlString = string.Format("select {0} from [{1}] where {2}={3}", columnString, type.Name, idName, id.GetType().Name.ToString() == "String" ? ("'" + id.ToString() + "'") : id.ToString());
var t = Activator.CreateInstance(type);
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
SqlCommand sqlCommand = new SqlCommand(sqlString, conn);
SqlDataReader reader = sqlCommand.ExecuteReader();
reader.Read();
SetValueByProperties(type, reader, t);
}
return (T)t;
} /// <summary>
/// 获取数据列表
/// </summary>
/// <typeparam name="T">对象类型</typeparam>
/// <returns></returns>
public static List<T> QueryAll<T>()
{
Type type = typeof(T);
string columnString = string.Join(",", type.GetProperties().Select(p => string.Format("[{0}]", p.Name)));
string sqlString = string.Format("select {0} from [{1}]", columnString, type.Name);
List<T> dataList = new List<T>();
using (SqlConnection conn=new SqlConnection(connString))
{
conn.Open();
SqlCommand sqlCommand = new SqlCommand(sqlString,conn);
SqlDataReader reader = sqlCommand.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
var t = Activator.CreateInstance(type);
SetValueByProperties(type, reader, t);
dataList.Add((T)t);
}
}
else
{
return null;
}
}
return dataList;
} /// <summary>
/// 插入对象
/// </summary>
/// <typeparam name="T">对象类型</typeparam>
/// <param name="t">对象实例</param>
/// <param name="idName">不插入的字段(自增键名)</param>
/// <returns></returns>
public static bool Insert<T>(T t, string idName = "Id")
{
Type type = typeof(T);
string sqlString = "insert [{0}] ({1}) values ({2})";
string columnString = string.Join(",", type.GetProperties().Where(p => p.Name != idName).Select(p => string.Format("[{0}]", p.Name)));
string valueString = string.Join(",", type.GetProperties().Where(p => p.Name != idName).Select(p => string.Format("@{0}", p.Name)));
sqlString = string.Format(sqlString, type.Name, columnString, valueString);
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
SqlCommand sqlCommand = new SqlCommand(sqlString, conn);
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();
sqlCommand.Parameters.AddRange(sqlParameter);
return sqlCommand.ExecuteNonQuery() > ;
}
} /// <summary>
/// 修改对象
/// </summary>
/// <typeparam name="T">对象类型</typeparam>
/// <param name="t">对象实例</param>
/// <param name="idName">自增键名或条件名</param>
/// <returns></returns>
public static bool Update<T>(T t, string idName = "Id")
{
Type type = typeof(T);
string sqlString = "update [{0}] set {1} where {2}={3}";
string setString = string.Join(",", type.GetProperties().Where(p => p.Name != idName).Select(p => string.Format("[{0}]=@{0}", p.Name)));
sqlString = string.Format(sqlString, type.Name, setString, idName,"@"+idName);
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
SqlCommand sqlCommand = new SqlCommand(sqlString, conn);
SqlParameter[] sqlParameter = type.GetProperties().Select(p => new SqlParameter(string.Format("@{0}", p.Name), p.GetValue(t, null) ?? DBNull.Value)).ToArray();
sqlCommand.Parameters.AddRange(sqlParameter);
return sqlCommand.ExecuteNonQuery() > ;
}
} /// <summary>
/// 设置值by属性(SQLreader)
/// </summary>
/// <param name="type">对象类型</param>
/// <param name="reader">sqlreader</param>
/// <param name="t">对象</param>
private static void SetValueByProperties(Type type, SqlDataReader reader, object t)
{
foreach (var item in type.GetProperties())
{
if (reader[item.Name] is DBNull) //判空
{
item.SetValue(t, null);
}
else
{
item.SetValue(t, reader[item.Name]);
}
}
}
}
}

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

Dt_Fruits.cs
using System;
using System.Collections.Generic;
using System.Text; namespace SqlServerHelper
{
public class Dt_Fruits
{
private int id;
public int Id
{
get { return id; }
set { id = value; }
} private string name;
public string Name
{
get { return name; }
set { name = value; }
} private int sort;
public int Sort
{
get { return sort; }
set { sort = value; }
} private DateTime addTime;
public DateTime AddTime
{
get { return addTime; }
set { addTime = value; }
}
}
}

Dt_User.cs

using System;
using System.Collections.Generic;
using System.Text; namespace SqlServerHelper
{
public class Dt_User
{
private int id;
public int Id
{
get { return id; }
set { id = value; }
} private string name;
public string Name
{
get { return name; }
set { name = value; }
} private string mob;
public string Mob
{
get { return mob; }
set { mob = value; }
} private string sex;
public string Sex
{
get { return sex; }
set { sex = value; }
} private DateTime birthday;
public DateTime Birthday
{
get { return birthday; }
set { birthday = value; }
} private DateTime addTime;
public DateTime AddTime
{
get { return addTime; }
set { addTime = value; }
}
}
}

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

直接上代码:

 //查询所有:
var userList = SqlServerHelper.QueryAll<Dt_User>(); //查询某一id:
var oneFruits = SqlServerHelper.QueryById<Dt_Fruits,int>();//查到芒果的所有信息 //修改
oneFruits.Name = "芒果:修改";
bool updateRes = SqlServerHelper.Update<Dt_Fruits>(oneFruits);//修改了芒果--》芒果:修改 //添加
var newUser = new Dt_User()
{
Name = "博客君",
Sex = "男",
Mob = "",
Birthday = DateTime.Now,
AddTime=DateTime.Now
};
bool addRes = SqlServerHelper.Insert<Dt_User>(newUser);

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

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

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

查询某一id  的数据

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

查询到的数据就不截图了

修改某一id 的数据

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

添加一条数据

 //添加
var newUser = new Dt_User()
{
Name = "博客君",
Sex = "男",
Mob = "",
Birthday = DateTime.Now,
AddTime=DateTime.Now
};
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”)即可。

完整的写法是这样的:

     //查询所有:
var userList = SqlServerHelper.QueryAll<Dt_User>(); //查询某一id:
var oneFruits = SqlServerHelper.QueryById<Dt_Fruits, int>(,nameof(Dt_Fruits.Id));//查到芒果的所有信息 //修改
oneFruits.Name = "芒果:修改";
bool updateRes = SqlServerHelper.Update<Dt_Fruits>(oneFruits,nameof(Dt_Fruits.Id));//修改了芒果--》芒果:修改 //添加
var newUser = new Dt_User()
{
Name = "博客君",
Sex = "男",
Mob = "",
Birthday = DateTime.Now,
AddTime = DateTime.Now
};
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. CSS3属性——“box-flex”

    CSS3的新增属性有很多,其中有一个比较神奇的,通常称为盒子模型布局,不需要把div浮动,也能合理分配.看如下例子: HTML: <div id="box"> < ...

  2. 对比MFC和Winform及WPF

    MFC 生成本机代码,自然是很快.可是,消息循环,减缓了界面显示速度.winform 封装了 win32 的api,多次进行P/invoke 操作 (大部分使用p/invoke操作封装),速度慢 .w ...

  3. [转载] ZooKeeper的Java客户端API

    转载自 http://www.cnblogs.com/ggjucheng/p/3370359.html http://zookeeper.apache.org/doc/trunk/javaExampl ...

  4. 基础拾遗-----mongoDB操作

    基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...

  5. Android开发之漫漫长途 番外篇——自定义View的各种姿势1

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  6. linux环境

    vim命令 http://www.cnblogs.com/softwaretesting/archive/2011/07/12/2104435.html 安装YouCompleteMe 按照百度搜索的 ...

  7. Python 简单socket模拟ssh

    OSI七层模型(Open System Interconnection,开放式系统互联) 应用层 表示层 回话层 传输层 tcp,udp 网络层 ip,icmp 数据链路层 mac地址 物理层 物理网 ...

  8. Office2016 KMS激活

    Office标准版激活 一新买本子需要安装Office,闲来无事就安装了一款Office Standard 2016,网上许多激活秘钥均已过期,无法激活,无奈下选择KMS激活. KMS下载链接如下: ...

  9. npoi导入导出

    NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作. NPOI是一个开源的Java读写Excel.WORD等微软OLE ...

  10. Unity3D获取资源的方法整理:

    在使用Unity3D做项目时,获取资源的方法大致分为两种.一种是通过写代码的方式,在程序运行时,自动获取资源:一种是通过手动拖拽的方式进行获取.不管是什么类型的资源都能通过这两种方式获得,下面拿图片资 ...