2. 数据库操作实现类 SqlHelper
代码
/**
*
* 2009-4-22
*
*
* 数据库操作的公共类
* */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Data;
using System.Data.SqlClient;
using CommonData.Model;
namespace CommonData.Data
{
public class SqlHelper:BaseEntityHelper,IDbHelper
{
private static SqlHelper instance = null;
public static SqlHelper Instance
{
get
{
if (instance == null)
{
instance = new SqlHelper();
}
return instance;
}
}
#region(数据库操作)
/// <summary>
/// 返回受影响行数
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <returns></returns>
public int ExecuteNonQuery(IDbProvider provider, string sqlString)
{
return ExecuteNonQuery(provider,sqlString,false,null);
}
/// <summary>
/// 返回受影响行数
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <param name="isProcedure">是否为存储过程</param>
/// <returns></returns>
public int ExecuteNonQuery(IDbProvider provider, string sqlString, bool isProcedure)
{
return ExecuteNonQuery(provider,sqlString,isProcedure,null);
}
/// <summary>
/// 返回受影响行数
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <param name="param">sql语句对应参数</param>
/// <returns></returns>
public int ExecuteNonQuery(IDbProvider provider, string sqlString, params IDataParameter[] param)
{
return ExecuteNonQuery(provider,sqlString,false,param);
}
/// <summary>
/// 返回受影响行数
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <param name="isProcedure">是否为存储过程,true 为存储过程</param>
/// <param name="param">sql语句对应参数</param>
/// <returns></returns>
public int ExecuteNonQuery(IDbProvider provider, string sqlString, bool isProcedure, params IDataParameter[] param)
{
provider.Connection.Open();
provider.Command.CommandText = sqlString;
if (isProcedure)
{
provider.Command.CommandType = CommandType.StoredProcedure;
}
else
{
provider.Command.CommandType = CommandType.Text;
}
provider.Command.Parameters.Clear();
provider.Command.Parameters.AddRange(param);
int line = provider.Command.ExecuteNonQuery();
return line;
}
/// <summary>
/// 返回查询语句第一行第一列
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <returns></returns>
public object ExecuteScalar(IDbProvider provider, string sqlString)
{
return ExecuteScalar(provider,sqlString,false,null);
}
/// <summary>
/// 返回查询语句第一行第一列
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <param name="isProcedure">是否是存储过程</param>
/// <returns></returns>
public object ExecuteScalar(IDbProvider provider, string sqlString, bool isProcedure)
{
return ExecuteScalar(provider,sqlString,isProcedure,null);
}
/// <summary>
/// 返回查询语句第一行第一列
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <param name="param">sql语句对应输入参数</param>
/// <returns></returns>
public object ExecuteScalar(IDbProvider provider, string sqlString, params IDataParameter[] param)
{
return ExecuteScalar(provider,sqlString,false,param);
}
/// <summary>
/// 返回查询语句第一行第一列
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <param name="isProcedure">是否为存储过程</param>
/// <param name="param">sql语句对应输入参数</param>
/// <returns></returns>
public object ExecuteScalar(IDbProvider provider, string sqlString, bool isProcedure, params IDataParameter[] param)
{
provider.Connection.Open();
provider.Command.CommandText = sqlString;
if (isProcedure)
{
provider.Command.CommandType = CommandType.StoredProcedure;
}
else
{
provider.Command.CommandType = CommandType.Text;
}
provider.Command.Parameters.Clear();
provider.Command.Parameters.AddRange(param);
object result = provider.Command.ExecuteScalar();
return result;
}
/// <summary>
/// 返回数据只读游标集
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <returns></returns>
public IDataReader ExecuteDataReader(IDbProvider provider, string sqlString)
{
return ExecuteDataReader(provider,sqlString,false, null);
}
/// <summary>
/// 返回数据只读游标集
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <param name="isProcedure">是否为存储过程</param>
/// <returns></returns>
public IDataReader ExecuteDataReader(IDbProvider provider, string sqlString, bool isProcedure)
{
return ExecuteDataReader(provider,sqlString,isProcedure,null);
}
/// <summary>
/// 返回数据只读游标集
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <param name="param">sql语句对应输入参数</param>
/// <returns></returns>
public IDataReader ExecuteDataReader(IDbProvider provider, string sqlString, params IDataParameter[] param)
{
return ExecuteDataReader(provider,sqlString,false,param);
}
/// <summary>
/// 返回数据只读游标集
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <param name="isProcedure">是否为存储过程</param>
/// <param name="param">sql语句对应输入参数</param>
/// <returns></returns>
public IDataReader ExecuteDataReader(IDbProvider provider, string sqlString, bool isProcedure, params IDataParameter[] param)
{
provider.Connection.Open();
provider.Command.CommandText = sqlString;
if (isProcedure)
{
provider.Command.CommandType = CommandType.StoredProcedure;
}
else
{
provider.Command.CommandType = CommandType.Text;
}
provider.Command.Parameters.Clear();
provider.Command.Parameters.AddRange(param);
IDataReader reader = provider.Command.ExecuteReader();
return reader;
}
/// <summary>
/// 获得数据表结构集合
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <returns></returns>
public DataTable ExecuteTable(IDbProvider provider, string sqlString)
{
return ExecuteTable(provider,sqlString,false,null);
}
/// <summary>
/// 获得数据表结构集合
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <param name="isProcedure">是否为存储过程</param>
/// <returns></returns>
public DataTable ExecuteTable(IDbProvider provider, string sqlString, bool isProcedure)
{
return ExecuteTable(provider,sqlString,isProcedure,null);
}
/// <summary>
/// 获得数据表结构集合
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <param name="param">sql语句对应参数</param>
/// <returns></returns>
public DataTable ExecuteTable(IDbProvider provider, string sqlString, params IDataParameter[] param)
{
return ExecuteTable(provider,sqlString,false,param);
}
/// <summary>
/// 获得数据表结构集合
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <param name="isProcedure">是否为存储过程</param>
/// <param name="param">sql语句对应参数</param>
/// <returns></returns>
public DataTable ExecuteTable(IDbProvider provider, string sqlString, bool isProcedure, params IDataParameter[] param)
{
provider.Connection.Open();
provider.Command.CommandText = sqlString;
if (isProcedure)
{
provider.Command.CommandType = CommandType.StoredProcedure;
}
else
{
provider.Command.CommandType = CommandType.Text;
}
provider.Command.Parameters.Clear();
provider.Command.Parameters.AddRange(param);
DataSet ds = new DataSet();
provider.Adapter.Fill(ds);
return ds.Tables[0];
}
#endregion
#region(创建占位符参数)
/// <summary>
/// 根据占位符名称创建参数
/// </summary>
/// <param name="name">占位符名称</param>
/// <returns></returns>
public IDataParameter CreateParameter(string name)
{
return CreateParameter(name, null);
}
/// <summary>
/// 根据占位符和值创建参数
/// </summary>
/// <param name="name">占位符名称</param>
/// <param name="value">占位符的值</param>
/// <returns></returns>
public IDataParameter CreateParameter(string name, object value)
{
SqlParameter p = new SqlParameter(name, value);
return p;
}
/// <summary>
/// 根据占位符名称,类型和值创建参数
/// </summary>
/// <param name="name">占位符名称</param>
/// <param name="type">参数的类型</param>
/// <param name="value">参数的值</param>
/// <returns></returns>
public IDataParameter CreateParameter(string name, DataType type, object value)
{
SqlParameter p = new SqlParameter(name, ConvertType(type));
p.Value = value;
return p;
}
/// <summary>
/// 根据占位符的名称,类型和大小创建参数
/// </summary>
/// <param name="name">占位符名称</param>
/// <param name="type">参数类型</param>
/// <param name="size">参数值大小</param>
/// <returns></returns>
public IDataParameter CreateParameter(string name, DataType type, int size)
{
SqlParameter p = new SqlParameter(name, ConvertType(type));
if (size > 0)
p.Size = size;
return p;
}
/// <summary>
/// 根据占位符的名称,类型,大小和值创建参数
/// </summary>
/// <param name="name">占位符名称</param>
/// <param name="type">参数类型</param>
/// <param name="size">参数大小</param>
/// <param name="value">参数值</param>
/// <returns></returns>
public IDataParameter CreateParameter(string name, DataType type, int size, object value)
{
SqlParameter p = new SqlParameter(name, ConvertType(type));
if (size > 0)
p.Size = size;
p.Value = value;
return p;
}
/// <summary>
/// 根据占位符名称和类型创建参数
/// </summary>
/// <param name="name">占位符名称</param>
/// <param name="type">占位符类型</param>
/// <returns></returns>
public IDataParameter CreateParameter(string name, DataType type)
{
SqlParameter p = new SqlParameter(name, ConvertType(type));
return p;
}
#endregion
#region(自动生成sql语句)
/// <summary>
/// 创建插入的sql语句
/// </summary>
/// <param name="entity">实体的公共接口</param>
/// <param name="param">数据值数组</param>
/// <returns></returns>
public string CreateInsertSql(IEntity entity, out IDataParameter[] param)
{
StringBuilder sbColumns = new StringBuilder("");
StringBuilder sbValues = new StringBuilder("");
ColumnAttribute[] columnAttribute = GetColumnAttribute(entity);
TableAttribute tableAttribute = GetTableAttribute(entity);
List<IDataParameter> list=new List<IDataParameter>();
sbColumns.AppendFormat("insert into {0} (",tableAttribute.Name);
sbValues.Append(" values (");
for (int i = 0; i < columnAttribute.Length; i++)
{
if (columnAttribute[i].AutoIncrement == false)
{
if (i == columnAttribute.Length - 1)
{
sbColumns.AppendFormat("{0}", columnAttribute[i].Name);
sbValues.Append("@"+columnAttribute[i].Name+"");
}
else
{
sbColumns.AppendFormat("{0},", columnAttribute[i].Name);
sbValues.Append("@" + columnAttribute[i].Name + ",");
}
list.Add(CreateParameter("@"+columnAttribute[i].Name,columnAttribute[i].Type,GetPropertyValue(entity,columnAttribute[i].Name)));
}
}
sbColumns.Append(")");
sbValues.Append(")");
param = list.ToArray();
return sbColumns.ToString()+sbValues.ToString();
}
/// <summary>
/// 创建修改的sql语句
/// </summary>
/// <param name="entity">公共实体接口</param>
/// <param name="param">修改参数值</param>
/// <returns></returns>
public string CreateUpdateSql(IEntity entity, out IDataParameter[] param)
{
StringBuilder sbColumn = new StringBuilder();
StringBuilder sbWhere = new StringBuilder();
ColumnAttribute[] columnAttribute = GetColumnAttribute(entity);
TableAttribute tableAttribute = GetTableAttribute(entity);
List<IDataParameter> list = new List<IDataParameter>();
sbColumn.AppendFormat("update {0} set ",tableAttribute.Name);
for (int i = 0; i < columnAttribute.Length; i++)
{
if (columnAttribute[i].PrimaryKey == true)
{
sbWhere.Append(" where " + columnAttribute[i].Name + "=@" + columnAttribute[i].Name + " ");
list.Add(CreateParameter("@" + columnAttribute[i].Name, columnAttribute[i].Type, GetPropertyValue(entity, columnAttribute[i].Name)));
}
else
{
if (columnAttribute[i].AutoIncrement == false)
{
if (i == columnAttribute.Length - 1)
{
sbColumn.AppendFormat(columnAttribute[i].Name + "=@" + columnAttribute[i].Name + " ");
}
else
{
sbColumn.AppendFormat(columnAttribute[i].Name + "=@" + columnAttribute[i].Name + ", ");
}
list.Add(CreateParameter("@" + columnAttribute[i].Name, columnAttribute[i].Type, GetPropertyValue(entity, columnAttribute[i].Name)));
}
}
}
param = list.ToArray();
return sbColumn.ToString()+sbWhere.ToString();
}
/// <summary>
/// 创建删除的sql语句(根据主键删除)
/// </summary>
/// <param name="entity"></param>
/// <param name="param"></param>
/// <returns></returns>
public string CreateDeleteSql(IEntity entity, out IDataParameter[] param)
{
StringBuilder sbTable = new StringBuilder("");
StringBuilder sbWhere = new StringBuilder("");
ColumnAttribute[] columnAttribute = GetColumnAttribute(entity);
TableAttribute tableAttribute = GetTableAttribute(entity);
List<IDataParameter> list = new List<IDataParameter>();
sbTable.AppendFormat("delete from {0} ",tableAttribute.Name);
foreach (ColumnAttribute ca in columnAttribute)
{
if (ca.PrimaryKey == true)
{
sbWhere.AppendFormat(" where {0}=@{1} ",ca.Name,ca.Name);
list.Add(CreateParameter("@"+ca.Name,ca.Type,GetPropertyValue(entity,ca.Name)));
}
}
param = list.ToArray();
return sbTable.ToString() + sbWhere.ToString();
}
/// <summary>
/// 创建查询单个实体的sql语句
/// </summary>
/// <param name="entity">实体公共接口</param>
/// <param name="param">占位符参数</param>
/// <returns></returns>
public string CreateSingleSql(IEntity entity, ref IDataParameter[] param)
{
return CreateSingleSql(entity.GetType(),ref param);
}
/// <summary>
/// 创建查询单个实体的sql语句
/// </summary>
/// <param name="type">实体类型</param>
/// <param name="param">占位符参数</param>
/// <returns></returns>
public string CreateSingleSql(Type type, ref IDataParameter[] param)
{
StringBuilder sb = new StringBuilder("");
ColumnAttribute[] columnAttribute = GetColumnAttribute(type);
TableAttribute tableAttribute = GetTableAttribute(type);
sb.AppendFormat("select * from {0} where ",tableAttribute.Name);
List<IDataParameter> list = new List<IDataParameter>();
foreach (ColumnAttribute ca in columnAttribute)
{
if (ca.PrimaryKey)
{
sb.AppendFormat("{0}=@{1}",ca.Name,ca.Name);
list.Add(CreateParameter("@"+ca.Name,ca.Type,null));
}
}
param = list.ToArray();
return sb.ToString();
}
/// <summary>
/// 创建查询所有数据的sql语句
/// </summary>
/// <param name="entity">公共实体借口</param>
/// <returns></returns>
public string CreateSingleSql(IEntity entity)
{
return CreateSingleSql(entity.GetType());
}
/// <summary>
/// 创建查询所有数据的sql语句
/// </summary>
/// <param name="type">实体类型</param>
/// <returns></returns>
public string CreateSingleSql(Type type)
{
StringBuilder sb = new StringBuilder("");
TableAttribute tableAttribute = GetTableAttribute(type);
sb.AppendFormat("select * from {0}",tableAttribute.Name);
return sb.ToString();
}
/// <summary>
/// 根据对象的属性创建sql查询语句
/// </summary>
/// <param name="entity">实体公共接口</param>
/// <param name="propertyName">实体属性名称</param>
/// <param name="value">实体属性值</param>
/// <returns></returns>
public string CreateQueryByPropertySql(IEntity entity, string propertyName, object value, out IDataParameter[] param)
{
Type type = entity.GetType();
return CreateQueryByPropertySql(type,propertyName,value,out param);
}
/// <summary>
/// 根据对象的属性创建sql查询语句
/// </summary>
/// <param name="type">实体的类型</param>
/// <param name="propertyName">实体属性名称</param>
/// <param name="value">实体属性值</param>
/// <returns></returns>
public string CreateQueryByPropertySql(Type type, string propertyName, object value,out IDataParameter[] param)
{
TableAttribute tableAttribute = GetTableAttribute(type);
StringBuilder sb = new StringBuilder("");
sb.AppendFormat("select * from {0} where ",tableAttribute.Name);
sb.Append(propertyName + "=@" + propertyName);
List<IDataParameter> list = new List<IDataParameter>();
list.Add(CreateParameter("@"+propertyName,value));
param = list.ToArray();
return sb.ToString();
}
/// <summary>
/// 根据多个属性创建sql查询语句
/// </summary>
/// <param name="entity">公共实体接口</param>
/// <param name="dic">属性值</param>
/// <returns></returns>
public string CreateQueryByPropertySql(IEntity entity, Dictionary<string, object> dic,out IDataParameter[] param)
{
return CreateQueryByPropertySql(entity.GetType(),dic,out param);
}
/// <summary>
/// 根据多个属性创建sql查询语句
/// </summary>
/// <param name="type">实体类型</param>
/// <param name="dic">属性值</param>
/// <returns></returns>
public string CreateQueryByPropertySql(Type type, Dictionary<string, object> dic, out IDataParameter[] param)
{
TableAttribute tableAttribute = GetTableAttribute(type);
StringBuilder sb = new StringBuilder("");
List<IDataParameter> list = new List<IDataParameter>();
sb.AppendFormat("select * from {0} where ", tableAttribute.Name);
for (int i = 0; i < dic.Keys.Count; i++)
{
string key = dic.Keys.ElementAt<string>(i);
if (i == dic.Keys.Count - 1)
{
sb.Append(key + "=@" + key + " ");
list.Add(CreateParameter("@" + key, dic[key]));
}
else
{
sb.Append(key + "=@" + key + " and ");
list.Add(CreateParameter("@" + key, dic[key]));
}
}
param = list.ToArray();
return sb.ToString();
}
/// <summary>
/// 根据某属性查询该属性值的数据行数
/// </summary>
/// <param name="entity">实体公共接口</param>
/// <param name="propertyName">实体属性名称</param>
/// <param name="value">实体属性值</param>
/// <returns></returns>
public string CreateQueryCountSql(IEntity entity, string propertyName, object value, out IDataParameter[] param)
{
TableAttribute tableAttribute = GetTableAttribute(entity.GetType());
StringBuilder sb = new StringBuilder("");
List<IDataParameter> list = new List<IDataParameter>();
if(propertyName!=null && propertyName!="")
{
sb.AppendFormat("select count(*) from {0} where ",tableAttribute.Name);
sb.Append(propertyName + "=@" + propertyName);
list.Add(CreateParameter("@" + propertyName, value));
}
else
{
sb.AppendFormat("select count(*) from {0} ", tableAttribute.Name);
}
param = list.ToArray();
return sb.ToString();
}
/// <summary>
/// 查询某实体的数据行数
/// </summary>
/// <param name="entity">实体公共接口</param>
/// <returns></returns>
public string CreateQueryCountSql(IEntity entity)
{
IDataParameter[] param = null;
return CreateQueryCountSql(entity,null,null,out param);
}
/// <summary>
/// 更具实体对象创建分页查询语句
/// </summary>
/// <param name="entity">实体公共接口</param>
/// <param name="page">翻页对象</param>
/// <returns></returns>
public string CreateQueryPageSql(IEntity entity, CommonPage page)
{
return CreateQueryPageSql(entity.GetType(),page);
}
/// <summary>
/// 更具实体类型创建分页查询语句
/// </summary>
/// <param name="type">实体类型</param>
/// <param name="page">翻页对象</param>
/// <returns></returns>
public string CreateQueryPageSql(Type type, CommonPage page)
{
TableAttribute tableAttribute = GetTableAttribute(type);
ColumnAttribute[] columnAttribute = GetColumnAttribute(type);
StringBuilder sb = new StringBuilder();
sb.AppendFormat("select top {0} * from {1} ", page.PageSize, tableAttribute.Name);
foreach (ColumnAttribute ca in columnAttribute)
{
if (ca.PrimaryKey)
{
sb.AppendFormat("where {0} not in (select top {1} {2} from {3} )", ca.Name, (page.PageIndex - 1) * page.PageSize, ca.Name, tableAttribute.Name);
break;
}
}
return sb.ToString();
}
#endregion
#region(对象和集合的操作)
/// <summary>
/// 根据一个泛型类型获得实体对象
/// </summary>
/// <typeparam name="T">泛型类型</typeparam>
/// <param name="reader">只读数据流</param>
/// <returns></returns>
public T ConvertToEntity<T>(IDataReader reader)
{
T entity = default(T);
Dictionary<int, LinkTableAttribute> dic = new Dictionary<int, LinkTableAttribute>();
if (reader.Read())
{
entity = EntityFactory.CreateInstance<T>();
PropertyInfo[] propertyInfos = GetTableInfo(entity.GetType()).Properties;
dic.Clear();
for (int i = 0; i < propertyInfos.Length; i++)
{
if (propertyInfos[i].GetCustomAttributes(typeof(LinkTableAttribute), false).Length > 0)
{
LinkTableAttribute linkTable = propertyInfos[i].GetCustomAttributes(typeof(LinkTableAttribute), false)[0] as LinkTableAttribute;
//dic.Add(linkTable.SqlPrefix, linkTable);
dic.Add(i, linkTable);
}
}
for (int i = 0; i < propertyInfos.Length; i++)
{
if (propertyInfos[i].GetCustomAttributes(typeof(ColumnAttribute), false).Length > 0)
{
object id = ConvertValue(propertyInfos[i].PropertyType, reader[propertyInfos[i].Name]);
propertyInfos[i].SetValue(entity, id, null);
ColumnAttribute column = propertyInfos[i].GetCustomAttributes(typeof(ColumnAttribute), false)[0] as ColumnAttribute;
foreach (int index in dic.Keys)
{
if (dic[index].SqlPrefix == column.Name)
{
Type entityType = dic[index].TableType;
IDataParameter[] param = new IDataParameter[] { };
string sql = CreateSingleSql(entityType, ref param);
param[0].Value = id;
IDbProvider provider = new SqlProvider();
using (IDataReader read = ExecuteDataReader(provider, sql, param))
{
ConstructorInfo ci = entityType.GetConstructor(new Type[] { });
Object result = ci.Invoke(new object[] { });
if (read.Read())
{
for (int j = 0; j < read.FieldCount; j++)
{
string name = read.GetName(j);
foreach (PropertyInfo pi in GetTableInfo(entityType).Properties)
{
if (pi.Name == name)
{
pi.SetValue(result, ConvertValue(pi.PropertyType, read[name]), null);
break;
}
}
}
}
propertyInfos[index].SetValue(entity, result, null);
}
}
}
}
}
}
return entity;
}
/// <summary>
/// 根据一个泛型类型查询一个集合
/// </summary>
/// <typeparam name="T">泛型类型</typeparam>
/// <param name="reader">只读数据流</param>
/// <returns></returns>
public IList<T> ConvertToList<T>(IDataReader reader)
{
IList<T> list = new List<T>();
//Dictionary<string, LinkTableAttribute> dic = new Dictionary<string, LinkTableAttribute>();
Dictionary<int, LinkTableAttribute> dic = new Dictionary<int, LinkTableAttribute>();
while (reader.Read())
{
T entity = EntityFactory.CreateInstance<T>();
PropertyInfo[] propertyInfos = GetTableInfo(entity.GetType()).Properties;
dic.Clear();
for (int i = 0; i < propertyInfos.Length; i++)
{
if (propertyInfos[i].GetCustomAttributes(typeof(LinkTableAttribute), false).Length > 0)
{
LinkTableAttribute linkTable = propertyInfos[i].GetCustomAttributes(typeof(LinkTableAttribute), false)[0] as LinkTableAttribute;
//dic.Add(linkTable.SqlPrefix, linkTable);
dic.Add(i, linkTable);
}
}
for (int i = 0; i < propertyInfos.Length; i++)
{
if (propertyInfos[i].GetCustomAttributes(typeof(ColumnAttribute), false).Length > 0)
{
object id=ConvertValue(propertyInfos[i].PropertyType, reader[propertyInfos[i].Name]);
propertyInfos[i].SetValue(entity, id, null);
ColumnAttribute column = propertyInfos[i].GetCustomAttributes(typeof(ColumnAttribute), false)[0] as ColumnAttribute;
foreach (int index in dic.Keys)
{
if (dic[index].SqlPrefix==column.Name)
{
Type entityType = dic[index].TableType;
IDataParameter[] param = new IDataParameter[] { };
string sql = CreateSingleSql(entityType, ref param);
param[0].Value = id;
IDbProvider provider = new SqlProvider();
using (IDataReader read = ExecuteDataReader(provider, sql, param))
{
ConstructorInfo ci = entityType.GetConstructor(new Type[] { });
Object result = ci.Invoke(new object[] { });
if (read.Read())
{
for (int j = 0; j < read.FieldCount; j++)
{
string name = read.GetName(j);
foreach (PropertyInfo pi in GetTableInfo(entityType).Properties)
{
if (pi.Name == name)
{
pi.SetValue(result, ConvertValue(pi.PropertyType, read[name]), null);
break;
}
}
}
}
propertyInfos[index].SetValue(entity,result,null);
}
}
}
}
}
list.Add(entity);
}
return list;
}
/// <summary>
/// 根据实体共同接口获得属性值
/// </summary>
/// <param name="entity">实体公共接口</param>
/// <param name="name">属性名称</param>
/// <returns></returns>
public object GetPropertyValue(IEntity entity, string name)
{
PropertyInfo pi = entity.GetType().GetProperty(name);
object result = null;
if (result == null)
{
result = pi.GetValue(entity,null);
}
return result;
}
/// <summary>
/// 根据泛型类型获得实体属性值
/// </summary>
/// <typeparam name="T">泛型类型</typeparam>
/// <param name="entity">实体公共接口</param>
/// <param name="name">实体属性名称</param>
/// <returns></returns>
public T GetPropertyValue<T>(IEntity entity, string name)
{
object result = GetPropertyValue(entity,name);
if (result == null)
{
return default(T);
}
else
{
return (T)result;
}
}
#endregion
#region(对象和数据一些其他操作)
/// <summary>
/// 根据公共实体接口类型设置该实体某个属性的值
/// </summary>
/// <param name="entity">公共实体接口</param>
/// <param name="name">属性名称</param>
/// <param name="value">属性的值</param>
public void SetPropertyValue(IEntity entity, string name, object value)
{
PropertyInfo pi = entity.GetType().GetProperty(name);
if (pi != null)
{
pi.SetValue(entity,value,null);
}
}
/// <summary>
/// 释放内存空间
/// </summary>
public void Dispose()
{
GC.SuppressFinalize(this);
}
/// <summary>
/// 数据库类型的转化
/// </summary>
/// <param name="type">程序中的类型</param>
/// <returns></returns>
private SqlDbType ConvertType(DataType type)
{
SqlDbType sqlType = SqlDbType.BigInt;
switch (type)
{
case DataType.Binary:
sqlType = SqlDbType.Binary;
break;
case DataType.Bit:
sqlType = SqlDbType.Bit;
break;
case DataType.Char:
sqlType = SqlDbType.Char;
break;
case DataType.Date:
sqlType = SqlDbType.Date;
break;
case DataType.DateTime:
sqlType = SqlDbType.DateTime;
break;
case DataType.Decimal:
sqlType = SqlDbType.Decimal;
break;
case DataType.Double:
sqlType = SqlDbType.Float;
break;
case DataType.Float:
sqlType = SqlDbType.Float;
break;
case DataType.GUID:
sqlType = SqlDbType.UniqueIdentifier;
break;
case DataType.Image:
sqlType = SqlDbType.Image;
break;
case DataType.Int16:
sqlType = SqlDbType.TinyInt;
break;
case DataType.Int32:
sqlType = SqlDbType.Int;
break;
case DataType.Int4:
sqlType = SqlDbType.TinyInt;
break;
case DataType.Int64:
sqlType = SqlDbType.BigInt;
break;
case DataType.Int8:
sqlType = SqlDbType.TinyInt;
break;
case DataType.Text:
sqlType = SqlDbType.NText;
break;
case DataType.UnsignedInt16:
sqlType = SqlDbType.TinyInt;
break;
case DataType.UnsignedInt32:
sqlType = SqlDbType.Int;
break;
case DataType.UnsignedInt4:
sqlType = SqlDbType.TinyInt;
break;
case DataType.UnsignedInt8:
sqlType = SqlDbType.TinyInt;
break;
case DataType.VarChar:
sqlType = SqlDbType.NVarChar;
break;
}
return sqlType;
}
/// <summary>
/// 根据数据类型转化
/// </summary>
/// <param name="type"></param>
/// <param name="value"></param>
/// <returns></returns>
private object ConvertValue(Type type, object value)
{
if (value == DBNull.Value)
return null;
return Convert.ChangeType(value, type);
}
public T ConvertValue<T>(Type type, object value)
{
object result = ConvertValue(type, value);
if (result == null)
return default(T);
else
return (T)result;
}
#endregion
}
}
*
* 2009-4-22
*
*
* 数据库操作的公共类
* */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Data;
using System.Data.SqlClient;
using CommonData.Model;
namespace CommonData.Data
{
public class SqlHelper:BaseEntityHelper,IDbHelper
{
private static SqlHelper instance = null;
public static SqlHelper Instance
{
get
{
if (instance == null)
{
instance = new SqlHelper();
}
return instance;
}
}
#region(数据库操作)
/// <summary>
/// 返回受影响行数
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <returns></returns>
public int ExecuteNonQuery(IDbProvider provider, string sqlString)
{
return ExecuteNonQuery(provider,sqlString,false,null);
}
/// <summary>
/// 返回受影响行数
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <param name="isProcedure">是否为存储过程</param>
/// <returns></returns>
public int ExecuteNonQuery(IDbProvider provider, string sqlString, bool isProcedure)
{
return ExecuteNonQuery(provider,sqlString,isProcedure,null);
}
/// <summary>
/// 返回受影响行数
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <param name="param">sql语句对应参数</param>
/// <returns></returns>
public int ExecuteNonQuery(IDbProvider provider, string sqlString, params IDataParameter[] param)
{
return ExecuteNonQuery(provider,sqlString,false,param);
}
/// <summary>
/// 返回受影响行数
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <param name="isProcedure">是否为存储过程,true 为存储过程</param>
/// <param name="param">sql语句对应参数</param>
/// <returns></returns>
public int ExecuteNonQuery(IDbProvider provider, string sqlString, bool isProcedure, params IDataParameter[] param)
{
provider.Connection.Open();
provider.Command.CommandText = sqlString;
if (isProcedure)
{
provider.Command.CommandType = CommandType.StoredProcedure;
}
else
{
provider.Command.CommandType = CommandType.Text;
}
provider.Command.Parameters.Clear();
provider.Command.Parameters.AddRange(param);
int line = provider.Command.ExecuteNonQuery();
return line;
}
/// <summary>
/// 返回查询语句第一行第一列
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <returns></returns>
public object ExecuteScalar(IDbProvider provider, string sqlString)
{
return ExecuteScalar(provider,sqlString,false,null);
}
/// <summary>
/// 返回查询语句第一行第一列
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <param name="isProcedure">是否是存储过程</param>
/// <returns></returns>
public object ExecuteScalar(IDbProvider provider, string sqlString, bool isProcedure)
{
return ExecuteScalar(provider,sqlString,isProcedure,null);
}
/// <summary>
/// 返回查询语句第一行第一列
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <param name="param">sql语句对应输入参数</param>
/// <returns></returns>
public object ExecuteScalar(IDbProvider provider, string sqlString, params IDataParameter[] param)
{
return ExecuteScalar(provider,sqlString,false,param);
}
/// <summary>
/// 返回查询语句第一行第一列
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <param name="isProcedure">是否为存储过程</param>
/// <param name="param">sql语句对应输入参数</param>
/// <returns></returns>
public object ExecuteScalar(IDbProvider provider, string sqlString, bool isProcedure, params IDataParameter[] param)
{
provider.Connection.Open();
provider.Command.CommandText = sqlString;
if (isProcedure)
{
provider.Command.CommandType = CommandType.StoredProcedure;
}
else
{
provider.Command.CommandType = CommandType.Text;
}
provider.Command.Parameters.Clear();
provider.Command.Parameters.AddRange(param);
object result = provider.Command.ExecuteScalar();
return result;
}
/// <summary>
/// 返回数据只读游标集
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <returns></returns>
public IDataReader ExecuteDataReader(IDbProvider provider, string sqlString)
{
return ExecuteDataReader(provider,sqlString,false, null);
}
/// <summary>
/// 返回数据只读游标集
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <param name="isProcedure">是否为存储过程</param>
/// <returns></returns>
public IDataReader ExecuteDataReader(IDbProvider provider, string sqlString, bool isProcedure)
{
return ExecuteDataReader(provider,sqlString,isProcedure,null);
}
/// <summary>
/// 返回数据只读游标集
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <param name="param">sql语句对应输入参数</param>
/// <returns></returns>
public IDataReader ExecuteDataReader(IDbProvider provider, string sqlString, params IDataParameter[] param)
{
return ExecuteDataReader(provider,sqlString,false,param);
}
/// <summary>
/// 返回数据只读游标集
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <param name="isProcedure">是否为存储过程</param>
/// <param name="param">sql语句对应输入参数</param>
/// <returns></returns>
public IDataReader ExecuteDataReader(IDbProvider provider, string sqlString, bool isProcedure, params IDataParameter[] param)
{
provider.Connection.Open();
provider.Command.CommandText = sqlString;
if (isProcedure)
{
provider.Command.CommandType = CommandType.StoredProcedure;
}
else
{
provider.Command.CommandType = CommandType.Text;
}
provider.Command.Parameters.Clear();
provider.Command.Parameters.AddRange(param);
IDataReader reader = provider.Command.ExecuteReader();
return reader;
}
/// <summary>
/// 获得数据表结构集合
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <returns></returns>
public DataTable ExecuteTable(IDbProvider provider, string sqlString)
{
return ExecuteTable(provider,sqlString,false,null);
}
/// <summary>
/// 获得数据表结构集合
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <param name="isProcedure">是否为存储过程</param>
/// <returns></returns>
public DataTable ExecuteTable(IDbProvider provider, string sqlString, bool isProcedure)
{
return ExecuteTable(provider,sqlString,isProcedure,null);
}
/// <summary>
/// 获得数据表结构集合
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <param name="param">sql语句对应参数</param>
/// <returns></returns>
public DataTable ExecuteTable(IDbProvider provider, string sqlString, params IDataParameter[] param)
{
return ExecuteTable(provider,sqlString,false,param);
}
/// <summary>
/// 获得数据表结构集合
/// </summary>
/// <param name="provider">数据提供加载驱动</param>
/// <param name="sqlString">sql语句</param>
/// <param name="isProcedure">是否为存储过程</param>
/// <param name="param">sql语句对应参数</param>
/// <returns></returns>
public DataTable ExecuteTable(IDbProvider provider, string sqlString, bool isProcedure, params IDataParameter[] param)
{
provider.Connection.Open();
provider.Command.CommandText = sqlString;
if (isProcedure)
{
provider.Command.CommandType = CommandType.StoredProcedure;
}
else
{
provider.Command.CommandType = CommandType.Text;
}
provider.Command.Parameters.Clear();
provider.Command.Parameters.AddRange(param);
DataSet ds = new DataSet();
provider.Adapter.Fill(ds);
return ds.Tables[0];
}
#endregion
#region(创建占位符参数)
/// <summary>
/// 根据占位符名称创建参数
/// </summary>
/// <param name="name">占位符名称</param>
/// <returns></returns>
public IDataParameter CreateParameter(string name)
{
return CreateParameter(name, null);
}
/// <summary>
/// 根据占位符和值创建参数
/// </summary>
/// <param name="name">占位符名称</param>
/// <param name="value">占位符的值</param>
/// <returns></returns>
public IDataParameter CreateParameter(string name, object value)
{
SqlParameter p = new SqlParameter(name, value);
return p;
}
/// <summary>
/// 根据占位符名称,类型和值创建参数
/// </summary>
/// <param name="name">占位符名称</param>
/// <param name="type">参数的类型</param>
/// <param name="value">参数的值</param>
/// <returns></returns>
public IDataParameter CreateParameter(string name, DataType type, object value)
{
SqlParameter p = new SqlParameter(name, ConvertType(type));
p.Value = value;
return p;
}
/// <summary>
/// 根据占位符的名称,类型和大小创建参数
/// </summary>
/// <param name="name">占位符名称</param>
/// <param name="type">参数类型</param>
/// <param name="size">参数值大小</param>
/// <returns></returns>
public IDataParameter CreateParameter(string name, DataType type, int size)
{
SqlParameter p = new SqlParameter(name, ConvertType(type));
if (size > 0)
p.Size = size;
return p;
}
/// <summary>
/// 根据占位符的名称,类型,大小和值创建参数
/// </summary>
/// <param name="name">占位符名称</param>
/// <param name="type">参数类型</param>
/// <param name="size">参数大小</param>
/// <param name="value">参数值</param>
/// <returns></returns>
public IDataParameter CreateParameter(string name, DataType type, int size, object value)
{
SqlParameter p = new SqlParameter(name, ConvertType(type));
if (size > 0)
p.Size = size;
p.Value = value;
return p;
}
/// <summary>
/// 根据占位符名称和类型创建参数
/// </summary>
/// <param name="name">占位符名称</param>
/// <param name="type">占位符类型</param>
/// <returns></returns>
public IDataParameter CreateParameter(string name, DataType type)
{
SqlParameter p = new SqlParameter(name, ConvertType(type));
return p;
}
#endregion
#region(自动生成sql语句)
/// <summary>
/// 创建插入的sql语句
/// </summary>
/// <param name="entity">实体的公共接口</param>
/// <param name="param">数据值数组</param>
/// <returns></returns>
public string CreateInsertSql(IEntity entity, out IDataParameter[] param)
{
StringBuilder sbColumns = new StringBuilder("");
StringBuilder sbValues = new StringBuilder("");
ColumnAttribute[] columnAttribute = GetColumnAttribute(entity);
TableAttribute tableAttribute = GetTableAttribute(entity);
List<IDataParameter> list=new List<IDataParameter>();
sbColumns.AppendFormat("insert into {0} (",tableAttribute.Name);
sbValues.Append(" values (");
for (int i = 0; i < columnAttribute.Length; i++)
{
if (columnAttribute[i].AutoIncrement == false)
{
if (i == columnAttribute.Length - 1)
{
sbColumns.AppendFormat("{0}", columnAttribute[i].Name);
sbValues.Append("@"+columnAttribute[i].Name+"");
}
else
{
sbColumns.AppendFormat("{0},", columnAttribute[i].Name);
sbValues.Append("@" + columnAttribute[i].Name + ",");
}
list.Add(CreateParameter("@"+columnAttribute[i].Name,columnAttribute[i].Type,GetPropertyValue(entity,columnAttribute[i].Name)));
}
}
sbColumns.Append(")");
sbValues.Append(")");
param = list.ToArray();
return sbColumns.ToString()+sbValues.ToString();
}
/// <summary>
/// 创建修改的sql语句
/// </summary>
/// <param name="entity">公共实体接口</param>
/// <param name="param">修改参数值</param>
/// <returns></returns>
public string CreateUpdateSql(IEntity entity, out IDataParameter[] param)
{
StringBuilder sbColumn = new StringBuilder();
StringBuilder sbWhere = new StringBuilder();
ColumnAttribute[] columnAttribute = GetColumnAttribute(entity);
TableAttribute tableAttribute = GetTableAttribute(entity);
List<IDataParameter> list = new List<IDataParameter>();
sbColumn.AppendFormat("update {0} set ",tableAttribute.Name);
for (int i = 0; i < columnAttribute.Length; i++)
{
if (columnAttribute[i].PrimaryKey == true)
{
sbWhere.Append(" where " + columnAttribute[i].Name + "=@" + columnAttribute[i].Name + " ");
list.Add(CreateParameter("@" + columnAttribute[i].Name, columnAttribute[i].Type, GetPropertyValue(entity, columnAttribute[i].Name)));
}
else
{
if (columnAttribute[i].AutoIncrement == false)
{
if (i == columnAttribute.Length - 1)
{
sbColumn.AppendFormat(columnAttribute[i].Name + "=@" + columnAttribute[i].Name + " ");
}
else
{
sbColumn.AppendFormat(columnAttribute[i].Name + "=@" + columnAttribute[i].Name + ", ");
}
list.Add(CreateParameter("@" + columnAttribute[i].Name, columnAttribute[i].Type, GetPropertyValue(entity, columnAttribute[i].Name)));
}
}
}
param = list.ToArray();
return sbColumn.ToString()+sbWhere.ToString();
}
/// <summary>
/// 创建删除的sql语句(根据主键删除)
/// </summary>
/// <param name="entity"></param>
/// <param name="param"></param>
/// <returns></returns>
public string CreateDeleteSql(IEntity entity, out IDataParameter[] param)
{
StringBuilder sbTable = new StringBuilder("");
StringBuilder sbWhere = new StringBuilder("");
ColumnAttribute[] columnAttribute = GetColumnAttribute(entity);
TableAttribute tableAttribute = GetTableAttribute(entity);
List<IDataParameter> list = new List<IDataParameter>();
sbTable.AppendFormat("delete from {0} ",tableAttribute.Name);
foreach (ColumnAttribute ca in columnAttribute)
{
if (ca.PrimaryKey == true)
{
sbWhere.AppendFormat(" where {0}=@{1} ",ca.Name,ca.Name);
list.Add(CreateParameter("@"+ca.Name,ca.Type,GetPropertyValue(entity,ca.Name)));
}
}
param = list.ToArray();
return sbTable.ToString() + sbWhere.ToString();
}
/// <summary>
/// 创建查询单个实体的sql语句
/// </summary>
/// <param name="entity">实体公共接口</param>
/// <param name="param">占位符参数</param>
/// <returns></returns>
public string CreateSingleSql(IEntity entity, ref IDataParameter[] param)
{
return CreateSingleSql(entity.GetType(),ref param);
}
/// <summary>
/// 创建查询单个实体的sql语句
/// </summary>
/// <param name="type">实体类型</param>
/// <param name="param">占位符参数</param>
/// <returns></returns>
public string CreateSingleSql(Type type, ref IDataParameter[] param)
{
StringBuilder sb = new StringBuilder("");
ColumnAttribute[] columnAttribute = GetColumnAttribute(type);
TableAttribute tableAttribute = GetTableAttribute(type);
sb.AppendFormat("select * from {0} where ",tableAttribute.Name);
List<IDataParameter> list = new List<IDataParameter>();
foreach (ColumnAttribute ca in columnAttribute)
{
if (ca.PrimaryKey)
{
sb.AppendFormat("{0}=@{1}",ca.Name,ca.Name);
list.Add(CreateParameter("@"+ca.Name,ca.Type,null));
}
}
param = list.ToArray();
return sb.ToString();
}
/// <summary>
/// 创建查询所有数据的sql语句
/// </summary>
/// <param name="entity">公共实体借口</param>
/// <returns></returns>
public string CreateSingleSql(IEntity entity)
{
return CreateSingleSql(entity.GetType());
}
/// <summary>
/// 创建查询所有数据的sql语句
/// </summary>
/// <param name="type">实体类型</param>
/// <returns></returns>
public string CreateSingleSql(Type type)
{
StringBuilder sb = new StringBuilder("");
TableAttribute tableAttribute = GetTableAttribute(type);
sb.AppendFormat("select * from {0}",tableAttribute.Name);
return sb.ToString();
}
/// <summary>
/// 根据对象的属性创建sql查询语句
/// </summary>
/// <param name="entity">实体公共接口</param>
/// <param name="propertyName">实体属性名称</param>
/// <param name="value">实体属性值</param>
/// <returns></returns>
public string CreateQueryByPropertySql(IEntity entity, string propertyName, object value, out IDataParameter[] param)
{
Type type = entity.GetType();
return CreateQueryByPropertySql(type,propertyName,value,out param);
}
/// <summary>
/// 根据对象的属性创建sql查询语句
/// </summary>
/// <param name="type">实体的类型</param>
/// <param name="propertyName">实体属性名称</param>
/// <param name="value">实体属性值</param>
/// <returns></returns>
public string CreateQueryByPropertySql(Type type, string propertyName, object value,out IDataParameter[] param)
{
TableAttribute tableAttribute = GetTableAttribute(type);
StringBuilder sb = new StringBuilder("");
sb.AppendFormat("select * from {0} where ",tableAttribute.Name);
sb.Append(propertyName + "=@" + propertyName);
List<IDataParameter> list = new List<IDataParameter>();
list.Add(CreateParameter("@"+propertyName,value));
param = list.ToArray();
return sb.ToString();
}
/// <summary>
/// 根据多个属性创建sql查询语句
/// </summary>
/// <param name="entity">公共实体接口</param>
/// <param name="dic">属性值</param>
/// <returns></returns>
public string CreateQueryByPropertySql(IEntity entity, Dictionary<string, object> dic,out IDataParameter[] param)
{
return CreateQueryByPropertySql(entity.GetType(),dic,out param);
}
/// <summary>
/// 根据多个属性创建sql查询语句
/// </summary>
/// <param name="type">实体类型</param>
/// <param name="dic">属性值</param>
/// <returns></returns>
public string CreateQueryByPropertySql(Type type, Dictionary<string, object> dic, out IDataParameter[] param)
{
TableAttribute tableAttribute = GetTableAttribute(type);
StringBuilder sb = new StringBuilder("");
List<IDataParameter> list = new List<IDataParameter>();
sb.AppendFormat("select * from {0} where ", tableAttribute.Name);
for (int i = 0; i < dic.Keys.Count; i++)
{
string key = dic.Keys.ElementAt<string>(i);
if (i == dic.Keys.Count - 1)
{
sb.Append(key + "=@" + key + " ");
list.Add(CreateParameter("@" + key, dic[key]));
}
else
{
sb.Append(key + "=@" + key + " and ");
list.Add(CreateParameter("@" + key, dic[key]));
}
}
param = list.ToArray();
return sb.ToString();
}
/// <summary>
/// 根据某属性查询该属性值的数据行数
/// </summary>
/// <param name="entity">实体公共接口</param>
/// <param name="propertyName">实体属性名称</param>
/// <param name="value">实体属性值</param>
/// <returns></returns>
public string CreateQueryCountSql(IEntity entity, string propertyName, object value, out IDataParameter[] param)
{
TableAttribute tableAttribute = GetTableAttribute(entity.GetType());
StringBuilder sb = new StringBuilder("");
List<IDataParameter> list = new List<IDataParameter>();
if(propertyName!=null && propertyName!="")
{
sb.AppendFormat("select count(*) from {0} where ",tableAttribute.Name);
sb.Append(propertyName + "=@" + propertyName);
list.Add(CreateParameter("@" + propertyName, value));
}
else
{
sb.AppendFormat("select count(*) from {0} ", tableAttribute.Name);
}
param = list.ToArray();
return sb.ToString();
}
/// <summary>
/// 查询某实体的数据行数
/// </summary>
/// <param name="entity">实体公共接口</param>
/// <returns></returns>
public string CreateQueryCountSql(IEntity entity)
{
IDataParameter[] param = null;
return CreateQueryCountSql(entity,null,null,out param);
}
/// <summary>
/// 更具实体对象创建分页查询语句
/// </summary>
/// <param name="entity">实体公共接口</param>
/// <param name="page">翻页对象</param>
/// <returns></returns>
public string CreateQueryPageSql(IEntity entity, CommonPage page)
{
return CreateQueryPageSql(entity.GetType(),page);
}
/// <summary>
/// 更具实体类型创建分页查询语句
/// </summary>
/// <param name="type">实体类型</param>
/// <param name="page">翻页对象</param>
/// <returns></returns>
public string CreateQueryPageSql(Type type, CommonPage page)
{
TableAttribute tableAttribute = GetTableAttribute(type);
ColumnAttribute[] columnAttribute = GetColumnAttribute(type);
StringBuilder sb = new StringBuilder();
sb.AppendFormat("select top {0} * from {1} ", page.PageSize, tableAttribute.Name);
foreach (ColumnAttribute ca in columnAttribute)
{
if (ca.PrimaryKey)
{
sb.AppendFormat("where {0} not in (select top {1} {2} from {3} )", ca.Name, (page.PageIndex - 1) * page.PageSize, ca.Name, tableAttribute.Name);
break;
}
}
return sb.ToString();
}
#endregion
#region(对象和集合的操作)
/// <summary>
/// 根据一个泛型类型获得实体对象
/// </summary>
/// <typeparam name="T">泛型类型</typeparam>
/// <param name="reader">只读数据流</param>
/// <returns></returns>
public T ConvertToEntity<T>(IDataReader reader)
{
T entity = default(T);
Dictionary<int, LinkTableAttribute> dic = new Dictionary<int, LinkTableAttribute>();
if (reader.Read())
{
entity = EntityFactory.CreateInstance<T>();
PropertyInfo[] propertyInfos = GetTableInfo(entity.GetType()).Properties;
dic.Clear();
for (int i = 0; i < propertyInfos.Length; i++)
{
if (propertyInfos[i].GetCustomAttributes(typeof(LinkTableAttribute), false).Length > 0)
{
LinkTableAttribute linkTable = propertyInfos[i].GetCustomAttributes(typeof(LinkTableAttribute), false)[0] as LinkTableAttribute;
//dic.Add(linkTable.SqlPrefix, linkTable);
dic.Add(i, linkTable);
}
}
for (int i = 0; i < propertyInfos.Length; i++)
{
if (propertyInfos[i].GetCustomAttributes(typeof(ColumnAttribute), false).Length > 0)
{
object id = ConvertValue(propertyInfos[i].PropertyType, reader[propertyInfos[i].Name]);
propertyInfos[i].SetValue(entity, id, null);
ColumnAttribute column = propertyInfos[i].GetCustomAttributes(typeof(ColumnAttribute), false)[0] as ColumnAttribute;
foreach (int index in dic.Keys)
{
if (dic[index].SqlPrefix == column.Name)
{
Type entityType = dic[index].TableType;
IDataParameter[] param = new IDataParameter[] { };
string sql = CreateSingleSql(entityType, ref param);
param[0].Value = id;
IDbProvider provider = new SqlProvider();
using (IDataReader read = ExecuteDataReader(provider, sql, param))
{
ConstructorInfo ci = entityType.GetConstructor(new Type[] { });
Object result = ci.Invoke(new object[] { });
if (read.Read())
{
for (int j = 0; j < read.FieldCount; j++)
{
string name = read.GetName(j);
foreach (PropertyInfo pi in GetTableInfo(entityType).Properties)
{
if (pi.Name == name)
{
pi.SetValue(result, ConvertValue(pi.PropertyType, read[name]), null);
break;
}
}
}
}
propertyInfos[index].SetValue(entity, result, null);
}
}
}
}
}
}
return entity;
}
/// <summary>
/// 根据一个泛型类型查询一个集合
/// </summary>
/// <typeparam name="T">泛型类型</typeparam>
/// <param name="reader">只读数据流</param>
/// <returns></returns>
public IList<T> ConvertToList<T>(IDataReader reader)
{
IList<T> list = new List<T>();
//Dictionary<string, LinkTableAttribute> dic = new Dictionary<string, LinkTableAttribute>();
Dictionary<int, LinkTableAttribute> dic = new Dictionary<int, LinkTableAttribute>();
while (reader.Read())
{
T entity = EntityFactory.CreateInstance<T>();
PropertyInfo[] propertyInfos = GetTableInfo(entity.GetType()).Properties;
dic.Clear();
for (int i = 0; i < propertyInfos.Length; i++)
{
if (propertyInfos[i].GetCustomAttributes(typeof(LinkTableAttribute), false).Length > 0)
{
LinkTableAttribute linkTable = propertyInfos[i].GetCustomAttributes(typeof(LinkTableAttribute), false)[0] as LinkTableAttribute;
//dic.Add(linkTable.SqlPrefix, linkTable);
dic.Add(i, linkTable);
}
}
for (int i = 0; i < propertyInfos.Length; i++)
{
if (propertyInfos[i].GetCustomAttributes(typeof(ColumnAttribute), false).Length > 0)
{
object id=ConvertValue(propertyInfos[i].PropertyType, reader[propertyInfos[i].Name]);
propertyInfos[i].SetValue(entity, id, null);
ColumnAttribute column = propertyInfos[i].GetCustomAttributes(typeof(ColumnAttribute), false)[0] as ColumnAttribute;
foreach (int index in dic.Keys)
{
if (dic[index].SqlPrefix==column.Name)
{
Type entityType = dic[index].TableType;
IDataParameter[] param = new IDataParameter[] { };
string sql = CreateSingleSql(entityType, ref param);
param[0].Value = id;
IDbProvider provider = new SqlProvider();
using (IDataReader read = ExecuteDataReader(provider, sql, param))
{
ConstructorInfo ci = entityType.GetConstructor(new Type[] { });
Object result = ci.Invoke(new object[] { });
if (read.Read())
{
for (int j = 0; j < read.FieldCount; j++)
{
string name = read.GetName(j);
foreach (PropertyInfo pi in GetTableInfo(entityType).Properties)
{
if (pi.Name == name)
{
pi.SetValue(result, ConvertValue(pi.PropertyType, read[name]), null);
break;
}
}
}
}
propertyInfos[index].SetValue(entity,result,null);
}
}
}
}
}
list.Add(entity);
}
return list;
}
/// <summary>
/// 根据实体共同接口获得属性值
/// </summary>
/// <param name="entity">实体公共接口</param>
/// <param name="name">属性名称</param>
/// <returns></returns>
public object GetPropertyValue(IEntity entity, string name)
{
PropertyInfo pi = entity.GetType().GetProperty(name);
object result = null;
if (result == null)
{
result = pi.GetValue(entity,null);
}
return result;
}
/// <summary>
/// 根据泛型类型获得实体属性值
/// </summary>
/// <typeparam name="T">泛型类型</typeparam>
/// <param name="entity">实体公共接口</param>
/// <param name="name">实体属性名称</param>
/// <returns></returns>
public T GetPropertyValue<T>(IEntity entity, string name)
{
object result = GetPropertyValue(entity,name);
if (result == null)
{
return default(T);
}
else
{
return (T)result;
}
}
#endregion
#region(对象和数据一些其他操作)
/// <summary>
/// 根据公共实体接口类型设置该实体某个属性的值
/// </summary>
/// <param name="entity">公共实体接口</param>
/// <param name="name">属性名称</param>
/// <param name="value">属性的值</param>
public void SetPropertyValue(IEntity entity, string name, object value)
{
PropertyInfo pi = entity.GetType().GetProperty(name);
if (pi != null)
{
pi.SetValue(entity,value,null);
}
}
/// <summary>
/// 释放内存空间
/// </summary>
public void Dispose()
{
GC.SuppressFinalize(this);
}
/// <summary>
/// 数据库类型的转化
/// </summary>
/// <param name="type">程序中的类型</param>
/// <returns></returns>
private SqlDbType ConvertType(DataType type)
{
SqlDbType sqlType = SqlDbType.BigInt;
switch (type)
{
case DataType.Binary:
sqlType = SqlDbType.Binary;
break;
case DataType.Bit:
sqlType = SqlDbType.Bit;
break;
case DataType.Char:
sqlType = SqlDbType.Char;
break;
case DataType.Date:
sqlType = SqlDbType.Date;
break;
case DataType.DateTime:
sqlType = SqlDbType.DateTime;
break;
case DataType.Decimal:
sqlType = SqlDbType.Decimal;
break;
case DataType.Double:
sqlType = SqlDbType.Float;
break;
case DataType.Float:
sqlType = SqlDbType.Float;
break;
case DataType.GUID:
sqlType = SqlDbType.UniqueIdentifier;
break;
case DataType.Image:
sqlType = SqlDbType.Image;
break;
case DataType.Int16:
sqlType = SqlDbType.TinyInt;
break;
case DataType.Int32:
sqlType = SqlDbType.Int;
break;
case DataType.Int4:
sqlType = SqlDbType.TinyInt;
break;
case DataType.Int64:
sqlType = SqlDbType.BigInt;
break;
case DataType.Int8:
sqlType = SqlDbType.TinyInt;
break;
case DataType.Text:
sqlType = SqlDbType.NText;
break;
case DataType.UnsignedInt16:
sqlType = SqlDbType.TinyInt;
break;
case DataType.UnsignedInt32:
sqlType = SqlDbType.Int;
break;
case DataType.UnsignedInt4:
sqlType = SqlDbType.TinyInt;
break;
case DataType.UnsignedInt8:
sqlType = SqlDbType.TinyInt;
break;
case DataType.VarChar:
sqlType = SqlDbType.NVarChar;
break;
}
return sqlType;
}
/// <summary>
/// 根据数据类型转化
/// </summary>
/// <param name="type"></param>
/// <param name="value"></param>
/// <returns></returns>
private object ConvertValue(Type type, object value)
{
if (value == DBNull.Value)
return null;
return Convert.ChangeType(value, type);
}
public T ConvertValue<T>(Type type, object value)
{
object result = ConvertValue(type, value);
if (result == null)
return default(T);
else
return (T)result;
}
#endregion
}
}
方法参数再上一章都介绍了,这里不再讲解