귀하의 코드는 당신이 dataReader.Read()
를 호출하면 해당 인덱스에 의해 모든 레코드에 액세스 할 수 있는지 기대하고있는 것으로 보인다 같은 결과를 표시하고 싶었다.
데이터 판독기는 대부분의 .NET 데이터 액세스 라이브러리가 "쿼리 결과 읽기"개념을 나타내는 데 사용하는 인터페이스 인 IDataReader
의 인스턴스입니다. IDataReader
은 한 번에 하나의 레코드에만 액세스 할 수 있습니다. dataReader.Read()
으로 전화 할 때마다 IDataReader
이 다음 레코드로 넘어갑니다. false
을 반환하면 결과 집합의 끝에 도달했음을 의미합니다.
예를 들어, 당신은 이런 식으로 위의 코드를 변환 할 수 :이 하지 당신이 그것을해야하는 방식이다
가
dataReader.Read(); // dataReader is at 1st record
frm.tbid_1.Text = dataReader["id_patient"].ToString();
dataReader.Read(); // dataReader is at 2nd record
frm.tbid_2.Text = dataReader["id_patient"].ToString();
dataReader.Read(); // dataReader is at 3rd record
frm.tbid_3.Text = dataReader["id_patient"].ToString();
참고, 난 그냥 방법 a를 설명하기 위해 그것을 사용하고 있습니다 DataReader
이 작동합니다.
정확히 3 개의 레코드가 반환 될 것으로 예상되는 경우 위 코드와 비슷한 것을 사용할 수 있습니다. 그러나 각각의 레코드에서 데이터를 읽기 전에 의미가없는 경우를 처리하기 전에 dataReader.Read()
이 true
을 반환하도록 수정합니다 (예 : 오류를 설명하는 예외를 throw하고 오류를 기록하는 등).).
일반적으로 원시 ADO.Net (OR/M을 사용하는 것과 반대)으로 작업하는 경우 사전에 IDataReader
의 각 레코드를 미리 변환하여 해당 작업을 수행하는 것이 좋습니다. IDataReader
을 통해
public static class DataReaderExtensions
{
public static IList<IDictionary<string, object>> ListRecordsAsDictionaries(this IDataReader reader)
{
var list = new List<IDictionary<string, object>>();
while (reader.Read())
{
var record = new Dictionary<string, object>();
for (var i = 0; i < reader.FieldCount; i++)
{
var key = reader.GetName(i);
var value = reader[i];
record.Add(key, value);
}
list.Add(record);
}
return list;
}
}
이 방법을 반복을하고 Dictionary<string, object>
로 각 행의 값 스틱 :
는 예를 들어, DataReader
에 대해 다음 확장 메서드를 작성할 수 있습니다. 나는이 패턴이 일반적으로 원시 ADO 물건을 다룰 때 상당히 유용하다는 것을 알았다. 당신은 모든 데이터때까지 기록 (사전 인스턴스)에 액세스 할 수 없습니다
- 서버에서 수신되었습니다
이 방법은주의 사항이 몇 가지 있습니다. DataReader
을 사용할 수있게 레코드를 개별적으로 처리하는 경우 일부는 여전히 전송 중일 때 실제로 데이터 처리를 시작할 수 있습니다. (참고 :이 방법은 IList<IDictionary<string, object>>
대신 IEnumerable<IDictionary<string, object>>
을 반환하고 사용 가능한대로 각 레코드를 생성하려면 yield return
을 사용하여 수정할 수 있습니다.)
- 큰 데이터 집합을 반복하는 경우 해당 인스턴스를 생성하지 않을 수 있습니다 많은 사전. 대신에 각 레코드를 개별적으로 처리하는 것이 더 나을 수도 있습니다.
DataReader
에서 레코드에 대해 제공 할 수있는 정보에 액세스 할 수 없습니다 (예 : 레코드를 반복 할 때 DataReader.GetDataTypeName
을 사용할 수 없음).
thnx this 해결 된 –