ADO.NET SQL 데이타 읽기
SQL 데이타를 가져오는 방식은 크게 두 가지가 있다.
클라이언트에서 SQL 서버를 연결할 상태에서 데이타를 가져오는 Connected 모드와
데이타를 한꺼번에 클라이언트에 가져온 후 SQL 서버의 연결을 끊는 Disconnected 모드이다.
데이타를 한꺼번에 클라이언트에 가져온 후 SQL 서버의 연결을 끊는 Disconnected 모드이다.
첫번째 방식을 이용하기 위해서는
먼저 SQL 서버에 연결을 Open하고, SQL SELECT문을 써서 쿼리를 서버로 보내고,
결과를 SqlDataReader 클래스 객체에 담아, 한 레코드(Row)씩 데이타를 읽어 사용하면 된다.
또한 데이타 사용이 끝났을 때는 서버 연결을 닫아 주어야 한다.
먼저 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 서버 성능을 저하시키는 원인이 된다.
클라이언트가 작업이 완료되었음에도 서버 연결을 끊지 않고 계속 유지하고 있는 경우로서, S
QL 서버 성능을 저하시키는 원인이 된다.
ADO.NET의 SqlDataReader을 사용할 때 Connection Leak이 발생하는 경우가 종종 있다.
예를 들어, 아래의 예 처럼 SqlDataReader를 리턴하는 메서드를 만든 후 이를 호출해서 사용하는 경우가 많다.
이 경우 SqlConnection 객체는 GetDataReader() 메서드를 빠져 나가면
그 SqlConnection 객체를 엑세스할 방법이 없어 진다.
이 경우 SqlConnection 객체는 GetDataReader() 메서드를 빠져 나가면
그 SqlConnection 객체를 엑세스할 방법이 없어 진다.
나중에 SqlDataReader객체에서 SqlDataReader.Close() 를 호출한다 해도
이는 DataReader만 Close하기 때문에 Connection을 닫을 수 없게 된다.
이는 DataReader만 Close하기 때문에 Connection을 닫을 수 없게 된다.
즉, Connection Leak이 일어나는 것이다.
이러한 문제를 해결하는 방법은 ExecuteReader 메서드를 실행할 때
CommandBehavior.CloseConnection 옵션을 아래 예와 같이 주는 것이다.
이 옵션을 사용하면 SqlDataReader.Close()가 호출되었을 때, SqlConnection도 함께 Close된다.
이러한 문제를 해결하는 방법은 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 |
댓글