2012-02-01 76 views
0

我正在研究一個基本的mysql數據庫類,並帶有一些函數。其中一個函數應返回所有行和列的列表。代碼正在工作,而且非常動態,但它看起來也可以改進。我希望有人可以看看這段代碼,並告訴我是否有另一種解決方案來做到這一點?返回所有行和列

我嘗試過的其他解決方案之一是沒有列表,但它涉及到它必須返回的每一行都重新創建一個數組,所以我放棄了它,然後轉到列表中。

public List<object[]> ReadAllRows(string sQuery) 
    { 
     List<object[]> oResults = new List<object[]>(); 

     try 
     { 
      MySqlCommand msCommand = new MySqlCommand 
      { 
       CommandText = sQuery, 
       Connection = Connection 
      }; 

      using (MySqlDataReader msReader = msCommand.ExecuteReader()) 
      { 
       if(!msReader.HasRows) 
        return EmptyList; 

       while (msReader.Read()) 
       { 
        object[] oRowValues = new object[msReader.FieldCount]; 
        { 
         msReader.GetValues(oRowValues); 
        } 

        oResults.Add(new object[] { oRowValues }); 
       } 
      } 
     } 
     catch (MySqlException ex) 
     { 
      LastError = "Error: " + ex; 
      return EmptyList; 
     } 

     return oResults; 
    } 

如果有任何問題,請隨時提出

+2

你應該試試LINQ到MySQL。有許多開源的API。 http://www.devart.com/dotconnect/mysql/ – adatapost 2012-02-01 15:31:34

回答

3

我會強烈建議反對這樣做。

首先,只要執行該命令,就應該只保持連接處於打開狀態。另外,MySqlCommand實現了IDisposable,所以應該包裝在using子句中。

我推薦它的一個原因是此功能已被覆蓋。一個簡單的方法是讓你的方法返回一個DataTable。 DataTables將爲您提供您需要的每一點信息(數據類型,行數,列數等),而您的數據非常有限。

另一個原因與保持開放連接有關:壞主意。連接池將非常快速地處理打開/關閉連接,所以它不是必需的。另外,如果你的應用程序崩潰,那麼你將泄漏連接。在某些時候,你會得到很好的小數據庫錯誤。

+0

感謝您的意見。在我發佈我的新版本之前,我希望能夠告訴我在這一刻我是如何保持開放連接的? – Nick 2012-02-01 16:14:10

+0

@Nick:查看您的發佈代碼,您將一個名爲Connection的屬性分配給您的命令對象。所以,很顯然它是在別處創建的。此外,您的命令對象從不關閉。在這兩者之間,顯而易見的是,一旦查詢完成,命令對象被掛起並且外部連接屬性不被處理。你的命令和連接對象都實現了IDisposable。這意味着他們應該被包裹在使用子句中......在他們實際使用的方法中。 – NotMe 2012-02-01 16:55:30

2

一個.NET的DataTable是數據行的集合,每個DataRow中有一個對象數組ItemArray

DataTable GetTable() 
    { 
    try 
    { 
     string query = "select * from items"; 
     MySqlDataAdapter adapter = new MySqlDataAdapter(query, connection); 
     DataSet DS = new DataSet(); 
     adapter.Fill(DS); 
     return DS.Tables[0]; 
    } 
} 
+0

+1個很好的例子。我對DataAdapters並不着迷,但他們肯定比OP更有吸引力。 – NotMe 2012-02-01 15:39:56

+0

謝謝,我不想使用DataAdapter,因爲我不太喜歡它們。不過,我決定一起去。 – Nick 2012-02-01 16:16:05

1

當你得到一個數據集,你可以得到方便地訪問到任何指定的表中的行,使用DataRowCollection:

DataRowCollection drc = dataSet.Tables["tableName"].Rows; 

,而不是表名,我們還可以寫表的索引,但它不是reccomended,當我們添加或刪除數據庫索引的表會發生變化。這些操作後名稱將仍然相同。

+0

感謝您提供的信息和單挑。 – Nick 2012-02-01 16:17:53