好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

简化ADO.NET数据访问的类库(类似MSDataAccessApplicationBl

Execute 类 概述 Execute 类中实现了 IExecute 接口与 IExecuteEx 接口。对数据库进行简单操作时,通过 IExecute 接口调用 Execute 类中的功能;进行较复杂的操作时,需通过 IExecuteEx 接口调用 Execute 类中的功能。 实例化 Execute 类有 3 个重载的构造函

Execute 类

概述

Execute 类中实现了 IExecute 接口与 IExecuteEx 接口。对数据库进行简单操作时,通过 IExecute 接口调用 Execute 类中的功能;进行较复杂的操作时,需通过 IExecuteEx 接口调用 Execute 类中的功能。

实例化

Execute 类有 3 个重载的构造函数,分别为:

Execute(dbType:DatabaseType)

Execute(connectionString:string, sql:string, dbType:DatabaseType)

Execute(connectionString:string, sql:string, dbType:DatabaseType, showError:IShowError)

其中参数意义如下:

dbType: 数据库类型,枚举类型 DatabaseType 的值之一;

connectionString: 连接字符串;

sql: SQL 语句;

showError: 错误显示对象,为 IShowError 接口类型。

说明:

在 Execute 类的实例化时,除了数据库类型必须指定之外,其它参数都可以在实例化以后,通过对相应的属性赋值进行指定或重新指定。

IExecute 接口

概述

IExecute 接口设计用来执行简单的数据库操作,通过它可以执行无返回的数据库操作如向数据库插入、更新、删除记录的操作,也可执行有返回数据库操作,返回的数据集放在 DataSet 对象中;它不支持执行存储过程,也不支持通过改变 DataSet 中的数据,间接地修改数据库;它对数据库的操作都是离线操作,即使用它的方法时自动完成连接-执行-断开的过程,因此它不支持 DataReader 式的在线数据库读取操作。

实例化

IExecute 接口的实例化需通过 Execute 类的实例化完成。参看 Execute 类的实例化说明。

例如:

Tao.Data.DataExecute.IExecute execute=new Tao.Data.DataExecute.Execute(Tao.Data.DataConfig.DatabaseType.OleDb);

属性

IExecute 接口有如下属性:

ConnectionString:string 只写属性,用来指定连接字符串

SQL:string 只写属性,用来指定 SQL 语句

CommandParameters:ITaoParameters 只读属性,用来给 SQL 语句中的参数赋值

ShowError:IShowError 只写属性,用来指定显示错误对象

属性的主要作用是指定数据库操作逻辑。

数据库操作逻辑的指定

在实例化时就可以指定数据库操作逻辑,也可以不在实例化时指定,而在实例化之后,通过对 ConnectionString, SQL 属性赋值进行指定。例如:

1. 在实例化之后对属性赋值指定参数

// 准备参数

string constr=@"Provider=Microsoft.Jet.OLEDB.4.0;data source=c:/esec.mdb";

string sql="insert into person(name) values(@name)";

IShowError showerror=new Tao.Data.DataExecute.Windows.ShowWindowsError();

// 实例化

Tao.Data.DataExecute.IExecute execute=new Tao.Data.DataExecute.Execute(Tao.Data.DataConfig.DatabaseType.OleDb);

// 给属性赋值指定参数

execute.ConnectionString=constr;

execute.SQL=sql;

execute.ShowError=showerror;

2. 在实例化时指定所有参数

// 实例化

Tao.Data.DataExecute.IExecute execute=new Tao.Data.DataExecute.Execute(constr, sql, Tao.Data.DataConfig.DatabaseType.OleDb, showerror);

使用带参数的 SQL 语句

当赋入的 SQL 语句带有参数时,需通过 CommandParameters 属性对参数赋值。例如:

string constr=@"Provider=Microsoft.Jet.OLEDB.4.0;data source=c:/esec.mdb";

string sql=" insert into person(name) values(@name)";

Tao.Data.DataExecute.IExecute execute=new Tao.Data.DataExecute.Execute(Tao.Data.DataConfig.DatabaseType.OleDb);

execute.ConnectionString=constr;

execute.SQL=sql;

execute.CommandParameters.Add("@name","aa")

if(execute.ExecuteNonQuery())MessageBox.Show("OK");

数据库操作逻辑的更新

当使用 IExecute 接口执行了数据库操作之后,可以无须重新实例化执行对象,只需为其指定新的数据库逻辑,如赋入新的连接字符串或 SQL 语句,执行对象将自动应用的数据库逻辑。例如:

// 最初的数据库逻辑

string constr=@"Provider=Microsoft.Jet.OLEDB.4.0;data source=c:/esec.mdb";

string sql=" insert into person(name) values('aa')";

Tao.Data.DataExecute.IExecute execute=new Tao.Data.DataExecute.Execute(Tao.Data.DataConfig.DatabaseType.OleDb);

execute.ConnectionString=constr;

execute.SQL=sql;

if(execute.ExecuteNonQuery())MessageBox.Show("OK");

// 改变数据操作逻辑

execute.SQL="delete from person where name='aa'";

if(execute.ExecuteNonQuery())MessageBox.Show("OK");

方法

IExecute 接口有如下方法:

ExecuteNonQuery: bool 执行无返回的数据库操作

ExecuteDataSet: DataSet 2 次重载,执行有返回的数据库操作,返回的数据集在 DataSet 对象中

ExecuteNonQuery 方法

ExecuteNonQuery(): bool

参数:

无参数。

返回值:

bool 类型,当操作成功时返回 true ,操作失败时返回 false 。

依赖:

使用前须指定数据库操作逻辑。

说明:

用来执行无返回的数据库操作。例如:

string constr=@"Provider=Microsoft.Jet.OLEDB.4.0;data source=c:/esec.mdb";

string sql=" insert into person(name) values('aa')";

Tao.Data.DataExecute.IExecute execute=new Tao.Data.DataExecute.Execute(Tao.Data.DataConfig.DatabaseType.OleDb);

execute.ConnectionString=constr;

execute.SQL=sql;

if(execute.ExecuteNonQuery())MessageBox.Show("OK");

ExecuteDataSet 方法

2 次重载

ExecuteDataSet():DataSet

ExecuteDataSet(startRecord:int, maxRecords:int, srcTable:string) : DataSet

参数:

startRecord:int 从其开始的从零开始的记录号

maxRecords:int 要检索的最大记录数

srcTable:string 用于表映射的源表的名称

返回值:

DataSet 类型,用来存放取得的数据集。

依赖:

使用前须指定数据库操作逻辑。

说明:

用来执行有返回的数据库操作。例如:

string constr=@"Provider=Microsoft.Jet.OLEDB.4.0;data source=c:/esec.mdb";

sql="select * from person";

Tao.Data.DataExecute.IExecute execute=new Tao.Data.DataExecute.Execute(constr,sql,Tao.Data.DataConfig.DatabaseType.OleDb);

DataSet ds=execute.ExecuteDataSet();

this.dataGrid1.DataSource=ds.Tables[0];

DataSet ds=execute.ExecuteDataSet(0,5,"person");

this.dataGrid1.DataSource=ds.Tables["person"];

IExecuteEx 接口

概述

IExecuteEx 接口设计用来执行较复杂的数据库操作。它的使用类似于 .NET 框架中基本数据库类的使用,即分别使用 Command, DataAdapter, DataReader 等对象。它可以执行无返回的数据库操作如向数据库插入、更新、删除记录的操作,也可执行有返回的数据库操作;它支持执行存储过程,也支持通过改变 DataSet 中的数据,间接地修改数据库,它还支持 DataReader 的在线数据库读取操作。

实例化

IExecuteEx 接口的实例化需通过 Execute 类的实例化完成。参看 Execute 类的实例化说明。

例如:

Tao.Data.DataExecute.IExecuteEx execute=new Tao.Data.DataExecute.Execute(Tao.Data.DataConfig.DatabaseType.OleDb);

属性

IExecuteEx 接口有如下属性:

ConnectionString:string 只写属性,用来指定连接字符串

SQL:string 只写属性,用来指定 SQL 语句

ShowError:IShowError 只写属性,用来指定显示错误对象

Command:ITaoCommand 只读属性,表示要对数据源执行的 SQL 语句或存储过程

CommandBuilder:ITaoCommandBuilder 只读属性,自动生成用于协调 DataSet 的更改与关联数据库的单表命令

DataAdapter:ITaoDataAdapter 只读属性,表示一组数据命令和一个数据库连接,它们用于填充 DataSet 和更新数据源

DataReader:ITaoDataReader 只读属性,提供从数据源读取数据行的只进流的方法

以上属性可以分成两类,一类是指定数据库操作逻辑的属性,即 ConnectionString 和 SQL ;另一类是执行数据库操作的属性,即 Command, CommandBuilder, DataAdapter 和 DataReader 。

数据库操作逻辑的指定

通过 ConnectionString, SQL 属性指定数据库操作逻辑,参看 IExecute 接口的数据库操作逻辑的指定。

通过 Command 属性指定 SQL 语句,参看 Command 属性。

Command 属性

只读属性。 ITaoCommand 类型。通过它可以指定 SQL 语句,使用带参数的 SQL 语句,使用存储过程,执行无返回的数据库操作和简单的有返回的数据库操作。

1. 指定 SQL 语句

例如:

string constr=@"Provider=Microsoft.Jet.OLEDB.4.0;data source=c:/esec.mdb";

sql="insert into person(name) values('aa')";

Tao.Data.DataExecute.IExecuteEx executeex=new Tao.Data.DataExecute.Execute(Tao.Data.DataConfig.DatabaseType.OleDb);

executeex.ConnectionString=constr;

executeex.Command.CommandText=sql;

int n=executeex.Command.ExecuteNonQuery();

MessageBox.Show("changed lines is: "+n.ToString());

2. 使用带参数的 SQL 语句

例如:

string constr=@"Provider=Microsoft.Jet.OLEDB.4.0;data source=c:/esec.mdb";

sql="insert into person(name) values(@name)";

Tao.Data.DataExecute.IExecuteEx executeex=new Tao.Data.DataExecute.Execute(Tao.Data.DataConfig.DatabaseType.OleDb);

executeex.ConnectionString=constr;

executeex.Command.CommandText=sql; // 或使用 executeex.SQL= sql;

executeex.Command.Parameters.Add("@name","aa");

int n=executeex.Command.ExecuteNonQuery();

MessageBox.Show("changed lines is: "+n.ToString());

3. 清除参数

ITaoParameters 下有一个 Clear 方法,用来清除已赋给 Command 的 Parameters 属性所有参数。

例如:

sql="select name from person where name=@name";

Tao.Data.DataExecute.IExecuteEx executeex=new Tao.Data.DataExecute.Execute(Tao.Data.DataConfig.DatabaseType.OleDb);

executeex.ConnectionString=constr;

executeex.Command.CommandText=sql;

executeex.Command.Parameters.Add("@name","aaaa");

executeex.Command.Parameters.Clear();

executeex.Command.Parameters.Add("@name","bbbb");

string msg="";

while(executeex.DataReader.Read())

msg+=executeex.DataReader.GetString(0)+"/r/n";

executeex.DataReader.Close();

this.textBox1.Text=msg;

上面代码运行后, msg 中的值为 "bbbb" ,如果删去 executeex.Command.Parameters.Clear(); 一句,运行结果则为 "aaaa" 。

4. 使用存储过程

例如:

数据库中有此存储过程,

ALTER PROCEDURE sp_Orders_ByEmployeeId

(

@EmployeeID int

)

AS

SELECT OrderId,OrderDate

FROM Orders

WHERE EmployeeId=@EmployeeID

RETURN

代码如下,

using System.Data

//...

constr="Data Source=Shark;Integrated Security=true;database=Northwind";

Tao.Data.DataExecute.IExecuteEx executeex=new Tao.Data.DataExecute.Execute(Tao.Data.DataConfig.DatabaseType.Sql);

executeex.ConnectionString=constr;

executeex.Command.CommandType=CommandType.StoredProcedure;

executeex.Command.CommandText="sp_Orders_ByEmployeeId"; //executeex.SQL="sp_Orders_ByEmployeeId";

executeex.Command.Parameters.Add("@EmployeeID",(int)SqlDbType.Int).Value=2;

DataSet ds=new DataSet();

executeex.DataAdapter.Fill(ds);

this.dataGrid1.DataSource=ds.Tables[0];

executeex.Command.CommandType=CommandType.Text;// 恢复为默认值

5. 使用 CommandBehavior 属性

System.Data 中的 CommandBehavior 枚举,提供对查询结果和查询对数据库的影响的说明。这个枚举值被用于 IDbCommand.ExecuteReader 方法的参数。在这里被设计成 ITaoCommand 接口的属性。具体使用参看 DataReader 属性。

CommandBuilder 属性

只读属性。 ITaoCommandBuilder 类型。调用其下的 BuildCommand 方法自动生成用于协调 DataSet 的更改与关联数据库的单表命令。

具体使用参看 DataAdapter 属性。

DataAdapter 属性

只读属性。 ITaoDataAdapter 类型。通过它可以执行有返回数据库操作,并支持通过修改 DataSet 间接修改数据库的方法,即 Update 方法。

依赖:

a) 使用前需先指定数据库操作逻辑(通过 ConnectionString, SQL 属性指定或通过 Command 属性指定 SQL 语句)。

b) 使用 Update 方法时,在对 DataSet 进行修改之前需调用 CommandBuilder.BuildCommand 方法,且 DataSet 中必须包含主键。

1. 执行有返回的数据库操作

string constr=@"Provider=Microsoft.Jet.OLEDB.4.0;data source=c:/esec.mdb";

sql="select * from person";

Tao.Data.DataExecute.IExecuteEx executeex=new Tao.Data.DataExecute.Execute(Tao.Data.DataConfig.DatabaseType.OleDb);

executeex.ConnectionString=constr;

executeex.SQL=sql;

DataSet ds=new DataSet();

executeex.DataAdapter.Fill(ds);

this.dataGrid1.DataSource=ds.Tables[0];

// 或

executeex.DataAdapter.Fill(ds,0,5,"person");

this.dataGrid1.DataSource=ds.Tables["person"];

2. 通过修改 DataSet 间接修改数据库的方法,即 Update 方法

constr="Data Source=Shark;Integrated Security=true;database=Northwind";

sql="select * From Employees";

Tao.Data.DataExecute.IExecuteEx executeex=new Tao.Data.DataExecute.Execute(Tao.Data.DataConfig.DatabaseType.Sql);

executeex.ConnectionString=constr;

executeex.SQL=sql;

// 获取包含主键的数据集

DataSet ds=new DataSet();

executeex.DataAdapter.Fill(ds);

// 改变数据集之前须调用 ICommandBuilder.BuildCommand 方法

executeex.CommandBuilder.BuildCommand();

// 更改 DataSet 中的数据(例如插入一条记录)

DataTable dt=ds.Tables[0];

DataRow newRow=dt.NewRow();

newRow["FirstName"]="Allen";

newRow["LastName"]="Tao";

newRow["TitleOfCourtesy"]="Mr.";

newRow["City"]=" Beijing ";

newRow["Country"]=" China ";

dt.Rows.Add(newRow);

// 更新数据库

executeex.DataAdapter.Update(ds);

DataReader 属性

只读属性。 ITaoDataReader 类型。通过它执行在线的数据库操作。

依赖:

a) 使用前需先指定数据库操作逻辑(通过 ConnectionString, SQL 属性指定或通过 Command 属性指定 SQL 语句)。

b) 当通过 DataReader 属性调用其下的属性或方法执行完操作后,必须调用其 Close 方法关闭数据库连接。

1. 执行在线的数据库操作

string constr=@"Provider=Microsoft.Jet.OLEDB.4.0;data source=c:/esec.mdb";

sql="select name from person";

Tao.Data.DataExecute.IExecuteEx executeex=new Tao.Data.DataExecute.Execute(Tao.Data.DataConfig.DatabaseType.OleDb);

executeex.ConnectionString=constr;

executeex.SQL=sql;

string msg="";

while(executeex.DataReader.Read())

msg+=executeex.DataReader.GetString(0)+"/r/n";

executeex.DataReader.Close();

this.textBox1.Text=msg;

2. 使用 Command.CommandBehavior 属性

System.Data 中的 CommandBehavior 枚举,提供对查询结果和查询对数据库的影响的说明。这个枚举值被用于 IDbCommand.ExecuteReader 方法的参数。这里被设计成 ITaoCommand 的属性。

string constr=@"Provider=Microsoft.Jet.OLEDB.4.0;data source=c:/esec.mdb";

sql="select name from person";

Tao.Data.DataExecute.IExecuteEx executeex=new Tao.Data.DataExecute.Execute(Tao.Data.DataConfig.DatabaseType.OleDb);

executeex.ConnectionString=constr;

executeex.Command.CommandText=sql;

executeex.Command.CommandBehavior=CommandBehavior.SingleRow;

string msg="";

while(executeex.DataReader.Read())

msg+=executeex.DataReader.GetString(0)+"/r/n";

executeex.DataReader.Close();

executeex.Command.CommandBehavior= CommandBehavior.Default;// 恢复为默认值

this.textBox1.Text=msg;

上面的代码中,指定 executeex.Command.CommandBehavior 为 CommandBehavior.SingleRow 枚举值,表明 DataReader 在操作时只要取一条记录,尽管 SQL 语句指定的可能是多条记录。

数据库类型的转换

在使用 Execute 类时,必须在实例化时指定数据库类型。在设计时,已尽量隐藏了数据库操作时对不同数据库类型所使用的类的区别,所用的主要措施是将数据库类型的差异由 DatabaseType 枚举值来体现。这样做的目的是使开发人员能集中精力在数据库操作逻辑与数据库功能上,而不必把精力花在该用哪个数据库类上。

在使用 Execute 类中唯一无法隐藏数据库类型差异的地方是 ITaoParameters 的 Add 方法的 dbType 参数,虽然它的类型是 int ,但在赋值要根据所用的数据库做一些变化。如用的是 Access 数据库时,这个参数赋值时就要用 (int)OleDbType.XXX ,而用的是 SQL Server 时,赋值时就要用 (int)SqlDbType.XXX 。为此要分别 using 的命名空间是 System.Data.OleDb 和 System.Data 。

当程序开发完成后,要改变所用的数据库类型时,只要改变上面提到的两个地方,即:

a) Execute 类实例化时指定的 DatabaseType 枚举值;

b) ITaoParameters 的 Add 方法的 dbType 参数。

与 MS Data Access Block 的比较

最近我看了下面两篇文章:

l Microsoft Application Blocks for .NET Data Access Application Block 概述, http://HdhCmsTestmicrosoft测试数据/china/msdn/archives/library/dnbda/html/daab-rm.asp

l Data Access in .NET Architecture Guide , http://msdn.microsoft测试数据/library/en-us/dnbda/html/daag.asp

并对 Tao.Data 与 MS Data Access Application Block(DAAB) 进行了比较。

区别:

1. DAAB 只适用于 SQL Server .NET Data Provider ,要用于其它数据库时必须另外开发一套版本。 Tao.Data 中使用 DatabaseType 枚举值作为构造函数的参数,目前可以支持 Sql Provider 与 OleDB Provider ,也可以很方便地扩展兼容其它的 Provider 。这样内嵌支持不同数据库类型,在数据库类型改变时对代码所做的改动会比较小。

2. DAAB 中的 SqlHelper 类中提供的公开方法全是静态的,所以各个数据库操作对象之间不能有联系。 Tao.Data 中没有提供类似的静态方法,所以需要先实例化再使用,但各个数据库操作对象被组织成一个整体,方便进行统一的管理,比如连接字符串无需多次使用, Command 可以多次使用等。

3. DAAB 中可以选择输入 Connection 或 ConnectionString ,而 Tao.Data 中只能输入 ConnectionString 。这样做的目的是完全隐藏 Connection 对象,在内部负责 Open 与 Close 操作,避免用户出现只开不关的错误。唯一的例外是 IExecute 的 DataReader 属性,必须在使用完之后调用 Close 方法同时关闭 DataReader 与 Connection ,因为 DataReader 不能在断开连接的情况下进行操作。

4. DAAB 中的 SqlHelper 类中各个方法需要 SqlParameter 数据组作为参数,并且提供了生成这样的数组的 SqlHelprParameterCache 类, Tao.Data 中没有这样的功能,而是直接使用 ADO.NET 本身添加参数的方式。

相同点:

1. 都是对 ADO.NET 类的数据访问逻辑进行抽象,把几种固定的使用模式提取成方法以供调用。

2. 都从 Command 中抽取了 ExecuteNonQuery ,并提供了 ExecuteDataSet 方法作为顶级方法。

与 GotDotNet.DAAB 3.1 的比较

http://HdhCmsTestgotdotnet测试数据/workspaces/releases/viewuploads.aspx?id=c20d12b0-af52-402b-9b 7c -aaeb21d 1f 431

1. DAAB 中没有把底层各个数据库之间的区别完全封装起来,用户是需要使用哪种对应数据库具体类的。 Tao.Data 中没有对外暴露这种类,而是根据枚举值进行内部转换。

2. DAAB 的目的是 encapsulate Microsoft's recommended best practices for data access in .NET applications, as described in the Microsoft Data Access Architecture Guide ,因此它提供了比较高级的数据访问方式,比较完备; Tao.Data 的 IExecute 接口中提供有类似于 DAAB 的 ExecuteNonQuery 与 ExecuteDataSet 方法,而在 IExecuteEx 中提供与 ADO.NET 中比较类似的访问方式。

3. DAAB 中提供的方法比较完整,比如有对 Transaction 与 XMLReader 的支持等; Tao.Data 中还没有。

4. DAAB 中对 Data Provider 之间的区别,比如 SQL 语句上的区别, SQL Server 与 Oracle 在参数表示上的区别(一个为 @ 开头,一个为 : 开头),进行了兼顾; Tao.Data 中没有考虑到这一点。

查看更多关于简化ADO.NET数据访问的类库(类似MSDataAccessApplicationBl的详细内容...

  阅读:42次