前几天写了数据访问层的概要设计,有些朋友说讲得太概要。这次我针对两个主要接口进行详细描述IdriverType和IDataSession;这两个接口是组件的核心部份。IdriverType作为数据库类型提供者,IDataSession是数据操作的描述者。
IdriverType数据库提供者接口
这个接口的主要功能是实现组件能处理不同的数据库。在.net下面虽然提供了Oledb用于多数据数据库访问,但.Net还针对不同数据库提供操作类,主要在访问数据库时有性能上的优化,如果用Oledb就发挥不了这种优势。自己在编写数据层的情况如何让数据层能够灵活地用各自的数据库访问类来操作数据库呢?其实我们留意一下.NET的数据访问类的实现就看到.Net是提供一系列的数据访问接口方便我们实现数据库访问类的。我们只要通过这些接口操作就可以把具体访问类的实现隐藏起来,不用考虑细节上的东西;文章中所提到的IdriverType就是采用这种原理。
IDriverType其实就是相应数据操作的接口归纳起来,描述如下:
/// <summary>
/// 数据库类型提供描述接口
/// </summary>
public interface IDriverType
{
/// <summary>
/// 获取数据连接对象
/// </summary>
System.Data.IDbConnection Connection
{
get;
}
/// <summary>
/// 获取数据适配器对象
/// </summary>
System.Data.IDbDataAdapter DataAdapter
{
get;
}
/// <summary>
/// 获取操作命令对象
/// </summary>
System.Data.IDbCommand Command
{
get;
}
/// <summary>
/// 获取命令参数
/// </summary>
/// <returns></returns>
System.Data.IDataParameter GetParameter();
/// <summary>
/// 获取命令参数
/// </summary>
/// <param name="name"></param>
/// <param name="value"></param>
/// <returns></returns>
System.Data.IDataParameter GetParameter(string name,object value);
/// <summary>
/// 获取命令参数
/// </summary>
/// <param name="name"></param>
/// <param name="value"></param>
/// <param name="direction"></param>
/// <returns></returns>
System.Data.IDataParameter GetParameter(string name,object value,System.Data.ParameterDirection direction);
/// <summary>
/// 参数开头标识符
/// </summary>
string NamedPrefix { get; }
/// <summary>
/// 格式化参数名
/// </summary>
/// <param name="parametername"></param>
/// <returns></returns>
string FormatNameForParameter(string parametername);
}
以上接口只是把所有数据访问对象相应接口规则结合起来,如果了解这方面的东西应该不难理解(MSDN也有相关描述)。对于NamedPrefix这个属性是标识不同数据参数名的前缀。FormatNameForParameter方法把相应的参数名格式化对应数据库的参数名。
下面我们看下基于这个接口的SqlServer数据库提供者实现的代码:
/// <summary>
/// SqlServer数据设备提供类
/// </summary>
public class SqlDriver:IDriverType
{
/// <summary>
/// 构造SqlServer数据设备对象
/// </summary>
public SqlDriver()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
#region IDriverType 成员
/// <summary>
/// 获取数据连接对象
/// </summary>
public System.Data.IDbConnection Connection
{
get
{
// TODO: 添加 SqlDriver.Connection getter 实现
return new System.Data.SqlClient.SqlConnection();
}
}
/// <summary>
/// 获取数据填充对象
/// </summary>
public System.Data.IDbDataAdapter DataAdapter
{
get
{
// TODO: 添加 SqlDriver.DataAdapter getter 实现
return new System.Data.SqlClient.SqlDataAdapter();
}
}
/// <summary>
/// 获取数据命令处理对象
/// </summary>
public System.Data.IDbCommand Command
{
get
{
// TODO: 添加 SqlDriver.Command getter 实现
return new System.Data.SqlClient.SqlCommand();
}
}
/// <summary>
/// 获取命令参数对象
/// </summary>
/// <returns>System.Data.IDataParameter</returns>
public System.Data.IDataParameter GetParameter()
{
// TODO: 添加 SqlDriver.GetParameter 实现
return new System.Data.SqlClient.SqlParameter();
}
/// <summary>
/// 获取指定名称和值的参数对象
/// </summary>
/// <param name="name">参数名</param>
/// <param name="value">参数值</param>
/// <returns></returns>
System.Data.IDataParameter HFSoft.Data.IDriverType.GetParameter(string name, object value)
{
// TODO: 添加 SqlDriver.HFSoft.Data.IDriverType.GetParameter 实现
return new System.Data.SqlClient.SqlParameter(this.FormatNameForParameter(name),value);
}
/// <summary>
/// 获取指定名称和值的参数对象
/// </summary>
/// <param name="name">参数名</param>
/// <param name="value">参数值</param>
/// <param name="direction">参数类型</param>
/// <returns>System.Data.IDataParameter</returns>
System.Data.IDataParameter HFSoft.Data.IDriverType.GetParameter(string name, object value, System.Data.ParameterDirection direction)
{
// TODO: 添加 SqlDriver.HFSoft.Data.IDriverType.GetParameter 实现
System.Data.SqlClient.SqlParameter paremter = new System.Data.SqlClient.SqlParameter(this.FormatNameForParameter(name),value);
paremter.Direction = direction;
return paremter;
}
/// <summary>
/// 参数开头标识符
/// </summary>
public string NamedPrefix
{
get
{
return "@";
}
}
/// <summary>
/// 获取相关参数的名称
/// </summary>
/// <param name="parametername">参数名称</param>
/// <returns>string</returns>
public string FormatNameForParameter(string parametername)
{
return NamedPrefix +parametername;
}