자료/ASP.NET

DAAB(Data Access Application Block) in Enterprise Library 2.0 - (4회)

네오블루 2008. 5. 15. 23:18
DAAB(Data Access Application Block) in Enterprise Library 2.0 - (4회)
 
키워드
Enterprise Library 2.0 Data Access Application Block
난이도
중급
작성일
2006-04-09 오후 10:06:48
조회수
1397회
평가점수
5.00
(1명 평가 평균)
첨부파일
(파일없음)
요약설명
DAAB(Data Access Application Block) in Enterprise Library for .NET 2.0은 DAC(Data Access Component) 레이어에서의 반복적인 ADO.NET 코딩량을 감소시켜주며 DB 커넥션 관리와 같은 사용자가 실수하기 쉬운 부분을 관리해주는 DAAB(Data Access Application Block)이 Enterprise Library에 통합된 버전이다. 또한 Enterprise Library 1.x에 있던 DAAB를 ADO.NET 2.0의 변화된 기능에 맞게 수정한 것이 DAAB(Data Access Application Block) in Enterprise Library for .NET 2.0이다.


 wooys
 

[상황별DAAB사용]

[DAAB사용하기위한준비와기본적인코드를살펴보았고다음에서는Data Access코딩시나올있는여러상황별로해당상황에서어떻게DAAB사용해서Data Access코딩을하는지살펴보도록하겠다.

경우SQL Server 2000설치되어있다면상관없지만SQL Server 2005설치되어있다면Northwind Database설치하도록한다.왜냐하면아래예제코드들에서는Northwind Database내의테이블들을사용하기때문이다.

Northwind데이터베이스를SQL Server 2005에설치하려면아래URL에서스크립트를다운로드받아실행하면된다.

http://msdn2.microsoft.com/en-us/library/ms143221(SQL.90).aspx]

 

 

[ExecuteReader이용한복수조회(DbDataReader사용)]

[

빠른 속도로 조회만을 목적으로 여러 행의 데이터를DB에서 불러와 화면에 표시하기를 원하는 경우이다.이 경우Database클래스에서 제공되는ExecuteReader메서드를 사용하여Stored Procedure를 호출하면 된다.Database내에 구현된ExecuteReaderDbDataReader오브젝트를 반환한다. DbDataReader는 데이터 바인딩을 지원하고DataListDataGrid와 같은 여러 서버 컨트롤의 데이터 소스로 작용할 수 있다.
ExecuteReader
에도 여러 오버로드가 있으며 위 오버로드의 종류 설명에 나와 있는 데로 각각의 상황에 맞는 오버로드를 사용하면 된다.
ExecuteReader
를 사용시 주의 사항은reader사용 후에 해당readerclose해 주거나dispose시켜 주도록 해야 한다. DAAB내부에서CommandBehavior.CloseConnection을 사용하므로readerclose해주면DB에 대한 커넥션도 닫히게 된다.
아래에ExecuteReader의 사용 예2개를 보였다.

사용 예제1 - C#)
Database db = DatabaseFactory.CreateDatabase();

 

using(IDataReaderdataReader = db.ExecuteReader(CommandType.Text,"Select Name, Address, City From Customers"))

{

   customerGrid.DataSource = dataReader;

   customerGrid.DataBind();

}

사용 예제2 - C#)
db = DatabaseFactory.CreateDatabase();

 

stringsqlCommand ="Select CustomerID, Name, Address, City, Country, PostalCode "+

                       "From Customers";

DbCommand dbCommand = db.GetSqlStringCommand(sqlCommand);

using(IDataReaderdataReader = db.ExecuteReader(dbCommand))

{

StringBuilder readerData =newStringBuilder();

while(dataReader.Read())

{

// Get the value of the Name column in the DbDataReader.

readerData.Append(dataReader["Name"]);

               readerData.Append(Environment.NewLine);

}

 

}     

]

 

 

[ExecuteDataSet이용한복수조회(DataSet사용)]

[

DataSet은 여러 테이블 혹은 한개의 테이블에서 복수개의 행을 조회한 뒤 조회된 내용을 멀티 티어 어플리케이션에서 티어 간에 전달하는 경우와 같이ADO.NET에서Data Container로서 훌륭한 역할을 수행한다.
따라서 이러한 경우에Database오브젝트의ExecuteDataSet을 사용한다.

ExecuteDataSet을 통해 생성된DataSet결과를 재사용하고자 한다면Database클래스에 있는LoadDataSet메서드를 이용하도록 한다.
아래 첫번째 예제는DbCommand를 파라미터로 받이들이는ExecuteDataSet의 오버로드의 사용 예를 보여주고 있다.

사용 예제1 - C#)
Database db = DatabaseFactory.CreateDatabase();

 

stringsqlCommand ="GetProductsByCategory";

DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand);

 

//카테고리7번의 제품 정보 조회.

intcategory = 7;

db.AddInParameter(dbCommand,"CategoryID",DbType.Int32, category);

 

DataSetproductDataSet = db.ExecuteDataSet(dbCommand);

사용 예제2 - C#)
아래와 같은Stored ProcedureDB에 만들어져 있을 경우의 예제

CREATE Procedure GetProductsByCategory
 (
  @CategoryID int
 )
 AS
 SELECT ProductID, ProductName, CategoryID, UnitPrice, LastUpdate
 FROM Products
 WHERE CategoryID = @CategoryID

Stored Procedure가 만들어져 있을 경우Category ID를 인자로 받아서 해당Category의 제품들을 화면에 표시해주는 메서드 예제

publicDataSetGetProductsInCategory(intCategory)

{

Database db = DatabaseFactory.CreateDatabase();

      stringsqlCommand ="GetProductsByCategory";

      DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand);

      db.AddInParameter(dbCommand,"CategoryID",DbType.Int32, Category);

      DataSetproductDataSet =null;

      productDataSet = db.ExecuteDataSet(dbCommand);

      resultsDataGrid.SetDataBinding(productDataSet,"Table");

}

 

 

참고)

ExecuteDataSet비슷한LoadDataSet이라는함수가있다.이들의차이점은ExecuteDataSet새로운DataSet만들지만LoadDataSet조회결과를기존의DataSet로드한다는차이점이있다.아래예에서command오브젝트를실행한결과를“orders”라는새로운DataTableorders라는기존DataSet추가한다.

LoadDataSet직접코딩해보면알겠지만8개의오버로가존재한다.

northwind.LoadDataSet(command, orders, "orders");

]

 

[커맨트와Output파라미터를이용한특정항목조회(ExecuteNonQuery사용)]

[

특정 상품에 대한 상세 정보 조회와 같은 경우에Stored Procedure를 상품 아이디로 호출하고 여러Output파라미터를 사용하면 원하는 결과를 얻을 수 있다.
사용하는 방법은ExecuteNonQuery메서드를 사용하여Stored Procedure를 호출하고 이 때Input/Output파라미터를 설정한다.결과 실행후에는Output파라미터에서 원하는 값을 취할 수 있다.

사용 예제1 - C#)
Database db = DatabaseFactory.CreateDatabase();

string sqlCommand = "GetProductDetails";
DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand);

db.AddInParameter(dbCommand, "ProductID", DbType.Int32, 3);
db.AddOutParameter(dbCommand, "ProductName", DbType.String, 50);
db.AddOutParameter(dbCommand, "UnitPrice", DbType.Currency, 8);

db.AddOutParameter(dbCommand, "QtyPerUnit", DbType.String, 20);

db.ExecuteNonQuery(dbCommand);

string results = string.Format(CultureInfo.CurrentCulture, "{0}, {1}, {2:C}, {3} ",

       db.GetParameterValue(dbCommand, "ProductID"),

       db.GetParameterValue(dbCommand, "ProductName"),

       db.GetParameterValue(dbCommand, "UnitPrice"),

       db.GetParameterValue(dbCommand, "QtyPerUnit"));

 

       lblResult.Text = results; 

 

사용 예제2 - C#)
아래와 같은Stored ProcedureDB에 만들어져 있다고 가정할 때

CREATE PROCEDURE GetProductDetails
@ProductID int,
@ProductName nvarchar(40) OUTPUT,
@UnitPrice money OUTPUT,
@QtyPerUnit nvarchar(20) OUTPUT
AS
SELECT @ProductName = ProductName,
      @UnitPrice = UnitPrice,
      @QtyPerUnit = QuantityPerUnit
FROM Products
WHERE ProductID = @ProductID

Stored Procedure를 사용하는 예제는 아래와 같다.

Database db = DatabaseFactory.CreateDatabase();

string sqlCommand = "GetProductsDetails";
DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand);
db.AddInParameter(dbCommand, "ProductID", DbType.Int32, productID);
// Output
파라미터는 리턴되는 데이터의 크기를 설정
db.AddOutParameter(dbCommand, "ProductName", DbType.String, 50);
db.AddOutParameter(dbCommand, "UnitPrice", DbType.Currency, 8);

db.AddOutParameter(dbCommand, "QtyPerUnit", DbType.String, 20);db.ExecuteNonQuery(dbCommand);

string results = string.Format(CultureInfo.CurrentCulture, "{0}, {1}, {2:C}, {3} ",

         db.GetParameterValue(dbCommand, "@ProductID"),

         db.GetParameterValue(dbCommand, "@ProductName"),

         db.GetParameterValue(dbCommand, "@UnitPrice"),

         db.GetParameterValue(dbCommand, "@QtyPerUnit"));

 

       lblResult.Text = results;

ExecuteNonQueryInser/Update/Delete수행후에 영향을 받은 행의 수를 리턴한다.위의 경우는Output파라미터를 사용하였으므로 리턴 값은 사용되지 않았다.

]

 

출처 : http://www.gosu.net