DataReader로 데이터 검색
적용 대상: .NET Framework .NET .NET Standard
DataReader를 사용하여 데이터를 검색하려면 Command 개체의 인스턴스를 만든 다음 데이터 원본에서 행을 검색하려면 Command.ExecuteReader를 호출하여 DataReader를 만듭니다. DataReader는 프로시저 논리가 데이터 원본에서 순차적으로 가져오는 결과를 효율적으로 처리할 수 있도록 버퍼링되지 않은 데이터 스트림을 제공합니다.
참고 항목
DataReader는 데이터가 메모리에 캐시되지 않기 때문에 대량의 데이터를 검색할 때 좋은 선택입니다.
다음 예제에서는 reader
가 올바른 DataReader를 나타내고 command
가 올바른 Command 개체를 나타낼 때 DataReader를 사용하는 방법을 보여 줍니다.
reader = command.ExecuteReader();
쿼리 결과에서 행을 가져오려면 DataReader.Read 메서드를 사용합니다. 열의 이름이나 서수를 DataReader에 전달하여 반환된 행의 각 열에 액세스할 수 있습니다. 그러나 최고의 성능을 위해 DataReader는 GetDateTime, GetDouble, GetGuid, GetInt32 등의 네이티브 데이터 형식의 열 값에 액세스할 수 있도록 하는 일련의 메서드를 제공합니다. 데이터 공급자별 DataReaders의 형식화된 접근자 메서드 목록을 보려면 SqlDataReader을(를) 참조하세요. 기본 데이터 형식을 알고 있을 때 형식화된 접근자 메서드를 사용하면 열 값을 검색할 때 필요한 형식 변환의 양이 줄어듭니다.
다음 예에서는 DataReader 개체를 반복하고 각 행에서 두 개의 열을 반환합니다.
static void HasRows(SqlConnection connection)
{
using (connection)
{
SqlCommand command = new SqlCommand(
"SELECT CategoryID, CategoryName FROM Categories;",
connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
// Check if the DataReader has any row.
if (reader.HasRows)
{
// Obtain a row from the query result.
while (reader.Read())
{
Console.WriteLine("{0}\t{1}", reader.GetInt32(0),
reader.GetString(1));
}
}
else
{
Console.WriteLine("No rows found.");
}
// Always call the Close method when you have finished using the DataReader object.
reader.Close();
}
}
DataReader 닫기
DataReader
개체 사용을 완료하면 항상 Close()
메서드를 호출합니다.
참고 항목
Command에 출력 매개 변수나 반환 값이 포함되어 있으면 DataReader가 닫힐 때까지 해당 값을 사용할 수 없습니다.
Important
DataReader가 열려 있는 동안에는 해당 DataReader에서 Connection을 단독으로 사용합니다. DataReader를 닫아야 다른 DataReader의 작성을 비롯하여 Connection에 대해 명령을 실행할 수 있습니다.
참고 항목
Connection, DataReader 또는 클래스의 Finalize 메서드에 있는 다른 모든 관리형 개체에 대해 Close 또는 Dispose를 호출하지 마세요. 종료자에서는 클래스에 직접 속한 관리되지 않는 리소스만 해제합니다. 클래스에 관리되지 않는 리소스가 없는 경우 클래스 정의에 Finalize 메서드를 포함하지 마세요. 자세한 내용은 가비지 수집을 참조하세요.
NextResult를 사용하여 여러 개의 결과 집합 검색
DataReader가 여러 결과 집합을 반환하는 경우 NextResult 메서드를 호출하여 결과 집합을 순차적으로 반복합니다. 다음 예제에서는 SqlDataReader가 ExecuteReader 메서드를 사용하여 두 가지 SELECT 문 결과를 처리하는 방법을 보여 줍니다.
static void RetrieveMultipleResults(SqlConnection connection)
{
using (connection)
{
SqlCommand command = new SqlCommand(
"SELECT CategoryID, CategoryName FROM dbo.Categories;" +
"SELECT EmployeeID, LastName FROM dbo.Employees",
connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
// Check if the DataReader has any row.
while (reader.HasRows)
{
Console.WriteLine("\t{0}\t{1}", reader.GetName(0),
reader.GetName(1));
// Obtain a row from the query result.
while (reader.Read())
{
Console.WriteLine("\t{0}\t{1}", reader.GetInt32(0),
reader.GetString(1));
}
// Hop to the next result-set.
reader.NextResult();
}
// Always call the Close method when you have finished using the DataReader object.
reader.Close();
}
}
DataReader에서 스키마 정보 가져오기
DataReader가 열려 있는 동안에는 GetSchemaTable 메서드를 사용하여 현재 결과 집합에 대한 스키마 정보를 검색할 수 있습니다. GetSchemaTable은 현재 결과 집합에 대한 스키마 정보를 포함하는 행과 열로 채워진 DataTable 개체를 반환합니다. DataTable은 결과 집합의 각 열마다 한 행씩 포함하게 됩니다. 스키마 테이블의 각 열은 결과 집합의 행에 반환된 열의 속성에 매핑됩니다. 여기서 ColumnName은 속성의 이름이고 열의 값은 속성의 값입니다. 다음 예에서는 DataReader에 대한 스키마 정보를 작성합니다.
static void GetSchemaInfo(SqlConnection connection)
{
using (connection)
{
SqlCommand command = new SqlCommand(
"SELECT CategoryID, CategoryName FROM Categories;",
connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
// Retrieve schema information about the current result-set.
DataTable schemaTable = reader.GetSchemaTable();
foreach (DataRow row in schemaTable.Rows)
{
foreach (DataColumn column in schemaTable.Columns)
{
Console.WriteLine(String.Format("{0} = {1}",
column.ColumnName, row[column]));
}
}
// Always call the Close method when you have finished using the DataReader object.
reader.Close();
}
}