C# 12편: ADO.NET으로 데이터베이스와 상호작용하기
1. ADO.NET이란?
ADO.NET은 C#에서 데이터베이스와 상호작용할 수 있도록 도와주는 데이터 액세스 기술입니다. ADO.NET을 사용하면 SQL Server, MySQL, Oracle과 같은 관계형 데이터베이스 시스템과 연동할 수 있으며, 데이터를 조회하고 조작할 수 있습니다. 주요 구성 요소로는 Connection, Command, DataReader, DataSet과 DataAdapter가 있습니다.
2. 데이터베이스 연결
데이터베이스와 연결하려면 SqlConnection 객체가 필요합니다. **연결 문자열(Connection String)**을 설정해 데이터베이스 위치, 사용자 정보 등을 입력합니다.
SQL Server 연결 예시
using System;
using System.Data.SqlClient;
class Program
{
static void Main(string[] args)
{
string connectionString = "Server=localhost;Database=SampleDB;User Id=your_username;Password=your_password;";
using (SqlConnection connection = new SqlConnection(connectionString))
{
try
{
connection.Open(); // 데이터베이스 연결 열기
Console.WriteLine("데이터베이스 연결 성공");
}
catch (Exception ex)
{
Console.WriteLine($"오류 발생: {ex.Message}");
}
}
}
}
SqlConnection을 사용해 SQL Server 데이터베이스와 연결하고, 연결이 끝나면 자동으로 자원을 해제하도록 using문을 사용했습니다.
3. SQL 명령 실행
SqlCommand 클래스를 사용해 데이터베이스에 SQL 명령을 전달합니다. 이 명령으로 데이터를 삽입, 업데이트, 삭제하거나 조회할 수 있습니다.
데이터 삽입 (INSERT) 예시
using System;
using System.Data.SqlClient;
class Program
{
static void Main(string[] args)
{
string connectionString = "Server=localhost;Database=SampleDB;User Id=your_username;Password=your_password;";
using (SqlConnection connection = new SqlConnection(connectionString))
{
try
{
connection.Open();
string query = "INSERT INTO Students (Name, Age) VALUES (@Name, @Age)";
using (SqlCommand command = new SqlCommand(query, connection))
{
command.Parameters.AddWithValue("@Name", "Alice");
command.Parameters.AddWithValue("@Age", 20);
int rowsAffected = command.ExecuteNonQuery(); // 실행 후 영향을 받은 행의 수
Console.WriteLine($"{rowsAffected}개의 행이 삽입되었습니다.");
}
}
catch (Exception ex)
{
Console.WriteLine($"오류 발생: {ex.Message}");
}
}
}
}
Parameters 속성을 사용해 파라미터로 데이터를 전달하여 SQL 인젝션 공격을 방지할 수 있습니다.
4. 데이터 조회
DataReader 객체로 데이터를 순차적으로 읽어옵니다. SqlDataReader는 데이터를 읽기 전용으로 한 번에 한 행씩 가져오는 데 적합합니다.
데이터 조회 예시
using System;
using System.Data.SqlClient;
class Program
{
static void Main(string[] args)
{
string connectionString = "Server=localhost;Database=SampleDB;User Id=your_username;Password=your_password;";
using (SqlConnection connection = new SqlConnection(connectionString))
{
try
{
connection.Open();
string query = "SELECT * FROM Students";
using (SqlCommand command = new SqlCommand(query, connection))
{
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read()) // 한 행씩 읽기
{
string name = reader["Name"].ToString();
int age = Convert.ToInt32(reader["Age"]);
Console.WriteLine($"이름: {name}, 나이: {age}");
}
}
}
}
catch (Exception ex)
{
Console.WriteLine($"오류 발생: {ex.Message}");
}
}
}
}
5. 데이터 업데이트와 삭제
데이터베이스에서 UPDATE와 DELETE 명령을 사용해 데이터를 수정하거나 삭제할 수 있습니다.
데이터 업데이트 예시
string query = "UPDATE Students SET Age = @Age WHERE Name = @Name";
using (SqlCommand command = new SqlCommand(query, connection))
{
command.Parameters.AddWithValue("@Age", 22);
command.Parameters.AddWithValue("@Name", "Alice");
int rowsAffected = command.ExecuteNonQuery();
Console.WriteLine($"{rowsAffected}개의 행이 업데이트되었습니다.");
}
데이터 삭제 예시
string query = "DELETE FROM Students WHERE Name = @Name";
using (SqlCommand command = new SqlCommand(query, connection))
{
command.Parameters.AddWithValue("@Name", "Alice");
int rowsAffected = command.ExecuteNonQuery();
Console.WriteLine($"{rowsAffected}개의 행이 삭제되었습니다.");
}
6. DataSet과 DataAdapter
DataSet은 데이터를 메모리 내에서 조작할 수 있도록 하고, DataAdapter는 데이터베이스와 DataSet 간의 연결을 담당합니다.
DataAdapter와 DataSet을 이용한 데이터 조회
using System;
using System.Data;
using System.Data.SqlClient;
class Program
{
static void Main(string[] args)
{
string connectionString = "Server=localhost;Database=SampleDB;User Id=your_username;Password=your_password;";
using (SqlConnection connection = new SqlConnection(connectionString))
{
try
{
connection.Open();
string query = "SELECT * FROM Students";
using (SqlDataAdapter adapter = new SqlDataAdapter(query, connection))
{
DataSet dataSet = new DataSet();
adapter.Fill(dataSet, "Students");
foreach (DataRow row in dataSet.Tables["Students"].Rows)
{
string name = row["Name"].ToString();
int age = Convert.ToInt32(row["Age"]);
Console.WriteLine($"이름: {name}, 나이: {age}");
}
}
}
catch (Exception ex)
{
Console.WriteLine($"오류 발생: {ex.Message}");
}
}
}
}
7. 트랜잭션 처리
트랜잭션은 여러 SQL 명령을 하나의 작업 단위로 묶어 모든 작업이 성공하면 커밋(Commit)하고, 실패 시 롤백(Rollback)합니다.
트랜잭션 사용 예시
using System;
using System.Data.SqlClient;
class Program
{
static void Main(string[] args)
{
string connectionString = "Server=localhost;Database=SampleDB;User Id=your_username;Password=your_password;";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlTransaction transaction = connection.BeginTransaction();
try
{
string query1 = "INSERT INTO Students (Name, Age) VALUES (@Name, @Age)";
using (SqlCommand command = new SqlCommand(query1, connection, transaction))
{
command.Parameters.AddWithValue("@Name", "John");
command.Parameters.AddWithValue("@Age", 23);
command.ExecuteNonQuery();
}
string query2 = "INSERT INTO Students (Name, Age) VALUES (@Name, @Age)";
using (SqlCommand command = new SqlCommand(query2, connection, transaction))
{
command.Parameters.AddWithValue("@Name", "Jane");
command.Parameters.AddWithValue("@Age", 22);
command.ExecuteNonQuery();
}
transaction.Commit(); // 모든 작업이 성공했을 때만 커밋
Console.WriteLine("트랜잭션 완료");
}
catch (Exception ex)
{
transaction.Rollback(); // 오류 발생 시 롤백
Console.WriteLine($"트랜잭션 실패: {ex.Message}");
}
}
}
}
8. 실습 예제: 학생 관리 시스템
이제 배운 내용을 종합하여 간단한 학생 관리 시스템을 만들어보겠습니다. 이 시스템은 학생 추가, 조회, 삭제 기능을 제공합니다.
학생 관리 시스템 예제
using System;
using System.Data.SqlClient;
class Program
{
static string connectionString = "Server=localhost;Database=SampleDB;User Id=your_username;Password=your_password;";
static void Main(string[] args)
{
while (true)
{
Console.WriteLine("1. 학생 추가");
Console.WriteLine("2. 학생 조회");
Console.WriteLine("3. 학생 삭제");
Console.WriteLine("4. 종료");
Console.Write("메뉴 선택: ");
int choice = int.Parse(Console.ReadLine());
switch (choice)
{
case 1:
AddStudent();
break;
case 2:
ViewStudents();
break;
case 3:
DeleteStudent();
break;
case 4:
return;
}
}
}
static void AddStudent()
{
Console.Write("이름: ");
string name = Console.ReadLine();
Console.Write("나이: ");
int age = int.Parse(Console.ReadLine());
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
string query = "INSERT INTO Students (Name, Age) VALUES (@Name, @Age)";
using (SqlCommand command = new SqlCommand(query, connection))
{
command.Parameters.AddWithValue("@Name", name);
command.Parameters.AddWithValue("@Age", age);
command.ExecuteNonQuery();
}
}
Console.WriteLine("학생이 추가되었습니다.");
}
static void ViewStudents()
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
string query = "SELECT * FROM Students";
using (SqlCommand command = new SqlCommand(query, connection))
{
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine($"이름: {reader["Name"]}, 나이: {reader["Age"]}");
}
}
}
}
}
static void DeleteStudent()
{
Console.Write("삭제할 학생 이름: ");
string name = Console.ReadLine();
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
string query = "DELETE FROM Students WHERE Name = @Name";
using (SqlCommand command = new SqlCommand(query, connection))
{
command.Parameters.AddWithValue("@Name", name);
int rowsAffected = command.ExecuteNonQuery();
Console.WriteLine($"{rowsAffected}명의 학생이 삭제되었습니다.");
}
}
}
}
9. 요약
- ADO.NET은 C#에서 데이터베이스와 상호작용하는데 필요한 기본적인 데이터 액세스 기술입니다.
- SqlConnection을 통해 데이터베이스에 연결하고, SqlCommand로 SQL 명령을 실행합니다.
- DataReader를 사용해 데이터를 조회하며, 트랜잭션으로 여러 작업을 안전하게 묶어 처리할 수 있습니다.
- DataSet과 DataAdapter를 사용해 메모리 내에서 데이터를 처리하고 조작할 수 있습니다.
다음 편에서는 Entity Framework를 사용하여 ORM(Object Relational Mapping)을 학습하고 데이터베이스 작업을 더욱 간단하게 처리하는 방법을 알아보겠습니다.