标签:
这只是开篇,会持续更新。
目前用到反射较多,影响性能啊,后期考虑用映射,不过映射恐怕又要写配置文件,麻烦啊。
1.项目结构
目前支持 SqlServer Access Oracle MySql 要支持其他数据库可以自己添加。
2.功能详解
2.1 database.config
将database.config放到网站根目录,名字不可改。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="SqlExeString" value="data source=wc\sqlexpress;database=441314;uid=sa;pwd=123456;"/> <add key="DatabaseType" value="SqlServer"/> </appSettings> </configuration>
SqlExeString:表示数据库连接字符串
DatabaseType:表示数据库类型。目前支持(SqlServer,Access,Oracle,MySql)
2.2 ISqlExe(接口类)
SqlExe是WangSql最核心的部分,而ISqlExe是SqlExe的接口类。
ISqlExe提供了所有方法的接口,定义如下:
public interface ISqlExe { #region 执行事务 /// <summary> /// 执行事务 /// </summary> bool Transaction(Hashtable sqlList); #endregion #region sql执行过程 增删改 /// <summary> /// NonQuery 无参 /// </summary> int NonQuery(string sql); /// <summary> /// NonQuery 有参 /// </summary> int NonQuery(string sql, object para); #endregion #region sql执行过程 查询 #region 无参 /// <summary> /// Query 无参 /// </summary> DataTable Query(string sql); /// <summary> /// QueryObject 无参 /// </summary> T QueryObject<T>(string sql); /// <summary> /// QueryModel 无参 /// </summary> T QueryModel<T>(string sql) where T : new(); /// <summary> /// QueryList 无参 /// </summary> List<T> QueryList<T>(string sql) where T : new(); #endregion #region 有参 /// <summary> /// Query 有参 /// </summary> DataTable Query(string sql, object para); /// <summary> /// QueryObject 有参 /// </summary> T QueryObject<T>(string sql, object para); /// <summary> /// QueryModel 有参 /// </summary> T QueryModel<T>(string sql, object para) where T : new(); /// <summary> /// QueryList 有参 /// </summary> List<T> QueryList<T>(string sql, object para) where T : new(); #endregion #endregion }
2.3 SqlExe实现方法
在文件夹Sql.SqlServer下所有的类都是为了实现ISqlExe的方法。
根据文件名就可以知道这里是SqlServer数据库的实现方法。
为了方面后续开发和管理,将SqlExe用部分类组合而成。每一部分处理各种不同的数据操作。
打开所有SqlExe.*.cs文件观察,不难发现命名空间是WangSql.SqlServer且所有类都是SqlExe(partial)继承自ISqlExe
来看看其中SqlExe.Query.cs的实现方法,听名字就知道只要是用来做查询操作的部分了。注释写的少了,抱歉。。。
public partial class SqlExe : ISqlExe { #region sql执行过程 查询 #region 无参 public DataTable Query(string sql) { DataTable dt = BaseQuery(sql); return dt; } public T QueryObject<T>(string sql) { T t; DataTable dt = BaseQuery(sql); if (dt != null && dt.Rows.Count > 0) { object result = dt.Rows[0][0]; t = (T)result; } else { t = default(T); } return t; } public T QueryModel<T>(string sql) where T : new() { T t; DataTable dt = BaseQuery(sql); if (dt != null && dt.Rows.Count > 0) { t = new T(); DataRow dr = dt.Rows[0]; PropertyInfo[] propertys = t.GetType().GetProperties(); foreach (PropertyInfo pi in propertys) { string tempName = pi.Name; if (dt.Columns.Contains(tempName)) { if (!pi.CanWrite) continue; object value = dr[tempName]; if (value != DBNull.Value) pi.SetValue(t, value, null); } } } else { t = default(T); } return t; } public List<T> QueryList<T>(string sql) where T : new() { List<T> tList; DataTable dt = BaseQuery(sql); if (dt != null && dt.Rows.Count > 0) { tList = new List<T>(); foreach (DataRow dr in dt.Rows) { T t = new T(); PropertyInfo[] propertys = t.GetType().GetProperties(); foreach (PropertyInfo pi in propertys) { string tempName = pi.Name; if (dt.Columns.Contains(tempName)) { if (!pi.CanWrite) continue; object value = dr[tempName]; if (value != DBNull.Value) pi.SetValue(t, value, null); } } tList.Add(t); } } else { tList = new List<T>(); } return tList; } #endregion #region 有参 public DataTable Query(string sql, object para) { DataTable dt = BaseQuery(sql, para); return dt; } public T QueryObject<T>(string sql, object para) { T t; DataTable dt = BaseQuery(sql, para); if (dt != null && dt.Rows.Count > 0) { object result = dt.Rows[0][0]; t = (T)result; } else { t = default(T); } return t; } public T QueryModel<T>(string sql, object para) where T : new() { T t; DataTable dt = BaseQuery(sql, para); if (dt != null && dt.Rows.Count > 0) { t = new T(); DataRow dr = dt.Rows[0]; PropertyInfo[] propertys = t.GetType().GetProperties(); foreach (PropertyInfo pi in propertys) { string tempName = pi.Name; if (dt.Columns.Contains(tempName)) { if (!pi.CanWrite) continue; object value = dr[tempName]; if (value != DBNull.Value) pi.SetValue(t, value, null); } } } else { t = default(T); } return t; } public List<T> QueryList<T>(string sql, object para) where T : new() { List<T> tList; DataTable dt = BaseQuery(sql, para); if (dt != null && dt.Rows.Count > 0) { tList = new List<T>(); foreach (DataRow dr in dt.Rows) { T t = new T(); PropertyInfo[] propertys = t.GetType().GetProperties(); foreach (PropertyInfo pi in propertys) { string tempName = pi.Name; if (dt.Columns.Contains(tempName)) { if (!pi.CanWrite) continue; object value = dr[tempName]; if (value != DBNull.Value) pi.SetValue(t, value, null); } } tList.Add(t); } } else { tList = new List<T>(); } return tList; } #endregion #region 查询基方法 private DataTable BaseQuery(string sql) { var result = helper.ExecuteReader(sql); return result; } private DataTable BaseQuery(string sql, object para) { Hashtable ht = null; string typeName = para.GetType().FullName; if (ToWhat.IsModel(typeName))//Model入参 { ht = ToWhat.ModelToHashtable(para); List<string> paraName = new List<string>(); string sqlTag = ToWhat.SqlInit(sql, out paraName); SqlParameter[] sqlParas = new SqlParameter[paraName.Count]; for (int i = 0; i < paraName.Count; i++) { string key = paraName[i]; object value = ht[key]; sqlParas[i] = new SqlParameter("@" + key, value); } var result = helper.ExecuteReader(sqlTag, sqlParas); return result; } else if (typeName.Contains("Hashtable"))//Hashtanle入参 { ht = (Hashtable)para; List<string> paraName = new List<string>(); string sqlTag = ToWhat.SqlInit(sql, out paraName); SqlParameter[] sqlParas = new SqlParameter[paraName.Count]; for (int i = 0; i < paraName.Count; i++) { string key = paraName[i]; object value = ht[key]; sqlParas[i] = new SqlParameter("@" + key, value); } var result = helper.ExecuteReader(sqlTag, sqlParas); return result; } else//一个参数入参 { List<string> paraName = new List<string>(); string sqlTag = ToWhat.SqlInit(sql, out paraName); SqlParameter[] sqlParas = new SqlParameter[paraName.Count]; for (int i = 0; i < paraName.Count; i++) { string key = paraName[i]; object value = para; sqlParas[i] = new SqlParameter("@" + key, value); } var result = helper.ExecuteReader(sqlTag, sqlParas); return result; } } #endregion #endregion }
2.3 ToWhat.cs
里面有一些公用的方法,下面详细讲讲其中SqlInit和IsModel方法
主要是在上面也用到了这两个方法。
2.3.1 SqlInit
用来初始化sql语句的,在WangSql里面写SQL语句是有规范的,不过也和平时写的差不多。
SQL语句例子
/// <summary> /// 用户新增 /// </summary> public const string UserInsert = "insert into [User](UserName,Password) values(#UserName#,#Password#)";
参数用##包起来。
SqlInit就是用来获取sql语句需要的参数名和初始化sql语句。
public static string SqlInit(string sql, out List<string> paraName) { string sqlTag = sql; List<string> sqlParaName = new List<string>(); Regex regex = new Regex("(#(.[^#]+)#)"); var ms = regex.Matches(sql); foreach (Match item in ms) { var p1 = item.Groups[1]; var p2 = item.Groups[2]; sqlTag = sqlTag.Replace(p1.Value, "@" + p2.Value); sqlParaName.Add(p2.Value); } paraName = sqlParaName; return sqlTag; }
2.3.1 IsModel
这个方法用来判断传入的参数是否是系统参数还是我们自定义参数(Model)
public static bool IsModel(string fullName) { ////自定义判断该object对象是否是Model对象 ////例如Model全部放在Model下 //if (fullName.Contains("Model")) return true; //else return false; if (fullName.StartsWith("System.")) return false; else return true; }
目前这方法是有点问题,可以自己修改。
未完待续...
WangSql -- SqlExe 一个操作数据库的简单框架
标签:
原文地址:http://www.cnblogs.com/deeround/p/4728360.html