C#/ADO.NET

ADO.NET 읽기

황기하 2021. 12. 27.
ADO.NET SQL 데이타 읽기

SQL 데이타를 가져오는 방식은 크게 두 가지가 있다.
클라이언트에서 SQL 서버를 연결할 상태에서 데이타를 가져오는 Connected 모드와
데이타를 한꺼번에 클라이언트에 가져온 후 SQL 서버의 연결을 끊는 Disconnected 모드이다.
첫번째 방식을 이용하기 위해서는
먼저 SQL 서버에 연결을 Open하고, SQL SELECT문을 써서 쿼리를 서버로 보내고,
결과를 SqlDataReader 클래스 객체에 담아, 한 레코드(Row)씩 데이타를 읽어 사용하면 된다.
또한 데이타 사용이 끝났을 때는 서버 연결을 닫아 주어야 한다.
 
static void Main(string[] args)
{
    // ConnectionString을 지정
    string strConn = "Data Source=.\SQLExpress;Initial Catalog=TestDB;Integrated Security=SSPI;";
    string sql = "SELECT * FROM Scores";
            
    using (SqlConnection conn = new SqlConnection(strConn))
    {
        conn.Open();                
        SqlCommand cmd = new SqlCommand(sql, conn);

        // SqlDataReader 객체를 리턴
        SqlDataReader rdr = cmd.ExecuteReader();

        // 다음 레코드 계속 가져와서 루핑
        int sum = 0;
        while (rdr.Read())
        {
            int score = (int)rdr["Score"];
            Console.WriteLine("{0} : {1}", rdr["Id"], score);
            sum += score;
        }
        // 사용후 닫음
        rdr.Close();
        Console.WriteLine("Sum = {0}", sum);
    }

 

SqlDataReader : Connection Leak을 방지하는 방법

Connection Leak이란
클라이언트가 작업이 완료되었음에도 서버 연결을 끊지 않고 계속 유지하고 있는 경우로서, S
QL 서버 성능을 저하시키는 원인이 된다.
ADO.NET의 SqlDataReader을 사용할 때 Connection Leak이 발생하는 경우가 종종 있다.
예를 들어, 아래의 예 처럼 SqlDataReader를 리턴하는 메서드를 만든 후 이를 호출해서 사용하는 경우가 많다.
이 경우 SqlConnection 객체는 GetDataReader() 메서드를 빠져 나가면
그 SqlConnection 객체를 엑세스할 방법이 없어 진다.
나중에 SqlDataReader객체에서 SqlDataReader.Close() 를 호출한다 해도
이는 DataReader만 Close하기 때문에 Connection을 닫을 수 없게 된다.
즉, Connection Leak이 일어나는 것이다.
이러한 문제를 해결하는 방법은 ExecuteReader 메서드를 실행할 때 
CommandBehavior.CloseConnection 옵션을 아래 예와 같이 주는 것이다.
이 옵션을 사용하면 SqlDataReader.Close()가 호출되었을 때, SqlConnection도 함께 Close된다.
 
// SqlDataReader 객체를 리턴
public class MySample {
  public SqlDataReader GetDataReader()
  {            
    SqlConnection conn = new SqlConnection(strConn);
    conn.Open();

    SqlCommand cmd = new SqlCommand();
    cmd.Connection = conn;
    cmd.CommandText = "SELECT * FROM Scores";
    SqlDataReader rdr = cmd.ExecuteReader(); //<==
    return rdr;
  }
}

// SqlDataReader를 사용후 Close
class Test {
  ...
  private void button1_Click(object sender, EventArgs e)
  {
    MySample sample = new MySample();
    SqlDataReader dr = sample.GetDataReader();
    dr.Read();
    data = dr[0].ToString();
    dr.Close();
  }
}

// 문제점 해결 방법: ExecuteReader()를 실행할 때,
// System.Data.CommandBehavior.CloseConnection 
// 파라미터를 지정한다.
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

 

[출처] http://www.sqlprogram.com/AdoNet/adonet-datareader.aspx

 

SQL 데이타 읽기 - SQL 프로그래밍 배우기 (Learn SQL Programming)

ADO.NET SQL 데이타 읽기 SQL 데이타를 가져오는 방식은 크게 두 가지가 있다. 클라이언트에서 SQL 서버를 연결할 상태에서 데이타를 가져오는 Connected 모드와 데이타를 한꺼번에 클라이언트에 가져

www.sqlprogram.com

 

'C# > ADO.NET' 카테고리의 다른 글

SQL 데이타 갱신  (0) 2021.12.27
ADO.NET 데이타 추가  (0) 2021.12.27
ADO.NET 사용  (0) 2021.12.27
ADO.NET 소개  (0) 2021.12.27
ADO.NET  (0) 2021.12.27

댓글