Data Access Application Block QuickStart 的详细使用过程

首先是建立数据库。这是我的sql脚本。

use master

go

create database DataAccessTest

go

use DataAccessTest

go

create table [Students] -- 学生
(
    
[SerialNumber] int identity(1,1primary key-- 唯一标识
    [SID] nvarchar(50), -- 学号
    [SName] nvarchar(50) , -- 姓名
    [SClass] nvarchar(50-- 班级
)

go

insert into [Students]([SID][SName][SClass]values ('06130001''Jim Carry''CET Band 4')
insert into [Students]([SID][SName][SClass]values ('06130002''龌龊男''CET Band 4')
insert into [Students]([SID][SName][SClass]values ('06130003''dudu''CET Band 4')
insert into [Students]([SID][SName][SClass]values ('06130004''猥琐男''CET Band 6')
insert into [Students]([SID][SName][SClass]values ('06130005''章朝阳''CET Band 6')

go

create procedure [GetStudentsByClass]
(
    
@SClass nvarchar(50)
)
as
    
select * from [Students] where [SClass] = @SClass

go

create procedure [AddStudent]
(
    
@SID nvarchar(50),
    
@SName nvarchar(50),
    
@SClass nvarchar(50)
)
as
    
insert into [Students]([SID][SName][SClass]values (@SID@SName@SClass)
    
select * from [Students] where [SerialNumber] = SCOPE_IDENTITY()

go

create procedure [DeleteStudent]
(
    
@SerialNumber int
)
as
    
delete from [Students] where [SerialNumber] = @SerialNumber

go

create procedure [UpdateStudent]
(
    
@SerialNumber int,
    
@SID nvarchar(50),
    
@SName nvarchar(50),
    
@SClass nvarchar(50)
)
as
    
update [Students] set [SID] = @SID[SName] = @SName[SClass] = @SClass where [SerialNumber] = @SerialNumber
    
select * from [Students] where [SerialNumber] = @SerialNumber

go

create procedure [GetStudent]
(
    
@SerialNumber int,
    
@SID nvarchar(50) output,
    
@SName nvarchar(50) output,
    
@SClass nvarchar(50) output
)
as
    
select @SID = [SID]@SName = [SName]@SClass = [SClass] from [Students] where [SerialNumber] = @SerialNumber

go

create procedure [GetStudentName]
(
    
@SerialNumber int
)
as
    
select [SName] from [Students] where [SerialNumber] = @SerialNumber

go

这里使用的是sql server 2005 express edition。这里有一个东西需要注意一下:在UpdateStudent存储过程中在update语句执行完成之后又紧跟了一句select语句,在微软提供的源代码中对这种行为有一行注释:This statement is used to update the DataSet if changes are done on the updated record (identities, timestamps or triggers )。好像是说这条语句是来在被更新的数据又被更新之后来更新DataSet的,呵呵,好多更新,没太明白,请高人指点一下嘻嘻。

建立了数据库之后,为了简单,我建立了一个console application。然后在项目中添加了一个app.config文件。这还是我第一次使用app.config呢!以前一直都是做web开发的嘻嘻。文件如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  
<configSections>
    
<section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data" />
  
</configSections>
  
<connectionStrings>
    
<add name="DataAccessTest" providerName="System.Data.SqlClient" connectionString="server=.\sqlexpress;database=DataAccessTest;Integrated Security=true" />
  
</connectionStrings>
  
<dataConfiguration defaultDatabase="DataAccessTest" />
</configuration>

在这里首先注册了一个配置段,对应于DatabaseSettings类型。就是说配置文件下面的dataConfiguration部分要用DatabaseSettings类来处理,至于怎么处理,不知道。希望在分析了源代码之后能够了解。接下来dataConfiguration的defaultDatabase属性的内容如果我没猜错的话应该是上面的connectionString,就是说默认的数据库是通过ConnectionString来指定的。在后面声明数据库的时候也可以指定数据库名,这里猜测可能就是ConnectionString,不过我没有测试。

在创建了app.config之后要添加引用。在我的项目中使用Data Access Application Block的时候要添加两个引用:Microsoft.Practices.EnterpriseLibrary.Common.dll和Microsoft.Practices.EnterpriseLibrary.Data.dll,至于其它时候是不是需要添加别的引用,还是不知道。这两个文件可以在安装Microsoft Enterprise Library January 2006路径的bin文件夹中找到。

接下来开始正式写代码了。在微软的样例中一共提供了六种应用情况,但是后两种应用(事务支持和利用sql server返回xml,只能应用于sql server)我从来都没有使用过,所以就没有实现。感兴趣的话可以自己看看嘻嘻。

第一个函数是使用DataReader直接返回数据的例子,也是我平时最长使用的方法。代码如下:

static void PrintAllStudents()
{
    Database db 
= DatabaseFactory.CreateDatabase();
    DbCommand dbCommand 
= db.GetSqlStringCommand("select * from Students");

    
using (IDataReader reader = db.ExecuteReader(dbCommand))
    
{
        
while (reader.Read())
        
{
            Console.WriteLine(
"SN:{0} ID:{1} Name:{2}\t Class:{3}", reader[0], reader[1], reader[2], reader[3]);
        }

    }

}

这里使用了工厂模式生成数据库对象,还使用了全新的DbXXX对象。这些东西都是我很感兴趣的,不过因为开窍时间比较晚,暂时对他们还没有什么认识,希望以后能好好研究一下。另外我在前面说可以在创建数据库的时候指定ConnectionString,就是指在DatabaseFactory.CreateDatabase()时可以传递一个string类型的参数,估计就是你所想指定的ConnectionString。剩下的部分没有什么差别了,只不过使用的方法和ado.net不是很一样。

接下来是使用存储过程的例子:

static void GetCETBand4Students()
{
    Database db 
= DatabaseFactory.CreateDatabase();
    DbCommand dbCommand 
= db.GetStoredProcCommand("GetStudentsByClass");
    db.AddInParameter(dbCommand, 
"SClass", DbType.String, "CET Band 4");
    DataSet band4Students 
= db.ExecuteDataSet(dbCommand);
    
foreach (DataRow row in band4Students.Tables[0].Rows)
    
{
        Console.WriteLine(
"SN:{0} ID:{1} Name:{2}\t Class:{3}", row[0], row[1], row[2], row[3]);
    }

}

这里通过AddInParameter方法向指定的DbCommand对象加入参数。接下来的代码就没有什么值得说的部分了,一起贴出来。

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Practices.EnterpriseLibrary.Data;
using System.Data.Common;
using System.Data;

namespace DataAccessTest
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            Console.Write(
"Press \"enter\" to run IDataReader & direct sql string demo:");
            Console.ReadLine();
            Console.WriteLine();
            PrintAllStudents();
            Console.WriteLine();
            Console.Write(
"Press \"enter\" to run DataSet & stored procedure demo:");
            Console.ReadLine();
            Console.WriteLine();
            GetCETBand4Students();
            Console.WriteLine();
            Console.Write(
"Press \"enter\" to run updating with DataSet demo:");
            Console.ReadLine();
            Console.WriteLine();
            UpdateWithDataSet();
            Console.WriteLine();
            Console.Write(
"Press \"enter\" to run output parameter demo:");
            Console.ReadLine();
            Console.WriteLine();
            OutputParameter();
            Console.WriteLine();
            Console.Write(
"Press \"enter\" to run ExecuteScalar demo:");
            Console.ReadLine();
            Console.WriteLine();
            ExecuteScalar();
            Console.WriteLine();
            Console.WriteLine(
"All demos finished, press\"enter\" to exit.");
            Console.ReadLine();
        }


static void PrintAllStudents()
{
    Database db 
= DatabaseFactory.CreateDatabase();
    DbCommand dbCommand 
= db.GetSqlStringCommand("select * from Students");

    
using (IDataReader reader = db.ExecuteReader(dbCommand))
    
{
        
while (reader.Read())
        
{
            Console.WriteLine(
"SN:{0} ID:{1} Name:{2}\t Class:{3}", reader[0], reader[1], reader[2], reader[3]);
        }

    }

}


        
static void GetCETBand4Students()
        
{
            Database db 
= DatabaseFactory.CreateDatabase();
            DbCommand dbCommand 
= db.GetStoredProcCommand("GetStudentsByClass");
            db.AddInParameter(dbCommand, 
"SClass", DbType.String, "CET Band 4");
            DataSet band4Students 
= db.ExecuteDataSet(dbCommand);
            
foreach (DataRow row in band4Students.Tables[0].Rows)
            
{
                Console.WriteLine(
"SN:{0} ID:{1} Name:{2}\t Class:{3}", row[0], row[1], row[2], row[3]);
            }

        }


        
static void UpdateWithDataSet()
        
{
            Database db 
= DatabaseFactory.CreateDatabase();
            DbCommand dbCommand 
= db.GetSqlStringCommand("select * from Students");
            DataSet students 
= new DataSet();
            db.LoadDataSet(dbCommand, students, 
"Students");

            students.Tables[
0].Rows.Add(new object[] { DBNull.Value, "06130006""tel1sen""CET Band 2" });
            students.Tables[
0].Rows[0]["SClass"= "CET Band 8";

            DbCommand insertCommand 
= db.GetStoredProcCommand("AddStudent");
            db.AddInParameter(insertCommand, 
"SID", DbType.String, "SID", DataRowVersion.Current);
            db.AddInParameter(insertCommand, 
"SName", DbType.String, "SName", DataRowVersion.Current);
            db.AddInParameter(insertCommand, 
"SClass", DbType.String, "SClass", DataRowVersion.Current);

            DbCommand deleteCommand 
= db.GetStoredProcCommand("DeleteStudent");
            db.AddInParameter(deleteCommand, 
"SerialNumber", DbType.Int32, "SerialNumber", DataRowVersion.Current);

            DbCommand updateCommand 
= db.GetStoredProcCommand("UpdateStudent");
            db.AddInParameter(updateCommand, 
"SerialNumber", DbType.Int32, "SerialNumber", DataRowVersion.Current);
            db.AddInParameter(updateCommand, 
"SID", DbType.String, "SID", DataRowVersion.Current);
            db.AddInParameter(updateCommand, 
"SName", DbType.String, "SName", DataRowVersion.Current);
            db.AddInParameter(updateCommand, 
"SClass", DbType.String, "SClass", DataRowVersion.Current);

            Console.WriteLine(
"Rows affected:{0}", db.UpdateDataSet(students, "Students", insertCommand, updateCommand, deleteCommand, UpdateBehavior.Standard));
            PrintAllStudents();
        }


        
static void OutputParameter()
        
{
            Database db 
= DatabaseFactory.CreateDatabase();
            DbCommand dbCommand 
= db.GetStoredProcCommand("GetStudent");
            db.AddInParameter(dbCommand, 
"SerialNumber", DbType.Int32, 1);
            db.AddOutParameter(dbCommand, 
"SID", DbType.String, 50);
            db.AddOutParameter(dbCommand, 
"SName", DbType.String, 50);
            db.AddOutParameter(dbCommand, 
"SClass", DbType.String, 50);
            db.ExecuteNonQuery(dbCommand);
            Console.WriteLine(
"SN:{0} ID:{1} Name:{2}\t Class:{3}", db.GetParameterValue(dbCommand, "SerialNumber"), db.GetParameterValue(dbCommand, "SID"), db.GetParameterValue(dbCommand, "SName"), db.GetParameterValue(dbCommand, "SClass"));
        }


        
private static void ExecuteScalar()
        
{
            Database db 
= DatabaseFactory.CreateDatabase();
            DbCommand dbCommand 
= db.GetStoredProcCommand("GetStudentName"1);
            Console.WriteLine(
"Name:{0}", db.ExecuteScalar(dbCommand));
        }

    }

}

当然这只是Data Access Application Block的一个极其简单的应用,而且Data Access Application Block的使用方法远不止于此

这篇文章是从博客园:骑士的荣誉  看到的,虽然简单,确实入门兄弟的上等参考,顾贴一下

posted on 2008-07-16 11:20  yhb199  阅读(540)  评论(0编辑  收藏  举报