自己写的访问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 { // 加载数据库驱动一次 ...
随机推荐
- vc++ CreateFile报错,返回123
//hFile = CreateFile("D:\dev\fmt\res\face1.png", 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, ...
- mysql字符串分割函数(行转列)
由于工作需要需要处理一些以逗号分隔的字符串,每次都要现做很是麻烦,网上找了很多都没有现成的,好吧,自己动手写一个好了 )) ) BEGIN /*函数功能: 把带逗号的字符串分割取出 参数: num 要 ...
- js select onchange事件
<select id='a' name='a' onchange="javascript:alert('测试');">
- Dragons
http://codeforces.com/problemset/problem/230/A Dragons time limit per test 2 seconds memory limit pe ...
- android93 进程优先级补充
###进程优先级(一个应用可以有多个进程,比如有Activity的进程和service的进程,)* 五种前台进程 * 拥有一个正在与用户交互的activity(onResume调用)的进程 * 拥有一 ...
- careercup-排序和查找 11.3
11.3 给定一个排序后的数组,包含n个整数,但这个数组已被旋转很多次,次数不详.请编写代码找出数组中的某个元素.可以假定数组元素原先是按从小到大的顺序排序的. 解法: 可以直接从开始一个一个比较,也 ...
- Mac OS X 10.7下找不到~/Library/Application Support的解决方案
28二 最近有台机器升级到了Mac OS X 10.7,Finder的sidebar变了不说,连用户目录下的Library目录也不见了.但是Terminal中是有的,估计是被隐藏了.直接在Finder ...
- cocos2d-x 开发中的小问题 在xcode4环境下
转自:http://hi.baidu.com/baby_66_/item/302353174f19521cd0d66df2 1.如果你在想怎么去搞定程序的开始运行的背景一闪而过的大图 以及icon想换 ...
- byte数组与对象之间的相互转换
在进行网络通信时可能需要传输对象,如果用NIO的话,只能用Bytebuffer和channel直接 通过ByteArray*Stream和Object*Stream可以将byte数组和对象进行相互的转 ...
- Java 实现折半查找
package search; import java.util.*; /*折半查找要求线性表是有序的,假设递增 * 基本思路:R[low...high]是当前的查找区间,首先确定中间位置mid=(l ...