ADO.Net数据库帮助类
public interface IDBHelper
{
/// <summary>
/// 执行sql语句
/// </summary>
/// <param name="sql"></param>
void ExecuteNonQuery(string sql, SqlParameter[] sqlParams = null);
/// <summary>
/// 执行sql返回单一结果
/// </summary>
/// <param name="sql"></param>
/// <param name="sqlParams"></param>
object ExecuteScalar(string sql, SqlParameter[] sqlParams = null);
/// <summary>
/// 事务执行sql
/// </summary>
/// <param name="sql"></param>
void ExecuteTrans(string sql, SqlParameter[] sqlParams = null);
/// <summary>
/// 获取单个实体
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="id"></param>
/// <returns></returns>
T QuerySingle<T>(T model,string tableName = null) where T : class, new(); /// <summary>
/// 查询数据表的全部数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
IEnumerable<T> QueryAll<T>(string tableName = null) where T : class, new(); /// <summary>
/// 插入实体
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <returns></returns>
void Insert<T>(T model, string tableName = null) where T : class, new(); /// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
/// <returns></returns>
void InsertList<T>(IEnumerable<T> list, string tableName = null) where T : class, new();
/// <summary>
/// 更新实体
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <returns></returns>
void Update<T>(T model, string tableName = null) where T : class, new(); /// <summary>
/// 根据Id删除
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="id"></param>
/// <returns></returns>
void Delete<T>(T model, string tableName = null) where T : class, new();
}
public class SQLHelper : IDBHelper
{
private string connString; public SQLHelper(string connString = null)
{
if(!string.IsNullOrEmpty(connString))
{
this.connString = connString;
}
else
{
this.connString = ConfigurationManager.ConnectionStrings["connString"].ToString();
}
} #region 执行sql语句
/// <summary>
/// 执行sql语句
/// </summary>
/// <param name="sql"></param>
public void ExecuteNonQuery(string sql, SqlParameter[] sqlParams = null)
{
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
if (sqlParams != null)
cmd.Parameters.AddRange(sqlParams);
cmd.ExecuteNonQuery();
}
}
/// <summary>
/// 执行sql语句,返回单一结果
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public object ExecuteScalar(string sql, SqlParameter[] sqlParams = null)
{
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
if (sqlParams != null)
cmd.Parameters.AddRange(sqlParams);
return cmd.ExecuteScalar();
}
}
/// <summary>
/// 事务执行sql
/// </summary>
/// <param name="sql"></param>
public void ExecuteTrans(string sql, SqlParameter[] sqlParams = null)
{
SqlTransaction trans = null;
try
{
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
trans = conn.BeginTransaction();
SqlCommand cmd = new SqlCommand(sql, conn);
if (sqlParams != null)
cmd.Parameters.AddRange(sqlParams);
cmd.ExecuteNonQuery();
trans.Commit();
}
}
catch (Exception ex)
{
if (trans != null && trans.Connection != null)
trans.Rollback();
throw ex;
}
}
#endregion #region 根据实体增删改查
/// <summary>
/// 删除
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="model"></param>
/// <param name="tableName"></param>
/// <returns></returns>
public void Delete<T>(T model, string tableName = null) where T : class, new()
{
Type type = typeof(T);
if (type.GetProperty("Id") == null)
{
throw new ArgumentNullException(string.Format("实体{0}必须包含主键Id字段", type.Name));
}
string _tableName = GetTableName<T>(tableName);
var Id = type.GetProperty("Id").GetValue(model);
string txtSql = string.Format("Delete from [{0}] Where Id=@id", _tableName);
ExecuteNonQuery(txtSql, new[] { new SqlParameter("@id", Id) });
}
/// <summary>
/// 插入
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="model"></param>
/// <param name="tableName"></param>
/// <returns></returns>
public void Insert<T>(T model, string tableName = null) where T : class, new()
{
Type type = typeof(T);
SqlParameter[] sqlParams = type.GetProperties().Where(p => p.Name != "Id").Select(s => new SqlParameter(string.Format("@{0}", s.Name), s.GetValue(model) ?? DBNull.Value)).ToArray();
string txtSql = GetInsertSql(model, tableName);
var result = ExecuteScalar(txtSql, sqlParams);
var idProperty = type.GetProperty("Id");
idProperty.SetValue(model,Convert.ChangeType(result, idProperty.PropertyType));//将插入生成的Id赋值给model }
/// <summary>
/// 插入多个实体
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
/// <param name="tableName"></param>
public void InsertList<T>(IEnumerable<T> list, string tableName = null) where T : class, new()
{
Type type = typeof(T);
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
foreach (var item in list)
{
SqlParameter[] sqlParams = type.GetProperties().Where(p => p.Name != "Id").Select(s => new SqlParameter(string.Format("@{0}", s.Name), s.GetValue(item) ?? DBNull.Value)).ToArray();
string txtSql = GetInsertSql<T>(item, tableName);
SqlCommand cmd = new SqlCommand(txtSql, conn);
if (sqlParams != null)
cmd.Parameters.AddRange(sqlParams);
var result = cmd.ExecuteScalar();
var idProperty = type.GetProperty("Id");
idProperty.SetValue(item, Convert.ChangeType(result, idProperty.PropertyType));//将插入生成的Id赋值给model
}
}
}
/// <summary>
/// 查询单个实体
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="model"></param>
/// <param name="tableName"></param>
/// <returns></returns>
public T QuerySingle<T>(T model, string tableName = null) where T : class, new()
{
Type type = typeof(T);
if (type.GetProperty("Id") == null)
{
throw new ArgumentNullException(string.Format("实体{0}必须包含主键Id字段", type.Name));
}
string _tableName = GetTableName<T>(tableName);
var Id = type.GetProperty("Id").GetValue(model);
string selectField = string.Join(",", type.GetProperties().Select(s => string.Format("[{0}]", s.Name)));
string txtSql = string.Format("select {0} from [{1}] where Id =@id", selectField, _tableName);
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
SqlCommand cmd = new SqlCommand(txtSql, conn);
cmd.Parameters.Add(new SqlParameter("@id",Id));
SqlDataReader reader = cmd.ExecuteReader();
return ReaderToEntity<T>(reader);
}
}
/// <summary>
/// 查询所有
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="tableName"></param>
/// <returns></returns>
public IEnumerable<T> QueryAll<T>(string tableName = null) where T : class, new()
{
Type type = typeof(T);
string selectField = string.Join(",", type.GetProperties().Select(p => string.Format("[{0}]", p.Name)));
string txtSql = string.Format("select {0} from [{1}]", selectField, type.Name);
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
SqlCommand cmd = new SqlCommand(txtSql, conn);
SqlDataReader reader = cmd.ExecuteReader();
return ReaderToList<T>(reader);
}
}
/// <summary>
/// 更新
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="model"></param>
/// <param name="tableName"></param>
public void Update<T>(T model, string tableName = null) where T : class, new()
{
Type type = typeof(T);
if (type.GetProperty("Id") == null)
{
throw new ArgumentNullException(string.Format("实体{0}必须包含主键Id字段", type.Name));
}
string _tableName = GetTableName<T>(tableName);
string setCloums = string.Join(",", type.GetProperties().Where(p => p.Name != "Id").Select(s => string.Format("[{0}]=@{0}", s.Name)));
string txtSql = string.Format("update [{0}] set {1} where Id =@id",_tableName,setCloums);
SqlParameter[] sqlParams = type.GetProperties().Select(s => new SqlParameter(string.Format("@{0}", s.Name), s.GetValue(model) ?? DBNull.Value)).ToArray();
ExecuteNonQuery(txtSql, sqlParams);
}
#endregion #region private
private string GetTableName<T>(string tableName)
{
string result = tableName;
if (string.IsNullOrEmpty(result))//如果参数tableName为空
{
//1.检查[tableName]属性
Type type = typeof(T);
var tableNameAttribute = (TableNameAttribute)type.GetCustomAttributes(typeof(TableNameAttribute), false).FirstOrDefault();
if (tableNameAttribute != null)
{
result = tableNameAttribute.TableName;
}
if (string.IsNullOrEmpty(result))
{
//2.[tableName]属性为空 用实体名称
result = type.Name;
}
} return result;
} private string GetInsertSql<T>(T model,string tableName)
{
Type type = typeof(T);
if (type.GetProperty("Id") == null)
{
throw new ArgumentNullException(string.Format("实体{0}必须包含主键Id字段", type.Name));
}
string _tableName = GetTableName<T>(tableName);
string txtColums = string.Join(",", type.GetProperties().Where(p => p.Name != "Id").Select(s => string.Format("[{0}]", s.Name)));
string txtValues = string.Join(",", type.GetProperties().Where(p => p.Name != "Id").Select(s => string.Format("@{0}", s.Name)));
string txtSql = string.Format("insert into [{0}] ({1}) values({2});select @@identity;", _tableName, txtColums, txtValues);
return txtSql;
} private T ReaderToEntity<T>(SqlDataReader reader) where T : class, new()
{
T entity = new T();
if (reader.Read())
{
Type type = typeof(T);
foreach (var item in type.GetProperties())
{
object oValue = reader[item.Name];
if (oValue is DBNull)
{
item.SetValue(entity, null);
}
else
{
item.SetValue(entity, oValue);
}
}
}
return entity;
} private IEnumerable<T> ReaderToList<T>(SqlDataReader reader) where T : class, new()
{
List<T> list = new List<T>();
if (reader.Read())
{
Type type = typeof(T);
do
{
T entity = new T();
foreach (var item in type.GetProperties())
{
object oValue = reader[item.Name];
if (oValue is DBNull)
{
item.SetValue(entity, null);
}
else
{
item.SetValue(entity, oValue);
}
}
list.Add(entity);
}
while (reader.Read());
}
return list;
}
#endregion
}
ADO.Net数据库帮助类的更多相关文章
- ADO.NET 数据库操作类
操作数据类 避免代码重用.造对象太多.不能分工开发 利用面向对象的方法,把数据访问的方式优化一下,利用封装类 一般封装成三个类: 1.数据连接类 提供数据连接对象 需要引用命名空间: using ...
- ADO.NET数据库操作助手类
SQL语句操作增删查改助手类 using System; using System.Collections.Generic; using System.Configuration; using Sys ...
- 我也来写:数据库访问类DBHelper
一.前言 相信许多人都百度过:“.net 数据库访问类”.然后就出来一大堆SqlHelper.我也用过这些SqlHelper,也自己写过,一堆静态方法,开始使用起来感觉很不错,它们也确实在很多时候可以 ...
- 我也来写:数据库访问类DBHelper(转)
一.前言 相信许多人都百度过:“.net 数据库访问类”.然后就出来一大堆SqlHelper.我也用过这些SqlHelper,也自己写过,一堆静态方法,开始使用起来感觉很不错,它们也确实在很多时候可以 ...
- 一个通用数据库访问类(C#,SqlClient)
本文转自:http://www.7139.com/jsxy/cxsj/c/200607/114291.html使用ADO.NET时,每次数据库操作都要设置connection属性.建立connecti ...
- ADO.Net 数据库查询
数据库中的表: VS查询代码: using System; using System.Collections.Generic; using System.Linq; using System.Text ...
- VC++下使用ADO操作数据库
VC++下使用ADO操作数据库主要要用到 _ConnectionPtr,_CommandPtr,_RecordsetPtr三个ADO对象指针,我查找了相关资料,发现网上源码很多,但是都相对凌乱,于是自 ...
- ADO.NET数据库编程
ADO.NET数据库编程 1.ADO.NET的相关概念. Microsoft的新一代技术,是ADO组件的后继者. 主要目的是在.NET Framework平台存取数据. 提供一致的对象模型,可以存取和 ...
- 学习实践:使用模式,原则实现一个C++数据库访问类
一.概述 在我参与的多个项目中,大家使用libMySQL操作MySQL数据库,而且是源码即复用,在多个项目中有多套相同或相似的源码,这样的复用方式给开发带来了不变,而且libMySQL的使用比较麻烦, ...
随机推荐
- Python排序 插入排序
插入排序从前往后遍历数组的每一个元素,对每一位元素都将其插入到已经有序的部分数组中,所以插入排序的要点就是找出要插入元素在已经有序的部分中的位置,同时,由于插入排序采用原地排序(in-place)算法 ...
- [terry笔记]redhat5.5_11gR2_RAC_安装
redhat5.5_11gR2_RAC_安装,这篇主要记录RAC安装的执行步骤,最烦琐的就是前期配置,到后面图形界面runInstaller,asmca,dbca就很容易了. --hostname检查 ...
- 洛谷——P2863 [USACO06JAN]牛的舞会The Cow Prom
https://www.luogu.org/problem/show?pid=2863#sub 题目描述 The N (2 <= N <= 10,000) cows are so exci ...
- 不安装Oracle客户端,用plsql连接远程Oracle数据库(绝对解决你的问题)
1,首先准备下载两个软件,一个是instantclient.zip,另一个是plsql安装包.但是得确定您的电脑是32位还是64位,我这边提供了32位和64位的供您下载: 百度网盘:https://p ...
- 走进 CPU 的 Cache
看了上一篇文章.你可能非常想知道,为什么程序的执行结果会是这样.如今,就让我们来走进 CPU 的世界. 在 SMP(对称多处理器)时代,多个 CPU 一起工作.使运算能力进一步提升,那么CPU 是怎样 ...
- IIS Express加入MIME映射
近期在用Grid Report做Web报表的时候,碰到一件非常挠头的事. 本地用VS2010写的代码,调试的时候Web报表无法显示,用24.248server上VS2013相同仍是无法显示.最后把项目 ...
- sage开发url替换字符串
/// <summary> /// Url字段值替换,无该字段则加入 /// </summary> /// <param ...
- 怎样选择正确的HTTP状态码
本文来源于我在InfoQ中文站翻译的文章.原文地址是:http://www.infoq.com/cn/news/2015/12/how-to-choose-http-status-code 众所周知. ...
- 由老同事学习SAP所想到的
前段时间一位老同事在微信上跟我说他们公司正计划导SAP系统,但整个IT中心几乎无人使用过SAP,知道我在这行业干了多年了,所以想问我怎么开始学习.于是我约他今天出来聊聊,顺便把手里的SAP ECC E ...
- sass07 函数
scsss @function double($width){ //自定义函数u @return $width * 2; } @function double($width){ //自定义函数u @i ...