自己写的访问SqlServer数据库的通用DAL层
如题,直接贴代码.
首先是DataTable转List<T>的方法,这个方法通用性极强.
#region Table转List
/// <summary>
/// Table转List
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dt"></param>
/// <returns></returns>
public static List<T> TableToList<T>(DataTable dt) where T : new()
{
// 定义集合
IList<T> list = new List<T>(); // 获得此模型的类型
Type type = typeof(T); foreach (DataRow dr in dt.Rows)
{
T t = new T(); // 获得公共属性
PropertyInfo[] propertys = t.GetType().GetProperties(); foreach (PropertyInfo pi in propertys)
{
// 判断此属性是否有Setter
if (!pi.CanWrite) continue; object value = dr[pi.Name];
if (value != DBNull.Value)
pi.SetValue(t, value, null);
} list.Add(t);
}
return list.ToList();
}
#endregion
下面贴出主要代码
/// <summary>
/// 数据访问基类:BaseService
/// </summary>
/// <typeparam name="T"></typeparam>
public class BaseService<T> : IBaseService<T> where T : class ,new()
{
/// <summary>
/// 得到某列最大值
/// </summary>
/// <param name="connection"></param>
/// <param name="fieldname"></param>
/// <returns></returns>
public virtual int GetMax(string connection,string fieldname)
{
#region 参数
T entity = new T();
SqlParameter[] parameters = new SqlParameter[]
{
new SqlParameter("@fieldname",fieldname)
};
#endregion StringBuilder sqlStr=new StringBuilder();
sqlStr.Append("select max(");
sqlStr.Append("@fieldname");
sqlStr.Append(") from ");
sqlStr.Append(entity.GetType().Name); return int.Parse(DatabaseAccess.SqlHelper.ExecuteDataSetText(connection, sqlStr.ToString(), parameters).Tables[].Rows[][].ToString());
} /// <summary>
/// 是否存在该记录
/// </summary>
/// <param name="connection">连接字符串</param>
/// <param name="primarykey">主键值</param>
/// <returns></returns>
public virtual bool Exists(string connection, object primarykey)
{
#region 参数
T entity = new T(); string primaryKey = GetPrimarykey(connection, entity);
List<SqlParameter> parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter("@" + primaryKey, primarykey));
#endregion StringBuilder sqlStr = new StringBuilder();
sqlStr.Append("select count(1) from ");
sqlStr.Append(entity.GetType().Name);
sqlStr.Append(" where ");
sqlStr.Append(primaryKey + "=@" + primaryKey); int res = DatabaseAccess.SqlHelper.ExecteNonQueryText(connection, sqlStr.ToString(), parameters.ToArray());
if (res > )
return true;
else
return false;
} /// <summary>
/// 增加一条数据
/// </summary>
public virtual bool Add(string connection, T entity)
{
#region 参数
List<SqlParameter> parameters = new List<SqlParameter>();
string fields = "";
string placeholders = "";
foreach (var item in entity.GetType().GetProperties())
{
fields += item.Name + ",";
placeholders += "@" + item.Name + ","; SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@" + item.Name;
parameter.Value = item.GetValue(entity, null);
parameters.Add(parameter);
}
#endregion StringBuilder sqlStr = new StringBuilder();
sqlStr.Append("insert " + entity.GetType().Name + " (");
sqlStr.Append(fields.Substring(, fields.Length - ) + ")");
sqlStr.Append(" values (");
sqlStr.Append(placeholders.Substring(, placeholders.Length - ) + ")"); int res = DatabaseAccess.SqlHelper.ExecteNonQueryText(connection, sqlStr.ToString(), parameters.ToArray());
if (res > )
return true;
else
return false;
} /// <summary>
/// 更新一条数据
/// </summary>
/// <param name="connection">连接字符串</param>
/// <param name="entity">类</param>
/// <returns></returns>
public virtual bool Update(string connection, T entity)
{
#region 参数
string primaryKey = GetPrimarykey(connection, entity);
List<SqlParameter> parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter("@"+primaryKey, entity.GetType().GetProperty(primaryKey).GetValue(entity,null)));
string fields = "";
foreach (var item in entity.GetType().GetProperties())
{
if (item.Name != primaryKey)
{
fields += item.Name + "=@" + item.Name + ","; SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@" + item.Name;
parameter.Value = item.GetValue(entity, null);
parameters.Add(parameter);
}
}
#endregion StringBuilder sqlStr = new StringBuilder();
sqlStr.Append("update " + entity.GetType().Name);
sqlStr.Append(" set ");
sqlStr.Append(fields.Substring(,fields.Length-));
sqlStr.Append(" where ");
sqlStr.Append(primaryKey + "=@" + primaryKey); int res = DatabaseAccess.SqlHelper.ExecteNonQueryText(connection, sqlStr.ToString(), parameters.ToArray());
if (res > )
return true;
else
return false;
} /// <summary>
/// 删除一条数据
/// </summary>
/// <param name="connection">连接字符串</param>
/// <param name="primaryKey">主键值</param>
/// <returns></returns>
public virtual bool Delete(string connection, object primarykey)
{
#region 参数
T entity = new T(); string primaryKey = GetPrimarykey(connection, entity);
List<SqlParameter> parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter("@" + primaryKey, primarykey));
#endregion StringBuilder sqlStr = new StringBuilder();
sqlStr.Append("delete from ");
sqlStr.Append(entity.GetType().Name);
sqlStr.Append(" where ");
sqlStr.Append(primaryKey + "=@" + primaryKey); int res = DatabaseAccess.SqlHelper.ExecteNonQueryText(connection, sqlStr.ToString(), parameters.ToArray());
if (res > )
return true;
else
return false;
} /// <summary>
/// 删除多条数据
/// </summary>
/// <param name="connection">连接字符串</param>
/// <param name="base_idlist">主键值列表</param>
/// <returns></returns>
public virtual bool DeleteList(string connection, List<object> primarykeys)
{
#region 参数
T entity = new T(); string primaryKey = GetPrimarykey(connection, entity); string primaryKeys = "";
foreach(var item in primarykeys)
{
primaryKeys += item.ToString();
} List<SqlParameter> parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter("@" + primaryKey, primaryKeys));
#endregion StringBuilder sqlStr = new StringBuilder();
sqlStr.Append("delete from ");
sqlStr.Append(entity.GetType().Name);
sqlStr.Append(" where ");
sqlStr.Append(primaryKey + " in(@" + primaryKey + ")"); int res = DatabaseAccess.SqlHelper.ExecteNonQueryText(connection, sqlStr.ToString(), parameters.ToArray());
if (res > )
return true;
else
return false;
} /// <summary>
/// 得到一个对象实体
/// </summary>
/// <param name="connection">连接字符串</param>
/// <param name="primarykey">主键值</param>
/// <returns></returns>
public virtual T GetModel(string connection, object primarykey)
{
#region 参数
T entity = new T(); string primaryKey = GetPrimarykey(connection, entity); List<SqlParameter> parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter("@table", entity.GetType().Name));
parameters.Add(new SqlParameter("@" + primaryKey, primarykey));
#endregion StringBuilder sqlStr = new StringBuilder();
sqlStr.Append("select * from ");
sqlStr.Append(entity.GetType().Name);
sqlStr.Append(" where ");
sqlStr.Append(primaryKey + "=@" + primaryKey); return Common.ToList.TableToList<T>(DatabaseAccess.SqlHelper.ExecuteDataSetText(connection, sqlStr.ToString(), parameters.ToArray()).Tables[]).FirstOrDefault();
} /// <summary>
/// 获得数据列表
/// </summary>
/// <param name="connection">连接字符串</param>
/// <param name="strWhere">查询条件</param>
/// <returns></returns>
public virtual List<T> GetList(string connection, string strWhere)
{
#region 参数
T entity = new T(); List<SqlParameter> parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter("@where", strWhere));
#endregion StringBuilder sqlStr = new StringBuilder();
sqlStr.Append("select * from ");
sqlStr.Append(entity.GetType().Name);
if (strWhere.Trim().Length > )
sqlStr.Append(" where @where"); return Common.ToList.TableToList<T>(DatabaseAccess.SqlHelper.ExecuteDataSetText(connection, sqlStr.ToString(), parameters.ToArray()).Tables[]);
} /// <summary>
/// 获得总数
/// </summary>
/// <param name="connection">连接字符串</param>
/// <param name="strWhere">查询条件</param>
/// <returns></returns>
public virtual int GetRecordCount(string connection, string strWhere)
{
#region 参数
T entity = new T(); List<SqlParameter> parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter("@where", strWhere));
#endregion StringBuilder sqlStr = new StringBuilder();
sqlStr.Append("select count(1) FROM ");
sqlStr.Append(entity.GetType().Name);
if (strWhere.Trim().Length > )
sqlStr.Append(" where @where"); return int.Parse(DatabaseAccess.SqlHelper.ExecuteScalarText(connection, sqlStr.ToString(), parameters.ToArray()).ToString());
} /// <summary>
/// 执行sql语句
/// </summary>
/// <param name="connection"></param>
/// <param name="cmdtype"></param>
/// <param name="sql"></param>
/// <param name="parameters"></param>
/// <returns></returns>
public virtual int ExecteNonQuerySQL(string connection, CommandType cmdtype, string sql, params SqlParameter[] parameters)
{
return DatabaseAccess.SqlHelper.ExecteNonQuery(connection, cmdtype, sql, parameters);
} /// <summary>
/// 获取类主键
/// </summary>
/// <param name="connection">连接字符串</param>
/// <param name="entity">类</param>
/// <returns></returns>
public virtual string GetPrimarykey(string connection, T entity)
{
StringBuilder sqlStr = new StringBuilder();
sqlStr.Append("EXEC sp_pkeys @table_name='" + entity.GetType().Name + "'"); SqlParameter[] parameters = new SqlParameter[]
{ }; return DatabaseAccess.SqlHelper.ExecuteDataSetText(connection,sqlStr.ToString(),parameters).Tables[].Rows[]["COLUMN_NAME"].ToString();
} /// <summary>
/// 执行sql语句
/// </summary>
/// <param name="connection"></param>
/// <param name="cmdtype"></param>
/// <param name="sql"></param>
/// <param name="parameters"></param>
/// <returns></returns>
public virtual DataSet ExecuteDataSetSQL(string connection, CommandType cmdtype, string sql, params SqlParameter[] parameters)
{
return DatabaseAccess.SqlHelper.ExecuteDataSet(connection, cmdtype, sql, parameters);
}
}
这些方法中默认表都是有主键的,而且实体名称和表名一致,否则执行会报错.
这套方法已经被我用在一个旧项目的改造中,目前来看效果还是不错的,因此在这与大家分享,因为本人水平有限,而且没用太多时间去完善,这套代码肯定会有很多瑕疵,希望高手不吝赐教.
自己写的访问SqlServer数据库的通用DAL层的更多相关文章
- 针对SQLServer数据库的通用访问类
Web.config中代码 <configuration> <connectionStrings> <add name="connString" co ...
- NX二次开发-NX访问SqlServer数据库(增删改查)C#版
版本:NX9+VS2012+SqlServer2008r2 以前我写过一个NX访问MySQL数据库(增删改查)的文章https://www.cnblogs.com/nxopen2018/p/12297 ...
- VS2019项目docker启动且访问SQLSERVER数据库配置
VS2019编译.调试的Blazor纯前台项目,使用控制台启动,去连接纯后台的API项目,使用docker启动,并且通过EFCore访问SQLSERVER数据库,有几个地方需要修改配置: 一.前台连后 ...
- C#访问SQLServer数据库访问帮助类
SQLServer数据库访问帮助类 这里有一个Mysql帮助类的使用例子可以参考(大同小异) 写了一个Mysql的例子,SQLServer的差不多,一样的 C#简单三层结构设计UI.BLL.DAL 1 ...
- 外网访问SQLServer数据库holer实现
外网访问内网SQLServer数据库 内网主机上安装了SQLServer数据库,只能在局域网内访问,怎样从公网也能访问本地SQLServer数据库? 本文将介绍使用holer实现的具体步骤. 1. 准 ...
- Oracle透明网关访问SQLServer数据库
针对oracle数据库不同实例之间的数据访问,我们可以直接通过dblink访问,如果oracle数据库想访问mysql/sqlserver等数据库的数据,我们可以通过配置oracle透明网关实现异构数 ...
- .net core2.0通过entityframework访问Sqlserver数据库
.net core经历2.0版本之后,已经非常稳定,完全可以进行企业级开发并跨平台部署到几乎任何服务器.个人测试效率是.net core是.net framework效率的3倍.其他语言没有测试,等测 ...
- 使用android访问SQLServer数据库
1.SQL驱动 下载可以支持android的SQL驱动,下载地址http://sourceforge.net/projects/jtds/files/ 注意只能下载1.2.7版本.android不支持 ...
- Java jdbc访问sqlserver,oracle数据库
1.JDBC访问Oracle数据库 public class Jdbc_Oracle { // 静态代码块,只会执行一次,类似C#静态构造方法 static { try { // 加载数据库驱动一次 ...
随机推荐
- 【OpenCV学习笔记】之六 手写图像旋转函数---万丈高楼平地起
话说,平凡之处显真格,这一点也没错! 比如,对旋转图像进行双线性插值,很简单吧? 可,对我,折腾了大半天,也没有达到预期效果! 尤其是三个误区让我抓瞎好久: 1,坐标旋转公式. 这东西,要用 ...
- Cassandra的登录认证授权
cassandra的登录验证机制是独自的,数据是集群共享的 参考:http://blog.csdn.net/y_y_y_k_k_k_k/article/category/5943357 1.初始安装启 ...
- 关于学习汇编的一些规则的理解(div mul cf of)
->1.div(除法) 被除数/除数 ->一共有三种格式的除法,分别是8位,16位,32位,这里的位数表示的是除数的位数 ->实现div其实也很简单就是除数为被除数的一半就ok - ...
- 成员方法的this指针
1.我们知道成员方法中,有个隐式的this常量指针.考虑,Derived继承的成员方法中this指针的表面类型是什么?子类重写的虚方法中this指针的表面类型是什么? 2.Derived继承的方法,就 ...
- android 沉浸通知栏
IOS的沉浸式通知栏很高大上,通知栏和app统一颜色或样式,很美观.android上面也早就人实现这种效果了. 我在这边也写一个实现通知栏沉浸式的方法,目前只实现了相同颜色. 先要改布局文件xml & ...
- INSERT DELAYED 句法
INSERT 语句的 DELAYED 选项是一个 MySQL 特有的选项,如果你的客户端不能等待 INSERT 的完成,这将会是很有用的.This is a common problem when y ...
- 读写应用程序数据-CoreData
coreData数据最终的存储类型可以是:SQLite数据库.XML.二进制.内存里.自定义的数据类型. 和SQLite区别:只能取出整个实体记录,然后分解,之后才能得到实体的某个属性. 1.创建工程 ...
- I18N 国际编码
<%@ page language="java" import="java.util.*, cn.hncu.domain.*" pageEncoding= ...
- java学习粗略路线
首先是JAVA基础JAVA SE(用于开发和部署桌面.服务器以及嵌入设备和实时环境中的Java应用程序.) 之后是JAVA EE(java企业级标准开发),先学习Servlet(控制器).JSP(在h ...
- 1.shell之搭建Shell编程环境
第一次写博客,加点废话,学习linux有一段时间,随着学习的深入发现自己学的不够系统,特别是遇到一些莫名的问题时,我只有各种百度,运气好时能解决掉,差时到现在还没解决,就算解决了还是不清楚是怎么解决的 ...