2013-02-26 75 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

我在這裏發表評論,因爲它不直接相關的問題,但我會避免選擇所有列,除非你絕對必須的。 – 2013-02-26 08:49:37

+0

您可以通過將牛奶和水果儲存在同一張表中並使用標識產品類型的ID來簡化您的生活。事實上,這通常會被推薦。 – 2013-02-26 08:45:06

回答

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<SomeObject>而不僅僅是List<string> )。假設您有時想要返回一個Person的列表,並且您還想閱讀Building的列表。然後,你可以寫這樣的事情(沒有編譯&測試):

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; 
} 

,你可以這樣調用它:

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

是的,'result'代碼是一個列表,所以如果我改變'table',我還需要更改'ListName'# – Pyromancer 2013-02-26 08:51:38

+1

@AlfredSanz如果你總是得到'string'的列表,你可以使用1st我寫的代碼。如果你正在獲取'objects'(例如'Person'等),你可以用另一種方式。 – 2013-02-26 08:53:07

+0

謝謝:)這解決了我的問題 – Pyromancer 2013-02-26 08:55:30

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 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(..)'? – 2013-02-26 08:44:45

+0

,因爲'obj'是一個列表:) – Pyromancer 2013-02-26 08:52:41

+1

@AlfredSanz在你的代碼中,但不是在這個。 'obj'是這個代碼中的'object'。 – 2013-02-26 09:56:16