데이터 컨테이너(data container)란 단어 그대로 데이터를 담고 있는 용도의 타입을 의미한다.
이 타입은 여러분이 직접 만들 수도 있고, 닷넷에서 제공되는 타입을 사용할 수도 있다.
데이터 컨테이너로서 “단순한 유형의 닷넷 클래스(POCO: Plain Old CLR Object)”를 사용할 수 있다.
데이터베이스에서 정의하는 테이블은 칼럼의 집합에 불과하기 때문에 이를 닷넷 클래스로 표현하는
방법은 매우 쉽다. 예를 들어, MemberInfo 테이블에 해당하는 데이터 컨테이너를 POCO로 정의하면
다음과 같다.
public class MemberInfo
{
public string Name;
public DateTime Birth;
public string Email;
public byte Family;
}
이를 기반으로 CRUD를 수행하는 데이터베이스 조작 클래스를 만들어 보자.
POCO와 대응되는 MemberInfoDAC
public class MemberInfo
{
public string Name;
public DateTime Birth;
public string Email;
public byte Family;
}
public class MemberInfoDAC
{
SqlConnection _sqlCon;
public MemberInfoDAC(SqlConnection sqlCon)
{
_sqlCon = sqlCon;
}
void FillParameters(SqlCommand cmd, MemberInfo item)
{
SqlParameter paramName = new SqlParameter("@Name", System.Data.SqlDbType.NVarChar, 20);
paramName.Value = item.Name;
SqlParameter paramBirth = new SqlParameter("@Birth", System.Data.SqlDbType.Date);
paramBirth.Value = item.Birth;
SqlParameter paramEmail = new SqlParameter("@Email", System.Data.SqlDbType.NVarChar, 100);
paramEmail.Value = item.Email;
SqlParameter paramFamily = new SqlParameter("@Family", System.Data.SqlDbType.TinyInt);
paramFamily.Value = item.Family;
cmd.Parameters.Add(paramName);
cmd.Parameters.Add(paramBirth);
cmd.Parameters.Add(paramEmail);
cmd.Parameters.Add(paramFamily);
}
public void Insert(MemberInfo item)
{
string txt = "INSERT INTO MemberInfo(Name, Birth, Email, Family) " +
" VALUES (@Name, @Birth, @Email, @Family)";
SqlCommand cmd = new SqlCommand(txt, _sqlCon);
FillParameters(cmd, item);
cmd.ExecuteNonQuery();
}
public void Update(MemberInfo item)
{
string txt = "UPDATE MemberInfo SET Name=@Name, Birth=@Birth, Family=@Family WHERE" +
" Email=@Email";
SqlCommand cmd = new SqlCommand(txt, _sqlCon);
FillParameters(cmd, item);
cmd.ExecuteNonQuery();
}
public void Delete(MemberInfo item)
{
string txt = "DELETE FROM MemberInfo WHERE Email=@Email";
SqlCommand cmd = new SqlCommand(txt, _sqlCon);
FillParameters(cmd, item);
cmd.ExecuteNonQuery();
}
public MemberInfo[] SelectAll()
{
string txt = "SELECT * FROM MemberInfo";
ArrayList list = new ArrayList();
SqlCommand cmd = new SqlCommand(txt, _sqlCon);
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
MemberInfo item = new MemberInfo();
item.Name = reader.GetString(0);
item.Birth = reader.GetDateTime(1);
item.Email = reader.GetString(2);
item.Family = reader.GetByte(3);
list.Add(item);
}
}
return list.ToArray(typeof(MemberInfo)) as MemberInfo[];
}
}
MemberInfoDac 타입은 일반 닷넷 클래스로 정의된 MemberInfo 타입을 기반으로 데이터베이스
테이블에 CRUD 연산을 모두 수행한다. 이렇게 정의된 데이터 컨테이너 타입과 그에 따른
DAC(Data Access Component) 클래스를 이용하면 매우 쉽게 데이터베이스와 연동할 수 있다.
static void Main(string[] args)
{
string connectionString = ConfigurationManager.ConnectionStrings["TestDB"].ConnectionString;
MemberInfo item = new MemberInfo();
item.Name = "Jennifer";
item.Birth = new DateTime(1985, 5, 6);
item.Email = "[email protected]";
item.Family = 0;
using (SqlConnection sqlCon = new SqlConnection(connectionString))
{
sqlCon.Open();
MemberInfoDAC dac = new MemberInfoDAC(sqlCon);
dac.Insert(item); // 신규 데이터를 추가하고
item.Name = "Jenny";
dac.Update(item); // 데이터 내용을 업데이트하고
MemberInfo[] list = dac.SelectAll(); // 데이터를 조회하고
foreach (MemberInfo member in list)
{
Console.WriteLine(member.Email);
}
dac.Delete(item); // 데이터를 삭제한다.
}
}