[C# 스터디 - Day1] DBHelper 작성하기

2020. 12. 24. 00:06언어/C#. JAVA

반응형

1. DB Connection

DB ConnectionString 작성할 때, SqlConnectionStringBuilder 클래스를 사용하면 연결문자열의 내용을

손쉽게 만들 수 있다. (가독성 )

 

🔸 일반적인 방식

    - Data Source, InitialCatalog, UserID, Password 등을 변수로 넘겨줘서 문자열을 붙여주거나 하드코딩

string ConnectionString = @"Data Source=14.43.254.50;Initial Catalog=RUBY_DEV;User id=sa;Password=1234;" 

 

🔸 SqlConnectionStringBuilder 사용

    - ConnectionString 프로퍼티 또는 ToString() 메서드를 사용하면 문자열을 연결해 ConnectionString을 만들어준다.

    - key,value 쌍에 대한 유효성을 검사하기 때문에 잘못된 문자열을 만들 수 없고, 잘못된 문자열을 포함한 경우 throws Exception 처리한다. 

SqlConnectionStringBuilder connBuilder = new SqlConnectionStringBuilder();
connBuilder.Add("Data Source",   	"14.43.254.50");
connBuilder.Add("Initial Catalog", 	"RUBY_DEV");
connBuilder.Add("User Id",  		"sa");
connBuilder.Add("Password", 		"1234");

this.ConnectionString = connBuilder.ConnectionString; // 또는 connBuilder.ToString(); 

 

 

2. SqlParameter 파라미터 처리

🔸 SqlParameter가 여러 개면 어떻게 처리하는게 효율적일까  

 

    1) Parameters를 배열로 처리

        ➡Parameter가 늘어날 때마다 new SqlParameter("param_name", "param_val") 추가

DataTable resultTable = this.helper.FillTable
(@"SELECT * FROM TB_USERS WHERE USE_YN = @V_USE_YN"
 , CommandType.Text
 , new SqlParameter[] { new SqlParameter("V_USE_YN", "Y") });

 

    2) Collection처럼 만들어서 처리

        ➡Parameter가 늘어나면 parameters.AddParameter("param_name", "param_val"); 추가

          코드작성 시 깔끔하고 사용하기 편하다.

SqlParameterList parameters = new SqlParameterList();
parameters.AddParameter("V_USE_YN", "Y");

DataTable resultTable = this.helper.FillTable
(@"SELECT * FROM TB_USERS WHERE USE_YN = @V_USE_YN"
 , CommandType.Text
 , parameters);

this.dataGridView1.DataSource = resultTable;

 

추가로 SqlParameterList 클래스는 IEnumerable<SqlParameter> 인터페이스를 상속받아야 하는데 

그 이유는 foreach문을 활용하기 위해서다. (상속 안받으면 foreach구문 사용 안됨.)

 

자세한 내용

더보기

임의의 클래스가 IEnumerable을 상속받게 되면 IEnumerable가 클래스의 내부데이터에 대한 순방향의 접근성을 가질 수 있게 된다. 

foreach문은 반복문으로 처음부터 해당 객체의 끝까지 순회하는 구문이다.

멤버들을 순서대로 순회가능하며 배열이나 컬렉션처럼 정보의 집합을 관리하는 클래스에 순회기능을 제공한다

 

public class SqlParameterList : IEnumerable<SqlParameter>
{
	// 생략
}

public DataTable FillTable(string commandText, CommandType commandType, SqlParameterList parameters)
{
	// 생략 
    
	// add parameters
	if (parameters != null)
	{
	    foreach (SqlParameter parameter in parameters)
	    {
	        command.Parameters.Add(parameter);
	    }
	}
}            

 

3. SqlConnection & SqlCommand 클래스 사용

 

SqlConnection 클래스와 SqlCommand 클래스를 다음과 같이 사용 할 수 있다.

private SqlConnection CreateConnection()
{
    return new SqlConnection(this.ConnectionString);
}
private SqlCommand CreateCommand()
{
    return new SqlCommand();
}

// 호출해서 사용
SqlConnection connection = this.CreateConnection();
SqlCommand command = this.CreateCommand();


//SqlConnection connection = new SqlConnection(this.ConnectionString)
//SqlCommand command = new SqlCommand();

 

생성자 호출을 메서드로 빼서 사용하면

여러 데이터베이스의 DBHelper 클래스를 만들게 될 때 수정할 코드가 줄어든다. (copy & paste 쉬워짐)

 

예) OracleDBHelper 클래스를 추가하게 되었다.

    CreateConnection()의 SqlConnection ➡ OracleConnection

    CreateCommand() 의 SqlCommand   OracleCommand

    return타입, return값만 변경해주면 된다.

   

    반면에 메서드로 빼지 않았다면

    일일이 SqlConnection, SqlCommand가 사용된 곳을 모두 수정해줘야하는 번거로움이 발생한다.

 

 

반응형