
1.根据查询结果构建实体类公共接口
public interface IEntityTranslate
{
/// 用class关键字表示约束为引用类型
/// 用struct关键字表示约束为值类型
TEntity Translate<TEntity>(IDataReader reader) where TEntity : class;
}
2.根据查询结果实体类的实现
public class EntityTranslate : IEntityTranslate
{
public TEntity Translate<TEntity>(IDataReader reader) where TEntity : class //执行查询返回对象集合
{
Type entityType = typeof(TEntity);
object entity = Activator.CreateInstance(entityType);
foreach (PropertyInfo info in entityType.GetProperties())
{
string columnName = string.Empty;
object[] attributes = info.GetCustomAttributes(true);
foreach (object attribute in attributes)
{
if (attribute is MD.DataColumn)
{
columnName = (attribute as MD.DataColumn).ColumnName;
int filedIndex = 0;
while (filedIndex < reader.FieldCount)
{
if (reader.GetName(filedIndex) == columnName)
{
info.SetValue(entity, reader.GetValue(filedIndex), null);
break;
}
filedIndex++;
}
break;
}
}
}
return entity as TEntity;
}
}
3.自定义属性继承了属性类Attribute
public class DataColumn : System.Attribute
{
public DataColumn()
{
}
public DataColumn(string columnName)
{
ColumnName = columnName;
}
public string ColumnName
{
get;
set;
}
}
4.数据访问接口IDataProvider
public interface IDataProvider
{
DbConnection OpenConnection(); //打开一个数据库连接
void Open(); //当连接为关闭状态时 再次打开连接
void Close(); //关闭连接
IDataReader ExecuteReader(string sql);// 执行Sql 语句返回执行结果
int ExecuteNonQuery(string sql); //执行 修改、删除、增加
ICollection<TEntity> ExcuteReader<TEntity>(string sql) where TEntity : class; //执行查询返回对象集合
}
5. 数据访问基础类的实现
public abstract class DataProviderBase : IDataProvider
{
protected DbConnection _Connection;
protected DbCommand _Command;
protected IEntityTranslate _Translate;
#region IDataProvider Members
public abstract DbConnection OpenConnection();
public virtual void Close()
{
_Connection.Close();
}
public virtual void Open()
{
_Connection.Open();
}
protected virtual DbCommand Command
{
get { return _Command; }
set { _Command = value; }
}
protected IEntityTranslate Translate
{
get
{
if (_Translate == null)
{
_Translate = new EntityTranslate();
}
return _Translate;
}
}
public abstract IDataReader ExecuteReader(string sql);
public abstract int ExecuteNonQuery(string sql);
public abstract ICollection<TEntity> ExcuteReader<TEntity>(string sql) where TEntity : class;
#endregion
}
6.数据访问类的实现
public class SqlDataProvider : DataProviderBase
{
private void BuilderCommand(string sql)
{
Command.CommandText = sql;
Command.Connection = OpenConnection();
}
public override System.Data.Common.DbConnection OpenConnection()
{
if (_Connection == null)
{
_Connection = BuilderSqlConnection();
}
if (_Connection.State != System.Data.ConnectionState.Open)
{
Open();
}
return _Connection;
}
private System.Data.Common.DbConnection BuilderSqlConnection()
{
try
{
string connectionString = ConfigurationManager.ConnectionStrings["DataBaseConnectionString"].ConnectionString;
return new SqlConnection(connectionString);
}
catch (Exception ex)
{
throw new Exception("数据库连接失败! 失败原因:" + ex);
}
}
protected override System.Data.Common.DbCommand Command
{
get
{
if (base.Command == null)
{
base.Command = new SqlCommand();
}
return base.Command;
}
set
{
base.Command = value;
}
}
public override IDataReader ExecuteReader(string sql)
{
BuilderCommand(sql);
return Command.ExecuteReader();
}
public override int ExecuteNonQuery(string sql)
{
BuilderCommand(sql);
return Command.ExecuteNonQuery();
}
public override ICollection<TEntity> ExcuteReader<TEntity>(string sql)
{
ICollection<TEntity> datas = new List<TEntity>();
BuilderCommand(sql);
using (IDataReader reader = Command.ExecuteReader())
{
while (reader.Read())
{
datas.Add(Translate.Translate<TEntity>(reader));
}
}
return datas;
}
}
public interface IEntityTranslate
{
/// 用class关键字表示约束为引用类型
/// 用struct关键字表示约束为值类型
TEntity Translate<TEntity>(IDataReader reader) where TEntity : class;
}
2.根据查询结果实体类的实现
public class EntityTranslate : IEntityTranslate
{
public TEntity Translate<TEntity>(IDataReader reader) where TEntity : class //执行查询返回对象集合
{
Type entityType = typeof(TEntity);
object entity = Activator.CreateInstance(entityType);
foreach (PropertyInfo info in entityType.GetProperties())
{
string columnName = string.Empty;
object[] attributes = info.GetCustomAttributes(true);
foreach (object attribute in attributes)
{
if (attribute is MD.DataColumn)
{
columnName = (attribute as MD.DataColumn).ColumnName;
int filedIndex = 0;
while (filedIndex < reader.FieldCount)
{
if (reader.GetName(filedIndex) == columnName)
{
info.SetValue(entity, reader.GetValue(filedIndex), null);
break;
}
filedIndex++;
}
break;
}
}
}
return entity as TEntity;
}
}
3.自定义属性继承了属性类Attribute
public class DataColumn : System.Attribute
{
public DataColumn()
{
}
public DataColumn(string columnName)
{
ColumnName = columnName;
}
public string ColumnName
{
get;
set;
}
}
4.数据访问接口IDataProvider
public interface IDataProvider
{
DbConnection OpenConnection(); //打开一个数据库连接
void Open(); //当连接为关闭状态时 再次打开连接
void Close(); //关闭连接
IDataReader ExecuteReader(string sql);// 执行Sql 语句返回执行结果
int ExecuteNonQuery(string sql); //执行 修改、删除、增加
ICollection<TEntity> ExcuteReader<TEntity>(string sql) where TEntity : class; //执行查询返回对象集合
}
5. 数据访问基础类的实现
public abstract class DataProviderBase : IDataProvider
{
protected DbConnection _Connection;
protected DbCommand _Command;
protected IEntityTranslate _Translate;
#region IDataProvider Members
public abstract DbConnection OpenConnection();
public virtual void Close()
{
_Connection.Close();
}
public virtual void Open()
{
_Connection.Open();
}
protected virtual DbCommand Command
{
get { return _Command; }
set { _Command = value; }
}
protected IEntityTranslate Translate
{
get
{
if (_Translate == null)
{
_Translate = new EntityTranslate();
}
return _Translate;
}
}
public abstract IDataReader ExecuteReader(string sql);
public abstract int ExecuteNonQuery(string sql);
public abstract ICollection<TEntity> ExcuteReader<TEntity>(string sql) where TEntity : class;
#endregion
}
6.数据访问类的实现
public class SqlDataProvider : DataProviderBase
{
private void BuilderCommand(string sql)
{
Command.CommandText = sql;
Command.Connection = OpenConnection();
}
public override System.Data.Common.DbConnection OpenConnection()
{
if (_Connection == null)
{
_Connection = BuilderSqlConnection();
}
if (_Connection.State != System.Data.ConnectionState.Open)
{
Open();
}
return _Connection;
}
private System.Data.Common.DbConnection BuilderSqlConnection()
{
try
{
string connectionString = ConfigurationManager.ConnectionStrings["DataBaseConnectionString"].ConnectionString;
return new SqlConnection(connectionString);
}
catch (Exception ex)
{
throw new Exception("数据库连接失败! 失败原因:" + ex);
}
}
protected override System.Data.Common.DbCommand Command
{
get
{
if (base.Command == null)
{
base.Command = new SqlCommand();
}
return base.Command;
}
set
{
base.Command = value;
}
}
public override IDataReader ExecuteReader(string sql)
{
BuilderCommand(sql);
return Command.ExecuteReader();
}
public override int ExecuteNonQuery(string sql)
{
BuilderCommand(sql);
return Command.ExecuteNonQuery();
}
public override ICollection<TEntity> ExcuteReader<TEntity>(string sql)
{
ICollection<TEntity> datas = new List<TEntity>();
BuilderCommand(sql);
using (IDataReader reader = Command.ExecuteReader())
{
while (reader.Read())
{
datas.Add(Translate.Translate<TEntity>(reader));
}
}
return datas;
}
}