2013-02-26 3 views
1

OleDbDataReader을 사용하는 데이터베이스에서 데이터를 읽는 프로그램을 만들었지 만 문제는 다른 테이블을 가지고 있지만이 코드는 완벽하게 작동하지만 조금 "하드 코드 된"또는 recursive이 내 샘플입니다. 코드OleDbDataReader 코드를 단순화

 private void loadMilk() 
     { 
      cn.Open(); 
      OleDbDataReader reader = null; 
      OleDbCommand cmd = new OleDbCommand("select* from Milk", cn); 
      reader = cmd.ExecuteReader(); 
      while (reader.Read()) 
      { 
       Milk.Add(reader["Product"].ToString()); 
      } 
      cn.Close(); 
     } 

난 그냥 다른 테이블 (예를 들어, "select* from Fruit 다음 "select* from Classics ....)에 무엇을 읽고 또 다시 반복 할 필요가 나는 또 다시이 코드를 반복하지 않도록하는 방법은 없나요 ? . 감사합니다 :)

+0

이 직접 질문에 관련이없는 있기 때문에 내가 여기에 주석하고,하지만 난 당신이 절대적으로 필요하지 않는 한 모든 열을 선택 피할 것. –

+0

제품 유형을 식별하는 ID를 사용하여 Milk and Fruit을 동일한 테이블에 저장하면 훨씬 간편하게 생활 할 수 있습니다. 실제로 이것은 일반적으로 권장됩니다. –

답변

4

당신은 이런 식으로 그 방법을 리팩토링 할 수

private IList<string> Load(string tableName, string columnName) 
{ 
    var result = new List<string>(); 
    cn.Open(); 
    OleDbDataReader reader = null; 
    OleDbCommand cmd = new OleDbCommand(string.Format("select* from {0}", tableName), cn); 
    reader = cmd.ExecuteReader(); 
    while (reader.Read()) 
    { 
     result.Add(reader[columnName].ToString()); 
    } 
    cn.Close(); 

    return result; 
} 

귀하의 코드 샘플이 될 것입니다 :

var milkItems = Load("Milk", "Product"); 
var classicItems = Load("Classics", "..."); //Enter the column here. 

편집 :

당신은 할 수 있습니다를 조금 더 구체적인 것 (예 : List<string> 대신에 List<SomeObject> 저장).). 가끔 Person의 목록을 반환하고자하고 Building의 목록을 읽고 싶다고 가정 해 봅시다.

Func<OleDbDataReader, Person> selector = x => new Person { Name = x["Person"].ToString() }; 
Load("People", selector); 
+0

예,'result' 코드는리스트이므로'table'을 변경하면'ListName'도 변경해야합니다 – Pyromancer

+1

@ AlfredSanz 항상'string'리스트를 얻는다면 1st 코드를 썼다. '객체 '(예 :'Person' 등)를 얻는다면 다른 방법을 사용할 수 있습니다. –

+0

감사합니다 :) 내 문제를 해결 – Pyromancer

3
private void loadMilk(string TableName, string itemValue) 
     { 
      string SQLString = String.Format("select * from {0}",TableName); 

      cn.Open(); 
      OleDbDataReader reader = null; 
      OleDbCommand cmd = new OleDbCommand(SQLString, cn); 
      reader = cmd.ExecuteReader(); 
      while (reader.Read()) 
      { 
       Milk.Add(reader[ItemValue].ToString()); 
      } 
      cn.Close(); 
     } 
0

그냥 매개 변수로 테이블 이름을 전달 : 좋아

private IList<T> Load<T>(string tableName, Func<OleDbDataReader, T> selector) 
{ 
    IList<T> result = new List<T>(); 
    cn.Open(); 
    OleDbDataReader reader = null; 
    OleDbCommand cmd = new OleDbCommand(string.Format("select* from {0}", tableName), cn); 
    reader = cmd.ExecuteReader(); 
    while (reader.Read()) 
    { 
     result.Add(selector(reader)); 
    } 
    cn.Close(); 

    return result; 
} 

당신은 그것을 호출 할 수 있습니다 : 그럼 당신은 이런 식으로 뭔가를 (을 테스트하지 & 컴파일) 쓸 수

private void loadMilk(string tableName) 
    { 
     cn.Open(); 
     OleDbDataReader reader = null; 
     OleDbCommand cmd = new OleDbCommand(string.Format("select* from {0}",tableName), cn); 
     reader = cmd.ExecuteReader(); 
     while (reader.Read()) 
     { 
      Milk.Add(reader["Product"].ToString()); 
     } 
     cn.Close(); 
    } 
1

"밀크"유형이 확실하지 않습니다. 시도 :

private void loadObjectsFrom(string tableName, object obj, string column) 
     { 
      cn.Open(); 
      OleDbDataReader reader = null; 
      OleDbCommand cmd = new OleDbCommand("select* from " + tableName, cn); 
      reader = cmd.ExecuteReader(); 
      while (reader.Read()) 
      { 
       obj.Add(reader[column].ToString()); 
      } 
      cn.Close(); 
     } 
+0

'object.Add (..)'? –

+0

왜냐하면'obj'는 목록에 있습니다 : – Pyromancer

+1

@AlfredSanz는 코드에 있지만이 코드에는 없습니다. 'obj'는이 코드의'object'입니다. –