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 클래스를 살펴 보겠습니다

Break Point - 코드로

.Net 2009. 11. 10. 16:57 posted by 무명시인
사용자 삽입 이미지

Visual Studio 디버깅을 해보자 Part 02

.Net 2009. 10. 14. 09:55 posted by 무명시인

삘 받아서쓰는 초간단 강좌..

강좌라 하기도 머하지만요..

이번엔 디버깅하기 편하고..

여러 닷넷 개발자분들도 사용하는 방법으로..

프로세스에 연결해서 하는 디버깅방법을 알아보겠습니다..

그냥 바로 화면으로 ..


사용자 삽입 이미지

cs 화면에서 브뤡 뽀인트를 설정합니다..

단축키는 "F9" ..

이것도 귀찬다 하면..

왼쪽의 여백을 클릭!!

사용자 삽입 이미지

그리고 브라우져에서 보기..



사용자 삽입 이미지

브라우져 실행 화면


사용자 삽입 이미지

여기서 다시 Visual Studio 로 돌아와서..

디버그 > 프로세스연결을 클릭 합니다..


사용자 삽입 이미지

aspner_wp.exe    ----->iis asp.net

explore.exe         -----> 브라우져

Webdevwebserver.. ----> vs 에서 지원하는 가상서버

이렇게 세가지 프로세스를 선택하고 연결 클릭

사용자 삽입 이미지

그리고 이벤트를 발생하면 브렉뽀인트 설정한 부분에서 값을 확인

사용자 삽입 이미지

참고로 단축키 많이 사용하는게..

F5 와 F10 ..

궁금하시면 직접 고고

Visual Studio 디버깅을 해보자 Part 01

.Net 2009. 10. 14. 09:30 posted by 무명시인
Visual Studio 에서 디버깅하는것을 알아보겠습니다..

머 방법이워낙 다양해서..

그냥 필자가 주로 사용하는 방법을 위주로 적어 보겠습니다..

개발자이지만 한글타이핑을 길게 하는것을 별로.. 그리...썩.. 좋아하지 않아서요..

당연히 다른 아티클들 처럼 캡춰 화면 + 설명으로 하겠습니다..


사용자 삽입 이미지
웹사이트이던...

dll 을 만들어낼 프로젝이던간에..

모드 "프로젝트" 기준입니다..

고로..오른쪽 버튼 메뉴에서 "시작 프로젝트"로 설정을 할 수가 있지요..

시작프로젝트로 설정을 한다음...

사용자 삽입 이미지
그냥 F5 를 꾹 누르시면 됩니다..

당연히 브뤡 뽀인드를 잡아야 하겠죠;;

더 자세히 디버깅을 하기 위해서..

다음 편에..

투비 껀띠뉴~~

2차 도메인이 같은 사이트들끼리의 SSO 문제

.Net 2009. 10. 13. 08:38 posted by 무명시인

메소드 실행시간 확인

.Net 2009. 10. 6. 09:40 posted by 무명시인
System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
watch.Start();

// something doing

watch.Stop();
Response.Write(watch.Elapsed.ToString());

Form 요소에서 컨트롤 찾가

.Net 2009. 9. 15. 11:11 posted by 무명시인

if (this.Form.HasControls())
{
 Response.Write("HasControls ; " + this.Form.Controls.Count + "
"); Response.Write("
"); for (int i = 0; i < this.Form.Controls.Count; i++) { Control ctl = this.Form.Controls[i]; Response.Write(i.ToString() + " ; " + ctl.GetType() + " -> clientid : " + ctl.ClientID + "
"); } } else { Response.Write("No HasControls"); }

---------------------------------------------------------------------------------------
 Trace = true 로 설정후 확인한다.

ClickOnce - IIS Mime Type

.Net 2009. 7. 23. 11:17 posted by 무명시인
http://blog.naver.com/newleader88?Redirect=Log&logNo=90022427558

iis > Http 헤더 > MimeType >

연결된 확장명         : “.application” 와  “.manifest” 

컨텐트 형식 (mime)  : “application/x-ms-application”

추가한다..


ClickOnce 베포시 iis 설정관련한 부분이다.

빌드시 사용자 지정 경고를 보여준다.

.Net 2009. 7. 15. 09:52 posted by 무명시인
//빌드시 경고를 보여준다.
#warning 가나다라


사용자 삽입 이미지


--> 오류창의 모습


사용자 삽입 이미지


--> 출력창의 모습