一个系统执行一个数据操作的步骤:
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
}
}
DbConnection OpenConnection(); 打开一个数据库连接
void Open(); 当连接为关闭状态时 再次打开连接
void Close(); 关闭连接
IDataReader ExecuteReader(string sql); 执行Sql 语句返回执行结果
int ExecuteNonQuery(string sql); 执行 修改、删除、增加
ICollection
然后为接口写一个抽象类:
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
#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
}
}
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
{
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
关键词标签:数据库
相关阅读
热门文章
浅谈JSP JDBC来连接SQL Server 2005的方法
SqlServer2005对现有数据进行分区具体步骤
sql server系统表损坏的解决方法
MS-SQL2005服务器登录名、角色、数据库用户、角色、架构的关系
人气排行 配置和注册ODBC数据源-odbc数据源配置教程 如何远程备份(还原)SQL2000数据库 SQL2000数据库远程导入(导出)数据 SQL2000和SQL2005数据库服务端口查看或修改 修改Sql Server唯一约束教程 SQL Server 2005降级到2000的正确操作步骤 sql server系统表损坏的解决方法 浅谈JSP JDBC来连接SQL Server 2005的方法
查看所有0条评论>>