Study/C#

C# 12편: ADO.NET으로 데이터베이스와 상호작용하기

wawManager 2024. 10. 31. 12:00
728x90

1. ADO.NET이란?

ADO.NET은 C#에서 데이터베이스와 상호작용할 수 있도록 도와주는 데이터 액세스 기술입니다. ADO.NET을 사용하면 SQL Server, MySQL, Oracle과 같은 관계형 데이터베이스 시스템과 연동할 수 있으며, 데이터를 조회하고 조작할 수 있습니다. 주요 구성 요소로는 Connection, Command, DataReader, DataSetDataAdapter가 있습니다.

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. 데이터 업데이트와 삭제

데이터베이스에서 UPDATEDELETE 명령을 사용해 데이터를 수정하거나 삭제할 수 있습니다.

데이터 업데이트 예시

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를 사용해 데이터를 조회하며, 트랜잭션으로 여러 작업을 안전하게 묶어 처리할 수 있습니다.
  • DataSetDataAdapter를 사용해 메모리 내에서 데이터를 처리하고 조작할 수 있습니다.

다음 편에서는 Entity Framework를 사용하여 ORM(Object Relational Mapping)을 학습하고 데이터베이스 작업을 더욱 간단하게 처리하는 방법을 알아보겠습니다.

728x90