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
}
}
方法参数再上一章都介绍了,这里不再讲解