DataReader
DataReaderADO.NET에서 DataReader는 데이터 소스의 데이터를 순차적으로 읽는 데 사용되는 광범위한 개체 범주다.[1]DataReaders는 데이터에 액세스하는 매우 효율적인 방법을 제공하며, 서버측 커서가 사용되지 않는다는 점을 제외하고는 ASP Classic의 Firehose 커서라고 생각할 수 있다.DataReader는 Microsoft SQL Server의 Tabular Data Stream과 다른 소스에서 데이터를 검색하는 다른 방법을 구문 분석한다.
DataReader에는 일반적으로 쿼리를 포함하는 명령 개체, 선택적으로 모든 매개 변수 및 쿼리를 실행할 연결 개체가 수반된다.
DataReader 유형
ADO에는 DataReader 클래스가 없다.NET. 그러나 IDataReader 인터페이스를 구현하는 클래스에는 다음과 같은 여러 가지가 있다.
- 시스템.데이터.SqlClient.SqlDataReader
- 시스템.데이터.OleDb.OleDbDataReader
- Oracle.OraceClient.OracleDataReader
DataReaders는 각각 당면한 작업에 맞게 만들어졌기 때문에 설치 공간이 작고 성능이 양호하지만, 이로 인해 백엔드 데이터 소스에서 다른 백엔드 데이터 소스로 이동할 수 있는 애플리케이션 쓰기가 더욱 어려워진다.일부 제공자별 DataReaders는 기본 데이터베이스에서 사용하는 유형을 노출한다. 예를 들어, int 값은 Microsoft SQL Server에서 null일 수 있지만 에서 null일 수는 없다.버전 2.0 이전 버전의 NET Framework.
강한 타이핑과 약한 타이핑
DataReader를 사용하여 데이터를 검색할 때, 개발자는 필드 값을 강하게 입력된 방식(예:myReader.GetString(12)
) 또는 약하게 입력된 방식으로 읽도록 선택할 수 있으며, 이 경우 System으로 반환된다.개체(예: myReader.GetValue(12)
) 두 방법 모두 장단점이 있다.
특히 기초 데이터에 대한 특정 지식이 없다면, 강하게 타이핑된 검색 방법을 사용하는 것이 더 번거로울 수 있다.데이터베이스의 숫자 값은 여러 로 변환할 수 있다.NET 유형:Int16, Int32, Int64, 플로트, 십진수 또는 통화.잘못된 유형을 사용하여 값을 검색하려고 하면 예외가 발생하여 코드가 더 이상 실행되지 않고 응용 프로그램의 속도가 느려진다.이는 올바른 유형을 사용하는 경우에도 해당되지만 DbNull 값이 발생할 경우(DataReader 클래스의 IsDbNull 부울 함수를 사용하면 피할 수 있음)이 검색 방법의 장점은 데이터 검증이 더 빨리 수행되어 데이터 보정이 가능할 확률을 향상시킨다는 것이다.
약하게 타이핑된 데이터 검색은 빠른 코드 쓰기를 가능하게 하고, 개발자가 어떤 유형의 데이터가 반환될지 미리 알지 못할 때 어떤 식으로든 데이터를 사용할 수 있게 해준다.또한, 프로그래머는 DataReader의 GetFieldType 또는 GetDataTypeName 방법을 사용하여 적절한 유형의 변수에 값을 추출할 수 있다.
일반 오류
DataReader는 경우에 따라 DataTable 대신 사용할 수 있지만, 많은 프로그래머가 이 접근법을 따를 때 연결이 비대해지는 것을 경험했다.DataReader는 (이미) 열려 있는 데이터베이스 연결에만 사용할 수 있으며, DataReader의 Delete 메서드가 호출될 때까지 연결이 닫히지 않는다.위의 Strong 및 약한 타이핑에서 설명한 것처럼 데이터가 처리되는 동안 예외가 발생하는 경우, 개발자가 Try-finally 블록을 사용하지 않고 DataReader를 명시적으로 선언하고 폐기하는 코드를 작성하면 Delete 메서드가 호출되지 않는다.구문을 사용하는 C#는 아래 코드 예시와 같이 이 문제를 피하는 좋은 방법이다.
샘플코드
DataReader를 사용한 SQL 데이터 액세스 샘플
공허하게 하다 데이터 테스트() { 사용. (SqlConnection conn1 = 새로운 SqlConnection(...)) { conn1.개방하다(); SQLCommand mycommand = 새로운 SQLCommand("일부 표에서 * 선택", conn1); 사용. (SqlDataReader 마이리더 = mycommand.ExecuteReader()) { 만일 (마이리더 != 무효의) 하는 동안에 (마이리더.읽다()) 콘솔.WriteLine(마이리더.GetValue(0).토스트링() + ":" + 마이리더.GetTypeName(0)); } mycommand.폐기하다(); } }
사용. 시스템; 사용. 시스템.수집.포괄적인; 사용. 시스템.린크; 사용. 시스템.텍스트; 사용. 시스템.데이터.odbc; 사용. MySql.Data.MySqlClient; 네임스페이스 콘솔어플리케이션1; 계급 프로그램 { 정태의 공허하게 하다 메인(끈을 매다[] 아그) { 끈을 매다 콘 = "서버=localhost;Uid=root;Pwd=thiru;Database=직원"; MySql.데이터.MySqlClient.MySqlConnection 코너를 돌다 = 새로운 MySql.데이터.MySqlClient.MySqlConnection(콘); MySqlCommand 통신 = 새로운 MySqlCommand("emp에서 * 선택", 코너를 돌다); 코너를 돌다.개방하다(); // IAsyncResult a; MySqlDataReader 에이다 = 통신.ExecuteReader(); 하는 동안에 (에이다.읽다()) { 콘솔.WriteLine(에이다[0]); } } }
참조
- ^ "DataAdapters and DataReaders". docs.microsoft.com. Microsoft. Retrieved 4 September 2017.