Wanna be Brilliant Full-Stack Developer

C# DB 연동 SqlDataAdapter vs SqlDataReader 본문

Some Memos/C#

C# DB 연동 SqlDataAdapter vs SqlDataReader

Flashpacker 2023. 4. 12. 10:08

`SqlDataReader`는 하나의 읽기 전용 데이터 스트림으로, 데이터베이스에서 한 번에 하나의 레코드를 읽어오는데 사용됩니다. 이 방법은 속도가 빠르지만 메모리에 모든 데이터를 한번에 올리지 않기 때문에 대규모 데이터에 유용합니다.

`SqlDataAdapter`는 데이터베이스에서 데이터를 가져와서 .NET Framework의 데이터 테이블과 데이터셋과 같은 로컬 데이터 저장소에 저장할 수 있도록 도와주는 데이터 연결 객체입니다. 
즉, `SqlDataAdapter`는 데이터를 미리 메모리에 적재해 놓는 방식을 사용하므로 빠르게 검색이 가능하지만, 
대량의 데이터를 다룰 때는 메모리 부족 문제가 발생할 수 있습니다.

따라서, `SqlDataReader`는 대량의 데이터를 다룰 때 유용하고, 
`SqlDataAdapter`는 상대적으로 작은 데이터를 다룰 때 유용합니다.

`SqlDataReader`에서 `SqlDataAdapter`로 변경하는 것은 가능하지만, 둘 간의 사용 방식이 다르므로 코드를 다시 작성해야 할 수 있습니다. 또한, `SqlDataAdapter`를 사용하면 데이터를 메모리에 적재해 놓는데 반해, 
`SqlDataReader`는 한번에 하나의 레코드만 읽어오므로 일부 상황에서 `SqlDataReader`가 더 효율적일 수 있습니다. 
따라서 변경 전후에 데이터 양과 성능을 고려하여 선택하는 것이 좋습니다.

 

 

SqlDataAdapter는 ADO.NET에서 데이터를 데이터베이스에서 가져오거나 데이터베이스에 저장하기 위해 사용되는 클래스 중 하나입니다. 이 클래스는 데이터를 가져오기 위해 SQL Server와 연결을 설정하고 SQL Server로부터 데이터를 가져와 데이터를 C#에서 사용할 수 있는 형식으로 변환합니다. 이후에는 데이터를 필요한 컨트롤 (예: DataGridView)에 바인딩하여 데이터를 화면에 출력하거나 사용자 입력을 받아 데이터를 데이터베이스에 저장할 수 있습니다.

 

SqlDataReader는 SQL Server 데이터베이스에서 쿼리를 실행하고 데이터를 읽는 데 사용되는 클래스입니다. SqlDataReader는 데이터를 한 행씩 읽어오기 때문에 대량의 데이터를 가져올 때 유용합니다.
SqlDataReader는 데이터베이스에서 가져온 결과 집합을 이터레이션하면서 각 행에 대해 읽기 위해 사용됩니다.

 

 

 private void UpdateItems()
        {
            string connectionString = "Data Source=tobesystem.co.kr,19813;Initial Catalog=EXAMPLE_DONG;User ID=donguser; Password=dongpwd12#";
            SqlConnection connection = new SqlConnection(connectionString);
            string selectedCategory = comboBox1.SelectedItem.ToString();
            string selectedCookCode = "";
            string query = "";


            if (selectedCategory == "전체")
            {
                query = $"SELECT B.COOK_KATEGORIE '종류', A.COOK_NAME '음식', A.COOK_PRICE '가격' FROM COOK_STEP_NAME A " +
                        $"LEFT JOIN COOK_STEP_MAIN B ON A.COOK_CODE = B.COOK_CODE";
            }
            else
            {
                query = $"SELECT COOK_CODE FROM COOK_STEP_MAIN WHERE COOK_KATEGORIE = '{selectedCategory}'";

                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();

                    SqlCommand command = new SqlCommand(query, conn);
                    SqlDataReader reader = command.ExecuteReader();

                    if (reader.Read())
                    {
                        selectedCookCode = reader["COOK_CODE"].ToString();
                    }
                }

                query = $"SELECT B.COOK_KATEGORIE '종류', A.COOK_NAME '음식', A.COOK_PRICE '가격' FROM COOK_STEP_NAME A " +
                        $"LEFT JOIN COOK_STEP_MAIN B ON A.COOK_CODE = B.COOK_CODE WHERE B.COOK_CODE = '{selectedCookCode}'";
            }

위 코드에서 SqlDataReader는 데이터베이스에서 SELECT 쿼리를 실행한 결과값인 reader에서 COOK_CODE 필드의 값을 읽어와 selectedCookCode 변수에 할당하기 위해 사용되었습니다.

코드의 구체적인 동작을 설명하면, selectedCategory 변수가 "전체"인 경우에는 모든 음식 데이터를 가져오는 쿼리가 실행되고, selectedCategory 변수가 "전체"가 아닌 경우에는 COOK_STEP_MAIN 테이블에서 해당 카테고리의 COOK_CODE 값을 가져오는 쿼리가 실행됩니다.
그리고 SqlDataReader 객체를 사용하여 reader 변수에 결과값을 저장하고,
reader.Read() 메소드를 호출하여 COOK_CODE 필드의 값을 읽어와 selectedCookCode 변수에 할당합니다.

즉 SqlDataReader 객체를 사용하여 데이터베이스의 결과값을 읽어와서 변수에 할당할 수 있습니다. 

 

 

       query = $"SELECT B.COOK_KATEGORIE '종류', A.COOK_NAME '음식', A.COOK_PRICE '가격' FROM COOK_STEP_NAME A " +
                        $"LEFT JOIN COOK_STEP_MAIN B ON A.COOK_CODE = B.COOK_CODE WHERE B.COOK_CODE = '{selectedCookCode}'";
            }

            DataTable dt = new DataTable();

            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                conn.Open();
                SqlDataAdapter adapter = new SqlDataAdapter(query, conn);
                adapter.Fill(dt);
            }

            dataGridView1.DataSource = dt;

            CreateButtons(dt);

            _totalPages = (int)Math.Ceiling((double)dt.Rows.Count / pageSize);

            lblPaging.Text = $"{currentPage} / {_totalPages}";

 

SqlDataAdapter는 데이터베이스에서 데이터를 가져와서 DataTable에 채우기 위해 사용되었습니다.

코드에서 query 변수에 저장된 SQL 쿼리문을 SqlDataAdapter 생성자에 전달하고, 연결 문자열을 포함하는 SqlConnection 인스턴스와 함께 사용합니다. SqlDataAdapter는 Fill 메서드를 호출하여 데이터를 DataTable에 채우는 역할을 합니다.

따라서 이 코드에서는 SqlDataAdapter를 사용하여 데이터베이스에서 필요한 데이터를 가져와 DataTable에 채워서 DataGridView에 연결하여 사용자에게 보여줍니다.

 

 

SqlDataReader과 SqlDataAdapter는 각각 다른 용도로 사용됩니다. 

SqlDataReader는 데이터베이스에서 데이터를 읽어올 때 사용되며, 커넥션을 유지하면서 한 행씩 데이터를 읽어오는 방식으로 동작합니다. 보통 한 번에 많은 양의 데이터를 가져올 필요가 없고, 작업량이 적은 경우에 주로 사용됩니다. 

반면 SqlDataAdapter는 데이터를 데이터베이스에서 가져와서 DataTable이나 DataSet에 저장할 때 사용됩니다. SqlDataReader와는 달리 한 번에 모든 데이터를 가져올 수 있기 때문에 작업량이 많은 경우나 여러 테이블을 합쳐서 사용할 때 유용합니다. 

따라서 해당 코드에서는 데이터를 가져와서 DataTable에 저장해야 하므로 SqlDataAdapter가 사용되었습니다. SqlDataReader는 쿼리를 실행하고, 결과를 한 행씩 읽어오는 방식으로 동작하므로, 이 코드에서는 사용될 수 없습니다.

 

 


using을 왜 사용하는가? 사용법!

'Some Memos > C#' 카테고리의 다른 글

C# WINFORMS 상속 및 접근제어 #1  (0) 2023.04.13
C# WinForms 클래스의 생성및 사용  (0) 2023.04.12
C# WinForms 구조체와 클래스  (0) 2023.04.10
C# Winforms while, do while  (0) 2023.04.10
C# WinForms 반복문 ( For, ForEach)  (0) 2023.04.06