分类分类
2015-06-28 00:00作者:网管联盟
一个系统执行一个数据操作的步骤:
1.连接数据库。
2.构建Sql 语句。
3.执行语句。
4.返回 执行结果。
注:
一个系统可能有 N 个操作 ,然后另一个系统也要执行数据访问操作,那么我们可以不可以把连接数据、库执行语句、返回结果
写成一个公共的东西呢? 答案是一定的。例如:NHibernate 我们只要引用它的类库、配置数据库连接语句和Mapping 文件 就可以
进行操作了。那我今天说的是 不用写配置文件 的一个 公用数据库操作类库。暂时只实现查询
首先我们编写一个接口:
IDataProvider
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.Common;
using System.Data;
namespace CustomDataOperate.Data.DataProviders
{
public interface IDataProvider
{
DbConnection OpenConnection();
void Open();
void Close();
IDataReader ExecuteReader(string sql);
int ExecuteNonQuery(string sql);
ICollection<TEntity> ExcuteReader<TEntity>(string sql) where TEntity : class;
}
}
DbConnection OpenConnection(); 打开一个数据库连接
void Open(); 当连接为关闭状态时 再次打开连接
void Close(); 关闭连接
IDataReader ExecuteReader(string sql); 执行Sql 语句返回执行结果
int ExecuteNonQuery(string sql); 执行 修改、删除、增加
ICollection<TEntity> ExcuteReader<TEntity>(string sql) where TEntity : class; 执行查询返回对象集合
然后为接口写一个抽象类:
DataProviderBase
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.Common;
using CustomDataOperate.Data.Translates;
using System.Data;
namespace CustomDataOperate.Data.DataProviders
{
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
}
在 DataProviderBase 中出现了 Translate 属性 他是什么呢 ? 他是一个 (IEntityTranslate) 转换器
将IDataReader 转换为Entity
代码如下:
IEntityTranslate
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
namespace CustomDataOperate.Data.Translates
{
public interface IEntityTranslate
{
TEntity Translate<TEntity>(IDataReader reader) where TEntity : class;
}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MD = CustomDataOperate.Data.Attributes;
using System.Reflection;
namespace CustomDataOperate.Data.Translates
{
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;
}
}
}
为什么转换器中会出现 DataColumn 是 System.Data 命名空间下的吗? 不是 这是一个自定义的 Attirbute
DataColumn
using System;
using System.Collections.Generic;
using System.Text;
namespace CustomDataOperate.Data.Attributes
{
public class DataColumn : System.Attribute
{
public DataColumn()
{
}
public DataColumn(string columnName)
{
ColumnName = columnName;
}
public string ColumnName
{
get;
set;
}
}
}
注释:
ColumnName :将数据库的Filed 和 Entity Property 对应。
到这里还要做什么呢? 对了还缺少实现,那么我们开始实现这个 Provider
SqlDataProvider
using System;
using System.Collections.Generic;
using System.Text;
using CustomDataOperate.Data.DataProviders;
using System.Da
相关文章