달력

52024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
반응형

http://cafe.naver.com/ws29/446

 

 

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--
add Key 설정
데이타베이스 연결 스트링
-->
*****
<appSettings>
<add key="BoardDSN" value="Network Library=DBMSSOCN;Data Source=localhost,1433;Initial Catalog=Testdb;user id=sa;Password=1234;" />
</appSettings>

*****
<system.web>
<!-- 동적 디버깅 컴파일
ASPX 디버깅을 사용하려면 compilation debug="true"로 설정합니다. 이렇게 하지 않고
해당 값을 false로 설정하면 이 응용 프로그램의 런타임 성능이 향상됩니다.
컴파일된 페이지에 디버깅 기호(.pdb 정보)를 삽입하려면 compilation debug="true"로 설정합니다.
이렇게 하면 파일 크기가 커져서 실행 속도가 느려지므로
디버깅하는 경우에만 이 값을 true로 설정하고
디버깅하는 경우 외에는 모두 false로 설정합니다. 자세한 내용은 ASP.NET 파일 디버깅에 관한
설명서를 참조하십시오.
-->

우선 web.config 화일 안에 **** 안에 구문을 입력한다.

그 다음 DB연결 Class를 추가 한후 아래에 소스를 복사한후 활용하면 됨...

using System;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Text;

namespace Common
{
/// <summary>
/// DB에 대한 요약 설명입니다.
/// </summary>
public class DB
{
private int mCount = 0;
private SqlConnection mDbConn = null;
private SqlCommand mCmd = null;
private SqlDataReader mReader = null;
StringBuilder sb = new StringBuilder();

/* DataBase Connection Open */
public void DbConn()
{
try
{
mDbConn = new SqlConnection(GetDSN);
mDbConn.Open();
}
catch (Exception e)
{
DbErrorMsg(e.Source, e.Message, e.StackTrace, "DataBase Open 실패");
}
}

// 연결문자열을 위한 Property
protected string GetDSN
{
get
{

// 밑에 구문이 web.config 에 있는 AppSettings
return System.Configuration.ConfigurationSettings.AppSettings["BoardDSN"];
}
}


/* DataBase Connection Close */
public void DbClose()
{
if (mDbConn == null)
{
return;
}

try
{
if (mDbConn.State.ToString() == "Open")
{
mDbConn.Close();
}
}
catch (Exception e)
{
DbErrorMsg(e.Source, e.Message, e.StackTrace, "DataBase Close 실패");
}
}

/* DataBase Transaction Init */
public void InitTransaction( string TransName )
{
try
{
mCmd = new SqlCommand();
mCmd.Connection = mDbConn;
mCmd.Transaction = mDbConn.BeginTransaction(IsolationLevel.ReadCommitted, TransName);
}
catch (Exception e)
{
DbErrorMsg(e.Source, e.Message, e.StackTrace, "Trancsaction Open 실패");
}
}

/* Transaction Execute Query */
public void ExecuteTransaction(string[] QueryArr)
{
try
{
foreach (string Query in QueryArr)
{
mCmd.CommandText = Query;
mCmd.ExecuteNonQuery();
}
mCmd.Transaction.Commit();

}
catch (Exception e)
{
mCmd.Transaction.Rollback();
DbErrorMsg(e.Source, e.Message, e.StackTrace, "Trancsaction Commit 실패");
}
}


/* Query Execute */
public void ExecuteQuery(string Query)
{
try
{
mCmd = new SqlCommand (Query, mDbConn);
mCmd.ExecuteNonQuery();
}
catch (Exception e)
{
DbErrorMsg(e.Source,e.Message,e.StackTrace, Query);
}
}

/* SQL DataReader Fatech Query */
public SqlDataReader FatechQuery(string Query)
{
try
{
mCmd = new SqlCommand (Query, mDbConn);
mReader = mCmd.ExecuteReader();
}
catch (Exception e)
{
DbErrorMsg(e.Source,e.Message,e.StackTrace, Query);
}
return mReader;
}

/* SQL DataReader Close */
public void ReaderClose()
{
try
{
if (!mReader.IsClosed)
{
mReader.Close();
}
}
catch (Exception e)
{
DbErrorMsg(e.Source, e.Message, e.StackTrace, "SQLReader Close 실패");
}
}

/* Procedure Execute */
public int ExecuteProc(string ProcName, IDataParameter[] parameters)
{
int Result = 0;
try
{
SqlCommand Cmd = BuildIntCommand( ProcName, parameters );
Cmd.ExecuteNonQuery();
Result = (int)Cmd.Parameters["ReturnValue"].Value;
}
catch (Exception e)
{
DbErrorMsg(e.Source, e.Message, e.StackTrace, "Procedure ExecuteProc Error");
}
return Result;
}

/* SQL DataReader Fatech Procedure */
public SqlDataReader FatechProc(string ProcName, IDataParameter[] parameters )
{
SqlCommand Cmd = BuildProcCommand( ProcName, parameters );
try
{
Cmd.CommandType = CommandType.StoredProcedure;
mReader = Cmd.ExecuteReader();
}
catch (Exception e)
{
DbErrorMsg(e.Source, e.Message, e.StackTrace, "Procedure FatechProc Error");
}
return mReader;
}

/* Execute Query DateSet */
public DataSet ExecuteDataSet(string Query, string TableName, int StartRecord, int PageSize)
{
DataSet mDataSet = new DataSet();
try
{
SqlDataAdapter mDataAdapter = new SqlDataAdapter(Query, mDbConn);
mDataAdapter.Fill(mDataSet, StartRecord, PageSize, TableName);
}
catch (Exception e)
{
DbErrorMsg(e.Source, e.Message, e.StackTrace, Query);
}

return mDataSet;
}

/* Execute Procedure DateSet */
public DataSet ExecuteProcDataSet(string ProcName, IDataParameter[] parameters, string TableName, int StartRecord, int PageSize)
{
DataSet mDataSet = new DataSet();
SqlDataAdapter mDataAdapter = new SqlDataAdapter();

mDataAdapter.SelectCommand = BuildProcCommand( ProcName, parameters );
try
{
mDataAdapter.Fill(mDataSet, StartRecord, PageSize, TableName);
}
catch (Exception e)
{
DbErrorMsg(e.Source, e.Message, e.StackTrace, "Procedure ExecuteProcDataSet Error");
}

return mDataSet;
}

/* Total Count Function */
public int TotalQuery(string Query)
{
try
{
mCmd = new SqlCommand (Query, mDbConn);
mCount = (int)mCmd.ExecuteScalar();
}
catch (Exception e)
{
DbErrorMsg(e.Source, e.Message, e.StackTrace, Query);
}
return mCount;
}

/* Procedure BuildIntCommand */
protected SqlCommand BuildIntCommand(string ProcName, IDataParameter[] parameters)
{
SqlCommand Cmd = BuildProcCommand( ProcName, parameters );

try
{
Cmd.Parameters.Add( new SqlParameter ( "ReturnValue",
SqlDbType.Int,
4, /* Size */
ParameterDirection.ReturnValue,
false, /* is nullable */
0, /* byte precision */
0, /* byte scale */
string.Empty,
DataRowVersion.Default,
null ));
}
catch (Exception e)
{
DbErrorMsg(e.Source, e.Message, e.StackTrace, "Procedure BuildIntCommand Error");
}

return Cmd;
}

/* Procedure Parameter Build */
protected SqlCommand BuildProcCommand(string ProcName, IDataParameter[] parameters)
{
try
{
mCmd = new SqlCommand (ProcName, mDbConn);
mCmd.CommandType = CommandType.StoredProcedure;

foreach (SqlParameter parameter in parameters)
{
mCmd.Parameters.Add( parameter );
}
}
catch (Exception e)
{
DbErrorMsg(e.Source, e.Message, e.StackTrace, "Procedure BuildProcCommand Error");
}

return mCmd;
}

/* Error Message Print */
public void DbErrorMsg(string ErrSource, string ErrMsg, string stack, string Query)
{
DbClose();
string ErrorMsg = "Error Souce =" + ErrSource + "<br>"
+ "Error Message = <font color='red'><b>" + ErrMsg + "</b></font><br>"
+ "Stack = " + stack + "<br><br>"
+ "Query = <font color='blue'><b>" + Query + "</b></font>";
System.Web.HttpContext.Current.Response.Write(ErrorMsg);
System.Web.HttpContext.Current.Response.End();
}

}
}

반응형
Posted by 친절한 웬디양~ㅎㅎ
|

참고 URL

Develope/ASP.net 2013. 1. 25. 19:02
반응형
반응형
Posted by 친절한 웬디양~ㅎㅎ
|
반응형

web service란...

플랫폼(OS)과 언어에 관계없이 표준 인터넷 프로토콜을 기반으로 하는,

재사용이 가능한 컴포넌트.

(any when, any where, any device. & connected internet. & s/w, data file 사용할 수 있도록 해주는 기술.)

협업(Collaboration) 가능

 

- SOAP(솝, Simple Object Transfer Protocol)

:HTTP+XML 이용 데이터 인코딩하여 전송하는 프로토콜.

:방화벽 문제없음.

:플랫폼 제약 없음.

:가볍고 빠름.

 

- WSDL (Web Services Description Language, 위즈덜)

: 웹서비스 기술문서, 웹서비스가 지원하는 인터페이스(메서드, 프로토콜 등)에 대한 정보 기술 XML

:반드시 제공해야함.

: Microsoft, IBM 공동 개발언어

 

- UDDI (Universal Description, Discovery, and Integration)

: 웹서비스를 위한 검색엔진

: www.uddi.org, uddi.microsoft.com

 

- Develope

: System.Web.Services.WebService 클래스 상속.

: Application/Session 변수 사용 가능.

: 유용한 참조 - using System.Web.Services;

: Web.config

<location path="Ws">

<system.web>

<authorization>

<allow users="*"/>

</authorization>

</system.web>

</location>

</configuration>

 

[WebMethod]

: Web Callable Method

: C#용 (VB는 <WebMethod>)

 

지원 데이터 타입

: byte, Boolean, char, DateTime, Decimal, Double, int, single, unit, GUID 등.

속성

: BufferResponse - true 성능 향상. 기본값. 한번의 전송으로..

: Description - 주사용 속성.

: EnableSession - false 성능 향상. 기본값.

: MessageName

: TransactionOption - 트랜잭션 처리시 요구 설정.

예) [WebMethod(Description="함수명", EnableSession=false)]

 

반응형
Posted by 친절한 웬디양~ㅎㅎ
|

ibatis.net

Develope/ASP.net 2010. 2. 23. 17:02
반응형
db access technic
Data Mapper Framework

code 에서 SQL 분리~

iBATIS.NET 는 정확하게는 O/R매핑 기능을 주관하는「SQL Maps」과 DI(Dependency Injection) 기능을 주관하는「DAO Framework」라고 하는 2가지의 기능으로 구성되는 체제(라이브러리)이다. 

1. iBATIS.NET의 인스톨과 환경 설정

A. 설치
http://ibatis.apache.org/
IBatis.DataMapper.1.6.2.bin.zip 다운로드!!

=> 모든「.dll」파일을 어플리케이션 루트 아래의「bin」폴더에 카피!!!
=> providers.config를 어플리케이션 루트의 아래에 복사해 두자.
: providers.config는 iBATIS.NET가 이용하는 접속 프로바이더(각각의 데이터베이스 제품에 액세스하기 위한 기본적인 라이브러리 집단)의 설정을 정의하는 설정 파일이다.

B.  우선 데이터베이스 접속 정보를 전용 설정 파일인 sqlMap.config로 선언해 두어야 한다.
: 템플릿으로서 SqlMap-sample.config 있음.

<?xml version="1.0" encoding="UTF-8" ?>

<sqlMapConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="SqlMapConfig.xsd">

  <providers resource="providers.config" />

  <database>
    <provider name="sqlServer1.1"/>
    <dataSource name="sample" connectionString="Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=sample" />
  </database>

  <sqlMaps>
    <sqlMap resource="./Book.xml" />
  </sqlMaps>

</sqlMapConfig>

=> 작성한 sqlMap.config는 다른「.aspx」파일과 같은 폴더(본문의 경우에는 어플리케이션 루트의 아래)에 저장할 것.

<providers>요소에는 접속 프로바이더의 정보를 정의한 설정 파일(providers.config)에의 패스를 지정한다. 앞에서 서술한 것처럼 providers.config는 iBATIS.NET가 대응하고 있는 접속 프로바이더를 기술한 설정 파일이다. providers.config는 미리 다운로드 파일에 포함되어 있으므로, 이것을 복사하기만 하면 되고, 스스로 편집할 필요는 없다.

 이하에 providers.config로 정의되고 있는 주된 접속 프로바이더를 들어 보자.

접속 프로바이더명 데이터베이스
sqlServer1.0 SQL Server 7.0/2000(.NET Framework 1.0용)
sqlServer1.1 SQL Server 7.0/2000(.NET Framework 1.1용)
OleDb1.1 OLE DB(.NET Framework 1.1용)
Odbc1.1 ODBC(.NET Framework 1.1용)
oracle9.2 Oracle 9.2
oracle10.1 Oracle 10.1
oracleClient1.0 Oracle(Microsoft로부터 제공되고 있는 것)
MySql MySQL
SQLite3 SQLite 3.0
Firebird1.7 FireBird
PostgreSql0.7 PostgreSQL
iDb2.10 IBM DB2
 
iBATIS.NET가 대응하는 접속 프로바이더 

다만, SQL Server, OLE DB, ODBC 이외의 데이터베이스를 이용하는 경우에는 별도의 데이터베이스 전용 접속 프로바이더(.NET 데이터 프로바이더)가 필요하게 되므로 주의하자. 
실제의 접속 설정을 하는 것은 <database>요소의 역할이다. 사용하는 접속 프로바이더를 <provider>요소로, 접속 문자열을 <dataSource>요소로 각각 정의한다.

 <sqlMaps>요소는 iBATIS.NET로 사용하는 매핑 파일에의 패스를 지정한다. 매핑 파일이란, NHibernate의 해설에서도 소개했던 것처럼, 테이블상의 필드(열)와 클래스의 속성을 관련짓기 위한 정의 파일이다. 여기에서는 매핑 파일로서 Book.xml을 지정한다

C. sqlMap.config로 지정한 매핑 파일 Book.xml을 정의!
books 테이블과 Book 클래스를 연관짓는다.

<?xml version="1.0" encoding="UTF-8" ?>

<sqlMap namespace="Book"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="SqlMap.xsd">

  <alias>
    <typeAlias alias="Book" type="Com.Msn.Wings.Book, Book" />
  </alias>

  <resultMaps>
    <resultMap id="booksResult" class="Book">
      <result property="Isbn" column="isbn" />
      <result property="Title" column="title" />
      <result property="Price" column="price" />
      <result property="Publish" column="publish" />
      <result property="Published" column="published" />
    </resultMap>
  </resultMaps>

  <statements>

    <select id="getBooksInfo" resultMap="booksResult">
      SELECT isbn,title,price,publish,published FROM books WHERE publish=#value#
    </select>

      ……중략……

    <insert id="setBookInfo" parameterClass="Book">
      INSERT INTO books(isbn,title,price,publish,published) VALUES(#Isbn#,#Title#,#Price#,#Publish#,#Published#)
    </insert>

  </statements>

</sqlMap>
iBATIS.NET에 의한 매핑 파일의 기술 예(Book.xml) 

클래스와 테이블을 관련짓는 것은 <resultMap>요소의 역할이다. id속성에 매핑명을, class 속성에 관련짓는 클래스명을 지정한다. 또한, 클래스명은 미리 <typeAlias>요소로 선언한 앨리어스(alias)(별칭)와 대응하고 있어야 한다.<typeAlias>요소의 구문은 이하와 같다.

<typeAlias alias="앨리어스(alias)명" type="클래스의 완전 수식명, 어셈블리명" />

 <resultMap>요소 아래의 <result>요소는, 각각의 필드명과 속성을 관련 짓는다. property 속성에는 클래스의 속성명을, column 속성에는 대응하는 필드명을 각각 지정한다.

 다음의 <statements>요소는 iBATIS.NET에서 발행하는 SQL 퀘리를 관리한다. <statements>요소의 아래에는 이하의 표에서 나타내 보이는 요소와 속성을 기술할 수 있다.

요소 속성 개요
<insert>
<update>
<delete>
id SQL 퀘리명
parameterClass SQL 퀘리 내의 플레이스 홀더에 값을 설정하기 위한 클래스명
parameterMap SQL 퀘리 내의 플레이스 홀더에 값을 설정하기 위한 맵명
<select> id SQL 퀘리명
parameterClass SQL 퀘리 내의 플레이스 홀더에 값을 설정하기 위한 클래스명
parameterMap SQL 퀘리 내의 플레이스 홀더에 값을 설정하기 위한 맵명
resultClass 취득한 결과 세트를 세트하는 클래스명
resultMap 취득한 결과 세트를 세트하는 맵명
 
요소 아래에서 지정 가능한 주된 부하 요소와 속성


  우선<select>요소는 그 이름에서도 쉽게 추측할 수 있듯이, SELECT 명령을 발행할 때 이용된다. INSERT/UPDATE/DELETE의 각 명령을 발행하는 경우에는 각각 대응하는 요소로 지정하면 된다.

 id속성은 SQL 퀘리를 한꺼번에 특정하기 위한 논리명이다. 코드중에서 매핑 파일을 검색할 때의 키가 되는 정보이므로, 매핑 파일 내에서 반드시 한꺼번에 지정해야 한다.

 resultMap 속성은 데이터베이스에서 취득한 결과 세트를 영속화 클래스(영속화 클래스에 대해서는 지난 1회의「[4]영속화 클래스를 정의한다」의 항목 을 참조)에 매핑하기 위한 맵명을 지정한다. 방금 전 <resultMap>요소로 지정한 id속성의 값을 세트할 것.

 발행하는 SQL 퀘리 본체는 <select> (또는 <insert>/<update>/<delete>) 요소의 본체에 기술한다. 본문의 서두에서도 기술한 것처럼, iBATIS.NET에서는 NHibernate와 같은 O/R매핑 툴과는 달리, SQL 퀘리를 개발자가 명시적으로 기술해야 한다.

 예를 들면 이하의 <select>요소는 프로그램 코드에서「getBooksInfo」라고 하는 ID로 식별되어 2행째에 있는 SELECT 명령을 데이터베이스에 대해 실행한다.

<select id="getBooksInfo" resultMap="booksResult">
  SELECT isbn,title,price,publish,published FROM books WHERE publish=#value#
</select>

 그리고 매핑 파일 내의 이하와 같은 <resultMap>요소의 기술에 따라서, 검색 결과의 각 필드 값이 Book 오브젝트의 각 속성에 대입된다는 것이다.

<resultMap id="booksResult" class="Book">
  <result property="Isbn" column="isbn" />
  <result property="Title" column="title" />
  <result property="Price" column="price" />
  <result property="Publish" column="publish" />
  <result property="Published" column="published" />
</resultMap>

 SQL 퀘리에는 「#value#」(무명 파라미터) 또는「#파라미터명#」(이름 파라미터)의 형식으로 플레이스 홀더를 설치하는 것이 가능하다.

 무명 파라미터는 코드 안에서도 이름 등을 의식하지 않고, 직접 값을 세트 할 수 있는 것이 포인트이다. 퀘리 내에 플레이스 홀더가 1개밖에 없는 경우에는 무명 파라미터를 이용하는 것으로 코드를 간단하게 기술할 수 있다.

 한편, 퀘리 내에 플레이스 홀더가 여러 개 존재하는 경우에는 이름 파라미터를 이용하면 된다. 자세한 것은 나중에 서술하겠지만, 이름 파라미터를 이용하는 것으로 parameterClass 속성으로 지정된 클래스와 같은 이름의 속성 값이 자동으로 세트된다. 즉, 위의 매핑 파일의 예(INSERT 명령)라면, Book.Isbn 속성의 값이 # Isbn#파라미터에, Book.Title 속성의 값이 #Title#파라미터에 각각 자동으로 SQL 퀘리로 할당된다는 것이다.




 

 

 

2. iBATIS.NET 경유로 데이터베이스를 검색한다








야마다 요시히로 (http://www.wings.msn.to/) | 2005/10/10 















 이상으로 iBATIS.NET를 이용하기 위한 준비는 완료되었다. 그러면, 드디어 iBATIS.NET를 경유하여 데이터베이스에 액세스해 보자.

 이하의 웹 폼은 지난 회에서와 같이,[출판사]란에 입력된 키워드로 books 테이블을 검색하여 취득한 결과를 DataGrid 컨트롤 상에 일람 표시하는 샘플이다. 우선은 구체적인 코드를 살펴보자.

<%@ Page ContentType="text/html" Language="C#" debug="true" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="IBatisNet.DataMapper" %>
<%@ Import Namespace="Com.Msn.Wings" %>
<script runat="Server">

IList books=null;

// [검색]버튼을 클릭하면 실행
public void btnSrch_Click(Object sender, EventArgs e){

  // 매핑 파일에서 해당하는 SQL퀘리를 취득하여 발행.
  // 취득한 Book 클래스의 리스트(IList 오브젝트)를 DataGrid
  // 컨트롤에 바인드한다
  books = Mapper.Instance().QueryForList("getBooksInfo", txtSrch.Text);
  grid.DataBind();
}

</script>
<html>
<head>
<title>iBATIS.NET에 의한 데이터 액세스</title>
</head>
<body>
<form runat="Server">
  출판사:
  <asp:TextBox id="txtSrch" runat="Server" />
  <asp:Button id="btnSrch" runat="Server"
    Text="검색" OnClick="btnSrch_Click" />
  <br />

  <asp:DataGrid id="grid" runat="Server"
    DataSource="<%# books %>" AutoGenerateColumns="False"
    DataKeyField="isbn">

    <HeaderStyle BackColor="#BB2255" ForeColor="white"
      HorizontalAlign="Center" Font-Bold="True" />
    <ItemStyle BackColor="#FFeeEE" />
    <AlternatingItemStyle BackColor="#FFDDDD" />

    <Columns>
      <asp:BoundColumn DataField="Isbn" HeaderText="ISBN코드"
        ReadOnly="True" />
      <asp:BoundColumn DataField="Title" HeaderText="서명" />
      <asp:BoundColumn DataField="Price" HeaderText="가격"
        DataFormatString="{0:#,###엔}" />
      <asp:BoundColumn DataField="Publish" HeaderText="출판사" />
      <asp:BoundColumn DataField="Published" HeaderText="발행일"
        DataFormatString="{0:yyyy년 MM월 dd일(ddd)}" />
    </Columns>

  </asp:DataGrid>
</form>
</body>
</html>
<%@ Page ContentType="text/html" Language="VB" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="IBatisNet.DataMapper" %>
<%@ Import Namespace="Com.Msn.Wings" %>
<script runat="Server">

Dim books As IList

' [검색]버튼을 클릭하면 실행
Public Sub btnSrch_Click(sender As Object, e As EventArgs)

  '매핑 파일에서 해당하는 SQL 퀘리를 취득하여 발행.
  '취득한 Book 클래스의 리스트(IList 오브젝트)를 DataGrid
  '컨트롤에 바인드한다
  books = Mapper.Instance().QueryForList("getBooksInfo", txtSrch.Text)
  grid.DataBind()
End Sub

</script>
<html>
<head>
<title>iBATIS.NET에 의한 데이터 액세스</title>
</head>
<body>
<form runat="Server">
  출판사:
  <asp:TextBox id="txtSrch" runat="Server" />
  <asp:Button id="btnSrch" runat="Server"
    Text="검색" OnClick="btnSrch_Click" />
  <br />

  <asp:DataGrid id="grid" runat="Server"
    DataSource="<%# books %>" AutoGenerateColumns="False"
    DataKeyField="isbn">

    <HeaderStyle BackColor="#BB2255" ForeColor="white"
      HorizontalAlign="Center" Font-Bold="True" />
    <ItemStyle BackColor="#FFeeEE" />
    <AlternatingItemStyle BackColor="#FFDDDD" />

    <Columns>
      <asp:BoundColumn DataField="Isbn" HeaderText="ISBN코드"
        ReadOnly="True" />
      <asp:BoundColumn DataField="Title" HeaderText="서명" />
      <asp:BoundColumn DataField="Price" HeaderText="가격"
        DataFormatString="{0:#,###엔}" />
      <asp:BoundColumn DataField="Publish" HeaderText="출판사" />
      <asp:BoundColumn DataField="Published" HeaderText="발행일"
        DataFormatString="{0:yyyy년 MM월 dd일(ddd)}" />
    </Columns>

  </asp:DataGrid>

</form>
</body>
</html>
iBATIS.NET를 이용하여 데이터베이스 검색을 하는 샘플 프로그램
(위:C#판 「ibatis_cs.aspx」, 아래:VB.NET판 「ibatis_vb.aspx」)


  iBATIS.NET에서 데이터베이스 액세스의 핵심을 담당하는 것은 SqlMapper 클래스(IBatisNet.DataMapper 이름 공간)의 역할이다. SqlMapper 클래스는 정적 메소드인 Mapper.Instance 메소드를 개입시켜 취득할 수 있다. 또, Mapper 클래스는 sqlMap.config에 의해서 정의된 매핑 정보로 액세스하기 위한 클래스이다.

 SqlMapper 클래스의 인스턴스를 취득하면, 다음은 간단하다. SqlMapper. QueryForList 메소드를 이용하여 매핑 파일 상에서 정의된 SQL 퀘리를 호출하면 된다. QueryForList 메소드의 일반적인 구문은 이하와 같다.

public IList QueryForList(string statementName, object parameterObject)
public IList QueryForList(string statementName, object parameterObject, int skipResults, int maxResults)
SqlMapper 클래스의 QueryForList 메소드의 구문(C#)


  파라미터 statementName에는 방금 전 <select>요소의 id속성으로 정의한 SQL 퀘리명을, 파라미터 parameterObject에는 플레이스 홀더에 세트하는 파라미터 값을 각각 세트한다. 취득하는 시작행이나 최대 취득행을 지정하고 싶은 경우에는 제3, 제4 파라미터에 각각 명시하는 것도 가능하다.

 이와 같이 iBATIS.NET를 이용하여, 데이터베이스에의 접속 정보나 SQL 퀘리를 외부화 하는 한편, 취득한 결과를 특별한 매핑 코드를 기술하지 않고도 오브젝트에 매핑할 수 있다는 것이다.

 이상을 이해했으면, 즉시 샘플을 동작시켜 보자. 지난 NHibernate편에서 소개한 샘플과 같은 결과를 얻을 수 있을 것이다.


■ iBATIS.NET가 제공하는 「다이나믹 SQL」

 이와 같이, iBATIS.NET를 이용하는 것으로, 데이터베이스 제휴의 코드를 간단하게 기술할 수 있다. 그러나, iBATIS.NET의 매력은 이것 뿐만 아니다. iBATIS .NET에는 동적으로 SQL 퀘리를 생성하는「다이나믹 SQL」이라고 불리는 매우 편리한 기능이 준비되어 있다.

 다이나믹 SQL이란, 예를 들면 조건식으로 부여되는 파라미터 상태에 의해, 동적으로 조건식을 교체하는 기능이다. 우선은 이하의 예를 살펴 보자.

<select id="getBooksInfo2" resultMap="booksResult">
  SELECT isbn,title,price,publish,published FROM books
  <dynamic prepend="WHERE">
    <isNotEmpty prepend="AND" property="Publish">
      publish=#Publish#
    </isNotEmpty>
  </dynamic>
</select>
다이나믹 SQL를 이용하기 위한 매핑 파일의 설정(Book.xml(발췌))

IList books = null;

public void btnSrch_Click(Object sender, EventArgs e) {
  Book book = new Book();
  book.Publish = txtSrch.Text;
  books = Mapper.Instance().QueryForList("getBooksInfo2", book);
  grid.DataBind();
}
다이나믹 SQL에 의한 데이터베이스 검색(C#의 예:ibatis_cs2.aspx(발췌))


  이것은, 방금 전의 ibatis_cs.aspx를 다이나믹 SQL로 옮겨놓은 것이다. ibatis_cs.aspx의 경우, 검색 조건으로서[출판사]란을 지정하지 않았을 때에는 빈 데이터 그리드가 표시될 것이다. 이것은 publish 필드가 빈 문자열의 레코드를 검색하려고 했기 때문이다.

 그러나, 위의 설정과 코드로[출판사]란을 공백으로 하고 검색을 실시했을 경우, 모든 서적 정보가 표시된다. 이것이 다이나믹 SQL의 기능이다. 다이나믹 SQL은 <dynamic>요소의 부하에 기술된 조건이 true일지에 의해서, 동적으로 조건구를 추가하는 기능이다.

 이 설정에서는 Book.Publish 속성의 값이 비어 있지(Empty) 않은 경우에만「WHERE publish='*****'」라는 조건구를 SQL 퀘리에 추가한다. prepend 속성은 추가하는 조건구 전에 추가하는 키워드를 지정하는 것으로, 여기에서는「WHERE」를 추가한다.

 유저의 입력값에 의해서, 동적으로 SQL 퀘리를 변경하고 싶은 경우에도 다이나믹 SQL의 기능을 이용하면, 보다 심플하게 SQL 퀘리를 구성할 수 있다.

 참고로, <dynamic>요소의 아래에서 이용할 수 있는 주된 조건 요소로는 이하의 표와 같은 것이 준비되어 있다.


요소 SQL 퀘리가 추가되는 조건
isEqual property 속성의 값이 compareValue 속성의 값과 동일한 경우
isNotEqual property 속성의 값이 compareValue 속성의 값과 동일하지 않은 경우
isGreaterThan property 속성의 값이 compareValue 속성의 값보다 큰 경우
isGreaterEqual property 속성의 값이 compareValue 속성의 값 이상인 경우
isLessThan property 속성의 값이 compareValue 속성의 값보다 작은 경우
isLessEqual property 속성의 값이 compareValue 속성의 값 미만인 경우
isNull property 속성의 값이 null인 경우
isNotNull property 속성의 값이 null이 아닌 경우
isEmpty property 속성의 값이 비어 있는 경우
isNotEmpty property 속성의 값이 비어있지 않은 경우
 
요소 아래에서 기술 가능한 주된 조건 요소

 





eLancer는 세계적인 전문가 그룹입니다.



3. iBATIS.NET에 의한 데이터 등록

야마다 요시히로 (http://www.wings.msn.to/) | 2005/10/10 


 다음으로, iBATIS.NET를 사용한 데이터의 등록을 살펴 보자. 전 항목의 내용을 이해했으면, 데이터의 등록은 매우 간단하게 실현될 수 있다.

 이하의 샘플 코드는 유저로부터 입력된 값을 books 테이블에 새로 등록하기 위한 웹 폼의 예이다.

<%@ Page ContentType="text/html" Language="C#" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="IBatisNet.DataMapper" %>
<%@ Import Namespace="Com.Msn.Wings" %>
<script runat="Server">

// [등록]버튼을 클릭하면 실행
public void btnSubmit_Click(Object sender, EventArgs e) {

  // Book 오브젝트의 각 속성에 입력된 값을 세트
  Book book = new Book();
  book.Isbn = txtIsbn.Text;
  book.Title = txtTitle.Text;
  book.Price = Int32.Parse(txtPrice.Text);
  book.Publish = txtPublish.Text;
  book.Published = DateTime.Parse(txtPublished.Text);

  // 매핑 파일로부터 해당하는 퀘리를 취득하여,

  // Book 오브젝트의 내용을 할당하고 나서 발행
  Mapper.Instance().Insert("setBookInfo", book);
}

</script>
<html>
<head>
<title>iBATIS.NET에 의한 데이터 등록</title>
</head>
<body>
<form runat="Server">
  <table border="0">
    <tr>
      <th align="right">ISBN 코드:</th>
      <td><asp:TextBox id="txtIsbn"
            runat="Server" Columns="20" /></td>
    </tr>
    <tr>
      <th align="right">서명:</th>
      <td><asp:TextBox id="txtTitle"
            runat="Server" Columns="40" /></td>
    </tr>
    <tr>
      <th align="right">가격:</th>
      <td><asp:TextBox id="txtPrice"
            runat="Server" Columns="5" />엔</td>
    </tr>
    <tr>
      <th align="right">출판사:</th>
      <td><asp:TextBox id="txtPublish"
            runat="Server" Columns="15" /></td>
    </tr>
    <tr>
      <th align="right">발행일:</th>
      <td><asp:TextBox id="txtPublished"
            runat="Server" Columns="15" /></td>
    </tr>
    <tr>
      <td colspan="2">
        <asp:Button id="btnSubmit" runat="Server"
          Text="등록" OnClick="btnSubmit_Click" />
      </td>
    </tr>
  </table>
</form>
</body>
</html>
<%@ Page ContentType="text/html" Language="VB" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="IBatisNet.DataMapper" %>
<%@ Import Namespace="Com.Msn.Wings" %>
<script runat="Server">

' [등록]버튼을 클릭하면 실행
Public Sub btnSubmit_Click(sender As Object, e As EventArgs)

  ' Book 오브젝트의 각 속성에 입력된 값을 세트
  Dim book As New Book()
  book.Isbn = txtIsbn.Text
  book.Title = txtTitle.Text
  book.Price = Int32.Parse(txtPrice.Text)
  book.Publish = txtPublish.Text
  book.Published = DateTime.Parse(txtPublished.Text)

  '매핑 파일로부터 해당하는 퀘리를 취득하여,
  ' Book 오브젝트의 내용을 할당하고 나서 발행
  Mapper.Instance().Insert("setBookInfo", book)
End Sub

</script>
<html>
<head>
<title>iBATIS.NET에 의한 데이터 등록</title>
</head>
<body>
<form runat="Server">
  <table border="0">
    <tr>
      <th align="right">ISBN 코드:</th>
      <td><asp:TextBox id="txtIsbn"
            runat="Server" Columns="20" /></td>
    </tr>
    <tr>
      <th align="right">서명:</th>
      <td><asp:TextBox id="txtTitle"
            runat="Server" Columns="40" /></td>
    </tr>
    <tr>
      <th align="right">가격:</th>
      <td><asp:TextBox id="txtPrice"
            runat="Server" Columns="5" />엔</td>
    </tr>
    <tr>
      <th align="right">출판사:</th>
      <td><asp:TextBox id="txtPublish"
            runat="Server" Columns="15" /></td>
    </tr>
    <tr>
      <th align="right">발행일:</th>
      <td><asp:TextBox id="txtPublished"
            runat="Server" Columns="15" /></td>
    </tr>
    <tr>
      <td colspan="2">
        <asp:Button id="btnSubmit" runat="Server"
          Text="등록" OnClick="btnSubmit_Click" />
      </td>
    </tr>
  </table>
</form>
</body>
</html>
iBATIS.NET를 이용하여 데이터 등록을 실시하는 샘플 프로그램
(위:C#판 「ibatis_input_cs.aspx」,
아래:VB.NET판 「ibatis_input_vb.aspx」)


  데이터의 등록을 실시하려면, 미리 영속화 클래스 Book의 대응하는 각 속성에 입력값을 세트해 두고, 이것을 SqlMapper 오브젝트의 Insert 메소드로 세트하기만 하면 된다. 앞에서 서술한 것처럼, 이것에 의해 Book 오브젝트의 각 속성 값이 자동으로 대응하는 플레이스 홀더에 세트된다.

 검색 처리의 경우와 같이, 코드측에서는 SQL을 전혀 의식하지 않고 오브젝트의 조작만으로 데이터의 조작이 가능해지는 것을 알 수 있을 것이다.

 이상을 이해했다면, 즉시 샘플을 실행해 보자. 지난 NHibernate편의 데이터 등록 프로그램의 예와 같이, 입력된 서적 정보가 데이터베이스에 반영되어 있으면 성공이다.

 참고로, 갱신이나 삭제 처리를 실시하는 경우도 Insert 메소드를 Update/Delete 메소드에 옮겨놓기만 하면, 그 다음은 거의 같은 요령으로 실시할 수 있다. 특별히 주의해야 할 점은 없기 때문에 본문에서는 생략하지만, 여유가 된다면 꼭 자신의 환경에서 테스트 해보자.

 이상, 2회에 걸쳐 .NET Framework 환경에서 이용할 수 있는 O/R 매핑 툴로서 대표적인 NHibernate와 iBATIS.NET이라고 하는 2개의 오픈 소스 제품에 대해 해설해 왔다.

 본 특집은 도입 기사이고, 물론 각각의 툴은 모두 많은 기능을 제공하고 있다. 관심이 있다면 꼭 이하의 문서를 읽어볼 것을 추천한다.

제품명 문서
NHibernate NHibernate Documentation
HIBERNATE - Relational Persistence for Idiomatic Java(일본어)
iBASIS.NET iBATIS Downloads
iBASIS.NET 레퍼런스 매뉴얼
 
NHibernate, iBATIS.NET의 온라인 참고 자료


  NHibernate의 개요를 이해하는데 있어서 충분히 참고가 될 것이다. 본문과 병행하여 활용하길 바란다.

반응형
Posted by 친절한 웬디양~ㅎㅎ
|