2013-04-10 5 views
0

나는 ExecuteReader()을 사용합니다. 마지막 결과 만 반환합니다. 나는 tbid_1.Text의 배열, tbid_1.Text, tbid_1.Text배열로 선택

public void Select(FrmVIRGO frm) 
       { 

       string query = "SELECT* FROM tb_patient_information "; 
       if (this.OpenConnection() == true) 
       { //Create Command 
        MySqlCommand cmd = new MySqlCommand(query, connection); 
        //Create a data reader and Execute the command 


      MySqlDataReader dataReader = cmd.ExecuteReader(); 
         while (dataReader.Read()) 
         { 

// I think use like this 
         frm.tbid_1.Text = dataReader["id_patient"][1].ToString(); //... id_patient1 
         frm.tbid_2.Text = dataReader["id_patient"][2].ToString(); //... id_patient2 
         frm.tbid_3.Text = dataReader["id_patient"][3].ToString(); //... id_patient3 


         } 

         //close Data Reader 
        dataReader.Close(); 

        //close Connection 
        this.CloseConnection(); 
        } 
      } 

답변

1

귀하의 코드는 당신이 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을 사용할 수 없음).
+0

thnx this 해결 된 –