如题,直接贴代码.

首先是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. 避免在C#中使用析构函数Finalizer

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:避免在C#中使用析构函数Finalizer.

  2. Rational Rose 2007 &amp;Rational Rose 2003 下载及破解方法和汉化文件下载

    这么好的东西,不拿来出分享,我对不起原作者呀.可是我这里不知道作者是谁,感谢在先了. ed2k://|file|%5BIBM%E8%BD%AF%E4%BB%B6%E7%B3%BB%E5%88%97%5 ...

  3. 2014上海全国邀请赛题解 HDOJ 5090-5099

    HDOJ 5090 水题.从小到大排序,能够填充达到符合条件的.先填充好.填充之后进行调整. 传送门:pid=5090">点击打开链接 #include <cstdio> ...

  4. [ES6] 20. Polyfills

    Polyfill is something you don't need to set up traceur but start to use es6 in today's browser.You c ...

  5. 从BAE到SAE,从SAE又回到BAE

    版权声明:本文为博主原创文章,未经博主允许不得转载. [很久以后] 这段话是很久之后补充的,发现错误要勇于改正,以下红色字体是对以前观点的改正, 大概总结下: 1.bae最大缺点是需要备案,不过现在看 ...

  6. Android 接收短信

    启动程序时启动一个service,在service里注册接收短信的广播,当手机收到短信里,打印出短信内容跟电话号码. package com.lmy.SmsListener; import andro ...

  7. css :after和:before

    :before是css中的一种伪元素,可用于在某个元素之前插入某些内容.:after是css中的一种伪元素,可用于在某个元素之后插入某些内容. 举例: 1.结合border写个对话框的样式. < ...

  8. wxPython ImportError DLL load failed: %1 不是有效的 Win32 应用程序 解决办法

    原因:python是32位的,装了64位的Wxpython时会报错,具体错误是安装库文件与python的动态库的位数未一致. 特别留意32位/64位指的不是 系统的位数,而是Python的位数. 64 ...

  9. 2013调试sql的方法

    view-sql server object explorer- 连接数据库-成功以后再服务器点击允许debug-在存储过程里面添加断点即可

  10. webstom 如何获取github上面的项目工程

    需要你配好webstorm的github相关的配置,安装好git.exe; 如何配置请参考: webstorm 如何配置git 这个点击github后 会有个提示框 如下图: 如果没有成功,会弹出下面 ...