如题,直接贴代码.

首先是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层的更多相关文章

  1. 针对SQLServer数据库的通用访问类

    Web.config中代码 <configuration> <connectionStrings> <add name="connString" co ...

  2. NX二次开发-NX访问SqlServer数据库(增删改查)C#版

    版本:NX9+VS2012+SqlServer2008r2 以前我写过一个NX访问MySQL数据库(增删改查)的文章https://www.cnblogs.com/nxopen2018/p/12297 ...

  3. VS2019项目docker启动且访问SQLSERVER数据库配置

    VS2019编译.调试的Blazor纯前台项目,使用控制台启动,去连接纯后台的API项目,使用docker启动,并且通过EFCore访问SQLSERVER数据库,有几个地方需要修改配置: 一.前台连后 ...

  4. C#访问SQLServer数据库访问帮助类

    SQLServer数据库访问帮助类 这里有一个Mysql帮助类的使用例子可以参考(大同小异) 写了一个Mysql的例子,SQLServer的差不多,一样的 C#简单三层结构设计UI.BLL.DAL 1 ...

  5. 外网访问SQLServer数据库holer实现

    外网访问内网SQLServer数据库 内网主机上安装了SQLServer数据库,只能在局域网内访问,怎样从公网也能访问本地SQLServer数据库? 本文将介绍使用holer实现的具体步骤. 1. 准 ...

  6. Oracle透明网关访问SQLServer数据库

    针对oracle数据库不同实例之间的数据访问,我们可以直接通过dblink访问,如果oracle数据库想访问mysql/sqlserver等数据库的数据,我们可以通过配置oracle透明网关实现异构数 ...

  7. .net core2.0通过entityframework访问Sqlserver数据库

    .net core经历2.0版本之后,已经非常稳定,完全可以进行企业级开发并跨平台部署到几乎任何服务器.个人测试效率是.net core是.net framework效率的3倍.其他语言没有测试,等测 ...

  8. 使用android访问SQLServer数据库

    1.SQL驱动 下载可以支持android的SQL驱动,下载地址http://sourceforge.net/projects/jtds/files/ 注意只能下载1.2.7版本.android不支持 ...

  9. Java jdbc访问sqlserver,oracle数据库

    1.JDBC访问Oracle数据库 public class Jdbc_Oracle { // 静态代码块,只会执行一次,类似C#静态构造方法 static { try { // 加载数据库驱动一次 ...

随机推荐

  1. 编程实例--for循环,找出0~100之间与8有关的正整数

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. Oracle学习过程(随时更新)

    1.入门 实用的一些查询语句: 查询用户所有表注释 select * from user_tab_comments 条件查询 根据两个值查询 select*from table where 字段 in ...

  3. 虚机分配静态IP地址

    在为虚机分配静态IP地址池的IP时,如果报错“没有从与 VMSubnet 相关的 IP 池中为虚拟网络适配器 9i [MAC: 001DD8B71C17] 分配 CA (客户地址)” 使用“动态获取” ...

  4. Mac RTX

    http://bbs.weiphone.com/read-htm-tid-1876850.html 公司的rtx还是2010的,如果是2011的就有mac版的了.直接到官网下. 那还是用2010的,尼 ...

  5. DirectoryEntry 活动目录的使用

    public class DirectoryHelper { public static string DomainName = System.Environment.UserDomainName; ...

  6. count(1) count(*)

    mysql from t; +---+ | +---+ | | | | +---+ rows in set (0.00 sec) mysql) from t; +----------+ ) | +-- ...

  7. 【iOS程序启动与运转】- RunLoop个人小结

    学习iOS开发一般都是从UI开始的,从只知道从IB拖控件,到知道怎么在方法里写代码,然后会显示什么样的视图,产生什么样的事件,等等.其实程序从启动开始,一直都是按照苹果封装好的代码运行着,暴露的一些属 ...

  8. Android和Java的轻巧Wire协议缓冲器

    Wire协议缓冲器 一个人必须有一个代码! -奥马尔小 由于我们的团队和项目增长,数据的种类和数量也随之增加. 成功将您简单的数据模型转换为复杂的! 无论您的应用程序将数据存储到磁盘或网络传送信号,该 ...

  9. Eclipse下使用Hadoop单机模式调试MapReduce程序

    在单机模式下Hadoop不会使用HDFS,也不会开启任何Hadoop守护进程,所有程序将在一个JVM上运行并且最多只允许拥有一个reducer 在Eclipse中新创建一个hadoop-test的Ja ...

  10. 深入Windows窗体原理及控件重绘技巧

    之前有学MFC的同学告诉我觉得Windows的控件重绘难以理解,就算重绘成功了还是有些地方不明白,我觉得可能很多人都有这样的问题,在这里我从Windows窗体的最基本原理来讲解,如果你有类似的疑惑希望 ...