GetDataTable

GetDataTable은 각종 데이터베이스로부터 쿼리 혹은 프로시저를 통해서 검색된 결과를 System.Data.DataTable로 반환해주는 함수입니다.
상세한 함수 코드를 살펴볼까요?
/// <summary>
/// [SQL Server] 데이터테이블 반환(프로시저)
/// </summary>
/// <param name="param">첫 번째 인자는 프로시저명, 두 번째부터는 파라미터들</param>
/// <returns>데이터테이블</returns>
public DataTable GetDataTable(params object[] param)
{
	// SQL Server용 DataTable 반환 함수입니다.
	// 프로시저 전용이므로, ad-hoc 쿼리를 이용하실 수는 없습니다.
}


/// <summary>
/// [SQL Server] 데이터테이블 반환(Ad-hoc 쿼리) 
/// </summary>
/// <param name="_strQuery">Ad-hoc 쿼리문</param>
/// <returns>데이터테이블</returns>
public DataTable GetDataTable(string _strQuery)
{
	// SQL Server용 DataTable 반환 함수입니다.
	// ad-hoc 쿼리 전용이므로, 프로시저도 이용하실 수 있지만 권장하지는 않습니다.
}


/// <summary>
/// [Oracle] 데이터테이블 반환(프로시저)
/// </summary>
/// <param name="_strProcedureName">프로시저명</param>
/// <param name="_inputParams">Input 파라미터 </param>
/// <param name="_outputParams">Output 파라미터 </param>
/// <returns>데이터테이블</returns>
public DataTable GetDataTable(string _strProcedureName, Dictionary<object, object> _inputParams, params string[] _outputParams)
{
	// Oracle용 DataTable 반환 함수입니다.
	// 프로시저 전용이므로, ad-hoc 쿼리를 이용하실 수는 없습니다.
}


/// <summary>
/// [Oracle] 데이터테이블 반환(Ad-hoc 쿼리) 
/// </summary>
/// <param name="_strQuery">Ad-hoc 쿼리문</param>
/// <returns>데이터테이블</returns>
public DataTable GetDataTable(string _strQuery)
{
	// Oracle용 DataTable 반환 함수입니다.
	// ad-hoc 쿼리 전용이므로, 프로시저도 이용하실 수 있지만 권장하지는 않습니다.
}


자, 그럼 먼저 SQL Server 샘플 페이지를 한 번 보실까요?
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="GetDataTable.aspx.cs" Inherits="BANANA.Web.Framework.Test.jmson.GetDataTable" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
	<title>GetDataTable</title>
</head>
<body>
	<form id="form1" runat="server">
		<asp:GridView ID="GridView1" runat="server" />
	</form>
</body>
</html>
간단하게 GridView 하나만 올려놓은 웹 페이지입니다.
WSP_Employees_R1라는 프로시저를 이용해서, 그리드에 데이터를 채워 넣어 보도록 하겠습니다.
그럼, C# 코드를 한 번 살펴 보시죠.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using System.Data;

namespace BANANA.Web.Framework.Test.jmson
{
	public partial class GetDataTable : BANANA.Web.BasePage
	{
		protected void Page_Load(object sender, EventArgs e)
		{
			if (!IsPostBack)
			{
				try
				{
					DataTable _dt = base.GetDataTable(
						"WSP_Employees_R1"	// 첫 번째 파라미터는 프로시저 명을 입력해 주세요.
						, "King"		// 두번째 부터는 프로시저에 전달할 변수를 입력하시면 됩니다.
						);
					GridView1.DataSource = _dt;
					GridView1.DataBind();
				}
				catch (Exception err)
				{
					// err.HelpLink에는 프로시저 실행구문이 있습니다.
					// SQL Profiler를 실행하지 않아도, 사용자가 실행한 프로시저 및 전달 변수들을 확인하실 수 있습니다.
					MessageBox.Show(err.HelpLink + "<br />" + err.Message
						, "데이터베이스 오류"
						, MessageBox.MessageBoxType.Alert
						, MessageBox.MessageBoxIcon.Error
						);
				}
			}
		}
	}
}
프로시저가 궁금하시나요?
아래에 있습니다.
CREATE PROC WSP_Employees_R1
(
	@LastName		NVARCHAR(20)
)
AS
	SELECT	*
	FROM	dbo.Employees
	WHERE	LastName		LIKE '%' + @LastName + '%'
생각보다 간단하죠?

자, 그럼 이번에는 동일한 기능을 ad-hoc 쿼리를 이용해서 구현해 보도록 하겠습니다.
마찬가지로 SQL Server용입니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using System.Data;

namespace BANANA.Web.Framework.Test.jmson
{
	public partial class GetDataTable : BANANA.Web.BasePage
	{
		protected void Page_Load(object sender, EventArgs e)
		{
			if (!IsPostBack)
			{
				try
				{
					string _strLastName = "King";
					DataTable _dt = base.GetDataTable(
						"SELECT * FROM Northwind.dbo.Employees WHERE LastName LIKE '%" + _strLastName + "%'"
						);
					GridView1.DataSource = _dt;
					GridView1.DataBind();
				}
				catch (Exception err)
				{
					MessageBox.Show(err.Message
						, "데이터베이스 오류"
						, MessageBox.MessageBoxType.Alert
						, MessageBox.MessageBoxIcon.Error
						);
				}
			}
		}
	}
}
네, 그렇습니다.
그냥 일반 쿼리문을 하나의 string으로 만들어서 전달하면 됩니다.


그럼, 이번에는 Oracle용 함수를 한 번 써볼까요?
C#에서 Oracle로 연결을 구성하기 위해서는 ODAC 11.2 Release 5 (11.2.0.3.20) with Oracle Developer Tools for Visual Studio가 필요합니다.
아래 경로에서 다운 받으실 수 있습니다.
http://www.oracle.com/technetwork/database/windows/downloads/index-101290.html
아래는 Oracle 패키지 및 프로시저 개발에 도움이 되는 문서입니다.
http://msdn.microsoft.com/en-us/library/ms971506.aspx
먼저 Oracle 패키지 및 저장 프로시저를 한 번 살펴보겠습니다.
-- Package Spec 정의
CREATE OR REPLACE PACKAGE PKG_EMPLOYEES AS
TYPE T_CURSOR IS REF CURSOR;
PROCEDURE WSP_EMPLOYEES_R1
(
    I_LASTNAME      IN  VARCHAR2
    , I_EMPLOYEEID  IN  NUMBER
    , O_EMPLOYEES   OUT T_CURSOR
);

END PKG_EMPLOYEES;
-- Package Body 정의
CREATE OR REPLACE PACKAGE BODY PKG_EMPLOYEES AS
PROCEDURE WSP_EMPLOYEES_R1
(
    I_LASTNAME      IN  VARCHAR2
    , I_EMPLOYEEID  IN  NUMBER
    , O_EMPLOYEES   OUT T_CURSOR
)
IS
BEGIN
    -- EMPLOYEES
    OPEN O_EMPLOYEES FOR
    SELECT  *
    FROM    EMPLOYEES
    WHERE   LASTNAME        LIKE '%'||I_LASTNAME||'%'
    AND     EMPLOYEEID      > I_EMPLOYEEID;
    
END WSP_EMPLOYEES_R1;


END PKG_EMPLOYEES;
EMPLOYEES 테이블에서 데이터를 조회해 오는 간단한 프로시저를 패키지로 작성하였습니다.


이제 C# 코드를 한 번 살펴보겠습니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using System.Data;

namespace BANANA.Web.Framework.Test.jmson
{
	public partial class GetDataTable : BANANA.Web.BasePage
	{
		protected void Page_Load(object sender, EventArgs e)
		{
			if (!IsPostBack)
			{
				try
				{
					// 우선 Input 파라미터를 Dictionary 개체로 정의합니다.
					// 프로시저에서 정의한 순서대로 Dictionary 개체에 추가해 주는 것을 잊지 마세요.
					// 순서가 뒤바뀌면, 오류가 발생합니다.
					Dictionary<object, object> dic = new Dictionary<object, object>();
					dic.Add("I_LASTNAME", "King");
					dic.Add("I_EMPLOYEEID", 2);

					DataTable _dt = base.GetDataTable(
						"PKG_EMPLOYEES.WSP_EMPLOYEES_R1"// 프로시저명에는 [패키지명.프로시저명]의 형식으로 입력해 주세요.
						, dic				// Input 파라미터가 담겨져 있는 Dictionary 개체를 전달합니다.
						, "O_EMPLOYEES"			// Output 파라미터 커서명을 입력합니다.
						);
					GridView1.DataSource = _dt;
					GridView1.DataBind();
				}
				catch (Exception err)
				{
					MessageBox.Show(err.Message
						, "데이터베이스 오류"
						, MessageBox.MessageBoxType.Alert
						, MessageBox.MessageBoxIcon.Error
						);
				}
			}
		}
	}
}
SQL Server 보다는 코드가 조금 늘어났습니다.


다음은 ad-hoc 쿼리를 이용해서 데이터테이블을 반환하는 방법을 확인하겠습니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using System.Data;

namespace BANANA.Web.Framework.Test.jmson
{
	public partial class GetDataTable : BANANA.Web.BasePage
	{
		protected void Page_Load(object sender, EventArgs e)
		{
			if (!IsPostBack)
			{
				try
				{
					DataTable _dt = base.GetDataTable(
						"SELECT * FROM EMPLOYEES;"	// 쿼리를 하나의 string으로 입력해 주시면 됩니다.
						);
					GridView1.DataSource = _dt;
					GridView1.DataBind();
				}
				catch (Exception err)
				{
					MessageBox.Show(err.Message
						, "데이터베이스 오류"
						, MessageBox.MessageBoxType.Alert
						, MessageBox.MessageBoxIcon.Error
						);
				}
			}
		}
	}
}


이상으로 GetDataTable 함수를 이용해서, DataTable을 반환해 오는 방법을 설명 드렸습니다.

TOP