自己动手写ORM框架(二):AdoHelper支持多数据库操作的封装(2)(二)

2014-11-24 11:47:20 · 作者: · 浏览: 32
====
public static int ExecuteNonQuery(IDbTransaction trans, CommandType cmdType, string cmdText)
{
IDbCommand cmd = DbFactory.CreateDbCommand();
PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, null);
int val = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return val;
}
//=============================================================================================
上面都是对ExecuteNonQuery方法的重载,仅仅是参数有所变化,下面将第一个方法进行逐行的分析。
line 1:public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params IDbDataParameter[] commandParameters)
参数1: string connectionString => 数据库连接所需连接字符串
参数2: CommandType cmdType=> 执行命令的类型(存储过程或T-SQL,等等)
参数3: string cmdText=> 存储过程名称或者T-SQL命令行
参数4: params IDbDataParameter[] commandParameters=>执行命令所需的参数数组
line 2:IDbCommand cmd = DbFactory.CreateDbCommand();
这里通过DbFactory类创建IDbCommand接口的实现类对象,这里为什么使用IDbCommand接口呢,如果我们项目中使用的SqlServer数据库的时候,我们习惯这样创建:
SqlCommand cmd = new SqlCommand();
但是如果这个项目上线了一阵,客户突然说要换成Oracle数据库,那么所有写成SqlCommand的地方都要改成OracleCommand,但要改的并不仅仅这些,计划所有ADO.NET与数据库相关的,比如SqlConnection、SqlDataAdapter、SqlParameter、SqlTransaction等等全部都要改,这工作量是很大的,还不说改动这么多会出现什么问题,所以我们可以通过工厂模式,采用面向接口 编程来解决这个问题!
下面我们看看DbFactory是如何工作的,代码块1-2:
//
// 根据配置文件中所配置的 数据库类型
// 来创建相应数据库命令对象
//
//
public static IDbCommand CreateDbCommand()
{
IDbCommand cmd = null;
switch (AdoHelper.DbType)
{
case DatabaseType.SQLSERVER:
cmd = new SqlCommand();
break;
case DatabaseType.ORACLE:
cmd = new OracleCommand();
break;
case DatabaseType.ACCESS:
cmd = new OleDbCommand();
break;
default:
throw new Exception("数据库类型目前不支持!");
}
return cmd;
}
这是DbFactory类中的静态方法CreateDbCommand(),根据AdoHelper类中获取到配置文件配置的数据库类型DbType,来创建对应数据库类型的Command对象,通过反编译System.Data.dll,我们可以知道SqlCommand、OracleCommand、OleDbCommand等等Command都实现了IDbCommand接口,这样我们将创建好的对象以IDbCommand接口类型返回即可。
line 3:using (IDbConnection conn = DbFactory.CreateDbConnection(connectionString))
根据数据库连接字符串connectionString,通过DbFactory.CreateDbConnection方法创建数据库连接对象,这里同样使用到了接口IDbConnection ,好处多多就不在此罗嗦了。
line 4:PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
这里是将所有cmd对象所需的参数都传入PrepareCommand方法中,将参数给cmd对象,为执行数据操作做好准备工作,具体实现看代码块1-3:
//
// 为即将执行准备一个命令
//
// SqlCommand对象
// SqlConnection对象
// IDbTransaction对象
// 执行命令的类型(存储过程或T-SQL,等等)
// 存储过程名称或者T-SQL命令行, e.g. Select * from Products
// SqlParameters to use in the command
private static void PrepareCommand(IDbCommand cmd, IDbConnection conn, IDbTransaction trans, CommandType cmdType, string cmdText, IDbDataParameter[] cmdParms)
{
if (conn.State != ConnectionState.Open)
conn.Open();
cmd.Connection = conn;
cmd.CommandText = cmdText;
if (trans != null)
cmd.Transaction = trans;
cmd.CommandType = cmdType;
if (cmdParms != null)
{
foreach (IDbDataParameter parm in cmdParms)
cmd.Parameters.Add(parm