SqlHelper Class 소스코드 + 샘플예제

.Net 2009. 12. 3. 11:01 posted by 무명시인
SqlHerlp 관련한 포스팅의 소스코드와 샘플예제 입니다..

허접하지만..

그냥 간단하게 사용할만 합니다.





SqlHelper Class + SqlPrmCollection - 파라미터컬렉션

.Net 2009. 11. 27. 10:56 posted by 무명시인

시작하기


그럼 전편 강좌에서 사용한 SqlPrmCollection 클래스에 관해 알아보도록 하겠습니다..

.net framework 2.x 부터 도입된 제넥릭과 컬렉션 개념이 조금 들어가는데요..

그럼 하나씩 알아보도록 하겠습니다..

1. 시작하기

사용자 삽입 이미지


역시 그리 복잡한 구조는 아닌 클래스가 되겠습니다.

List<object> 등의 필드 멤버와 인덱서

생성자와 override 된 메소드

IEnumerable 인터페이스를 상속받아 구현된 멤버 GetEnumerator()

등으로 구성되겠습니다.

2. 필드멤버와 인덱서, 생성자

/// 
/// List<object> for container
/// 
private List<object> list;

/// 
/// total count
/// 
public int Count { get { return this.list.Count; } }

/// 
/// indexer
/// 
/// 
/// 
public SqlParameter this[int index] { get { return (SqlParameter)this.list[index]; } }

/// 
/// creator
/// 
public SqlPrmCollection()
{
	list = new List<object>();
}


List<object> 에 SqlParameter 를 담는 구조로 갈것입니다.

그래서 필드 멤버로 List<object> 를 정의 하고요..

컬렉션을 해체할때..

내용물의 갯수를 확일할 수 있는 속성(count)와..

인덱스로 접근할 수 있는 인덱서를 정의 합니다..

뒷부분에 Add 메소드를 정의할때 자세히 코드를 보시면 알듯합니다..



3. IEnumerable.GetEnumerator()

/// 
/// 개체의 열거자를 반환
/// 
/// IEnumerator
public IEnumerator GetEnumerator()
{
	return this.list.GetEnumerator();
}


IEnumerable의 멤버를 구현합니다..

컬렉션을 해체할때..

GetEnumerator() 메소드를 호충하여..

내용물을 해체 합니다..

4. Add

/// 
/// List<object> 에 SqlParameter 개체를 추가 한다.
/// 
/// ParameterName
/// Value
public void Add(string name, object value)
{
	SqlParameter prm = new SqlParameter();

	prm.ParameterName = name;
	prm.Value = value;

	this.list.Add(prm);
}

/// 
/// List<object> 에 SqlParameter 개체를 추가 한다.
/// 
/// ParameterName
/// SqlDbType
/// Size
/// Value
public void Add(string name, SqlDbType type, int size, object value)
{
	SqlParameter prm = new SqlParameter();

	prm.ParameterName = name;
	prm.SqlDbType = type;
	prm.Size = size;
	prm.Value = value;

	this.list.Add(prm);
}

/// 
/// List<object> 에 SqlParameter 개체를 추가 한다.
/// 
/// ParameterName
/// SqlDbType
/// Size
/// Direction
public void Add(string name, SqlDbType type, int size, ParameterDirection direction)
{
	SqlParameter prm = new SqlParameter();

	prm.ParameterName = name;
	prm.SqlDbType = type;
	prm.Size = size;
	prm.Direction = direction;

	this.list.Add(prm);
}

/// 
/// List<object> 에 SqlParameter 개체를 추가 한다.
/// 
/// ParameterName
/// SqlDbType
/// Size
/// Direction
/// Value
public void Add(string name, SqlDbType type, int size, ParameterDirection direction, object value)
{
	SqlParameter prm = new SqlParameter();

	prm.ParameterName = name;
	prm.SqlDbType = type;
	prm.Size = size;
	prm.Direction = direction;
	prm.Value = value;

	this.list.Add(prm);
}

사용자 삽입 이미지


List<object> 에 SqlParameter 개체를 담습니다..

각 목적에 따라 메소드를 override 했는데요..

아웃풋 파라미터의 목적이나, 파라미터의 타입, 사이즈를 지정합니다.



4. Clear

/// 
/// Collection 의 내용을 모두 삭제 합니다.
/// 
public void Clear()
{
	this.list.Clear();
} 


컬렉션의 내용을 모두 삭제합니다.

왜 만들었는지 이유가..

기억이 나질 않습니다..ㅡㅡ;;;

5. 마무리

대략적으로 두 아티클을 통해서..

SqlHelper 클래스를 만들어 보았는데요..

우선 아쉬운 부분은 Transaction 이 빠졌다는 것입니다...

아 아쉽습니다..

이 부분은 차후 포스팅을 하기로 하구요..

그럼 이만 마치겠습니다.

소스는 좀 정리를 마치고 예제와 함께 올리도록 하겠습니다..

SqlHelper Class

.Net 2009. 11. 27. 10:22 posted by 무명시인

시작하기


Microsoft Application Blocks for .NET

http://msdn.microsoft.com/ko-kr/library/ms954827.aspx

이런 것이 언젠가..

ms 에서 공개한적이 있습니다..

데이타 베이스 코드를 재사용이 가능하게 클래스화 하고..

랩핑(wrapping)하고 머 등등 이런 예기를 했지요..

그래서..!!

오늘은 다짜고짜 SqlHelper 를 만들어 보겠습니다..

왜 뜬금없는 SqlHelper 냐!!

아무 이유 없습니다.. 그냥 입니다 ^^;;

상용 Framework 들을 살펴 보면..

가장중요시 생각되는 기능이 DataBase 핸들링 코드와 Transaction 입니다..

머 귀찬에 이런걸 따로 만드냐..

Ado.Net 구문을 그냥 Copy & Paste 해서 사용하면 되지 않는냐..

하고 생각 하시는 분들은 ..흠흠 할말이 없습니다..

이런 식으로 하는 이유는..

비밀입니다.. 절대 몰라서 말하지 않는것은 아닙니다..^^;;

http://www.theonetech.co.kr/TheOne/sub0502.aspx

사용자 삽입 이미지


우리나라에서 가장널리 사용되는 .net 진영의 Framework 는

드원의 neodeex 가 아닌가 합니다..사용해보니 좋더군요..

그래서 이를 참조해서 씸플하게 만들어 보았습니다..

구성은 데이타를 핸들링하는 SqlHelper 클래스와 파라미터를 랩핑(Wrapping)하는 파라미터컬렉션(SqlPrmCollection)클래스로 나누어집니다..

먼저 SqlHelper 클래를 보시면..

IDisposable 인터페이스를 상속 받는 구조로 되어있습니다..

이 인터페이스에 대한 설명은 다음 링크의 강좌를 살펴보시구요..

필자는 그리 친절하지가 않아서요..(죄송합니다)

1. 시작하기

크게..데이타 연동을 할때 필요한..

SqlConnection, SqlCommand, SqlDataAdapter, DataSet 등의 대체를 멤버변수로 사용하구요..

동작 메소드로는

쿼리를 실행하고 DataSet 를 반환하는 ExecuteDataSet

쿼리를 실행하고 반영된 Row수를 반환하는 ExecuteNonQuery

쿼리를 실행하고 단일값(object)을 반환하는 ExecuteScalar

로 구성되어 집니다..

그리고 IDisposable 인터페이스를 상속받아

인터페이스멤버인 Dispose 메소드를 작성합니다..



2. 필드 멤버

/// 
/// member connection string
/// 	
public string connectionstring { get; set; }

/// 
/// member SqlConnection
/// 
private SqlConnection con;

/// 
/// member SqlCommand
/// 
private SqlCommand cmd;

/// 
/// member SqlDataAdapter
/// 
private SqlDataAdapter da;

/// 
/// member DataSet
/// 
private DataSet ds;


먼저 멤버 변수들을 지정합니다.. ado.net 에서 사용될 클래스의 인스턴스들과 DataSet, connectionstring 들이 보입니다..


3. 생성자

public SqlHelper()
{
	this.connectionstring = "server=localhost;database=test;uid=sa;pwd=1234;";
}

public SqlHelper(string connectionString)
{
	this.connectionstring = connectionString;
} 


생성자 입니다..

생성자를 두개로 나눈이유는..

connectionstrig 을 지정해야할 필요가 있다면 지정을하고..

아니라면 고정값으로 사용하고..

머 등등의 이유에서 이지요..



4. IDisposable.Dispose()

public void Dispose()
{
	if (con != null) con.Dispose();
	if (cmd != null) cmd.Dispose();
	if (da != null) da.Dispose();
	if (ds != null) ds.Dispose();
}



그리고 IDisposable 인터 페이스를 상속받에 구현해야할 dispose 메소드를 구현합니다..

이미 생성된 개체들을 해제(dispose) 해주는 코드들이 들어 갑니다..

5. Execute 메소드들

/// 
/// 셀렉트의 결과 집합을 반환한다.
/// 
/// 
/// 
/// 
/// DataSet
public DataSet ExecuteDataSet(string query, SqlPrmCollection param, CommandType cmdType)
{
	using (con = new SqlConnection(connectionstring))
	{
		cmd = new SqlCommand(query, con);
		cmd.CommandType = cmdType;

		da = new SqlDataAdapter(cmd);
		ds = new DataSet();

		if (param != null && param.Count > 0)
		{
			IEnumerator ie = param.GetEnumerator();
			while (ie.MoveNext()) cmd.Parameters.Add((SqlParameter)ie.Current);
		}

		con.Open();
		da.Fill(ds);
	}

	return ds;
}


쿼리를 실행하고 DataSet 를 반환하는 메소드 입니다..

익숙한 코드들이 보입니다..

그렇습니다.. msdn 에서 제공하는 기본적인 DataSet 반환 구문입니다..

여기서 추가적인 설명이 필요한 부분은 DataSet 개체를 만들고..

파라미터를 해체(?) 하는 코드 부분인거 같은데요..

다음 아티클에서 설명 할 SqlPrmCollection 컬렉션에 담긴 파라미터를 추출해서..

SqlCommand 의 파라미터에 더하기(Add) 하는 코드 입니다.



/// 
/// 쿼리문 혹은 SP 실행후 반영된 row 수 반환
/// 
/// 
/// 
/// 
/// int
public int ExecuteNonQuery(string query, SqlPrmCollection param, CommandType cmdType)
{
	int iRe = 0;

	using (con = new SqlConnection(connectionstring))
	{
		cmd = new SqlCommand(query, con);
		cmd.CommandType = cmdType;

		if (param != null && param.Count > 0)
		{
			IEnumerator ie = param.GetEnumerator();
			while (ie.MoveNext()) cmd.Parameters.Add((SqlParameter)ie.Current);
		}

		con.Open();
		iRe = cmd.ExecuteNonQuery();
	}

	return iRe;
}


쿼리를 실행하고 반영된 Row수를 반환하는 메소드 입니다..

역시 msdn 코드와 다를것이 없습니다..

Insert 쿼리와 Update 쿼리에서 사용하시는 메소드 입니다..



/// 
/// 쿼리문 혹은 SP 실행후 단일값 반환
/// 
/// 
/// 
/// 
/// object
public object ExecuteScalar(string query, SqlPrmCollection param, CommandType cmdType)
{
	object objRe;

	using (con = new SqlConnection(connectionstring))
	{
		cmd = new SqlCommand(query, con);
		cmd.CommandType = cmdType;

		if (param != null && param.Count > 0)
		{
			IEnumerator ie = param.GetEnumerator();
			while (ie.MoveNext()) cmd.Parameters.Add((SqlParameter)ie.Current);
		}

		con.Open();
		objRe = cmd.ExecuteScalar();
	}

	return objRe;
}


쿼리를 실행하고 단일값을 반환하는 메소드 입니다..

그렇습니다..msdn 코드 입니다..



6. 끝으로

너무 간단해서 이게 동잡하는거 맞냐??

하시는 분이 있을 수도 있겠습니다만..

동작합니다..

복잡한것을 싫어하는 본인이 직접짠코드지만..

가끔 저도 제가 짠 코드를 못믿습니다만..

동작합니다..

그럼 다음편에

파라미터를 입력할때 사용할

SqlPrmCollection 클래스를 살펴 보겠습니다