2015-11-13 80 views
0

我在學習在線課程,並在課程中解釋如何從數據庫中檢索數據。創建連接和命令由類DbProviderFactories完成。我理解課程中的代碼,但使用using作爲連接,命令和讀寫器的必要條件嗎?此外,是否需要空檢查?代碼看起來很混亂,如果你的數據庫中有大量的模型(大陸,國家,貨幣......),它會需要大量的複製/粘貼,這是不好的?連接到基於我遵循的課程的數據庫

所以問題的確是,下面的代碼好壞有什麼可以改進?目標是使用SQLite作爲數據庫提供者。這是否適用於下面的方法?

public static ObservableCollection<Continent> GetContinents() 
{ 
    var continents = new ObservableCollection<Continent>(); 
    var provider = ConfigurationManager.ConnectionStrings["DbConnection"].ProviderName; 
    var connectionString = ConfigurationManager.ConnectionStrings["DbConnection"].ConnectionString; 

    using (var connection = DbProviderFactories.GetFactory(provider).CreateConnection()) 
    { 
     if (connection == null) return null; 

     connection.ConnectionString = connectionString; 
     connection.Open(); 

     using (var command = DbProviderFactories.GetFactory(provider).CreateCommand()) 
     { 
      if (command == null) return null; 

      command.CommandType = CommandType.Text; 
      command.Connection = connection; 
      command.CommandText = "SELECT * FROM Continent"; 

      using (var reader = command.ExecuteReader()) 
       while (reader.Read()) 
        continents.Add(new Continent(reader["Code"].ToString(), reader["EnglishName"].ToString())); 
     } 
    } 

    return continents; 
} 
+0

爲什麼你會認爲這將需要大量的複製粘貼..首先你的CommandText應該作爲變量/參數傳遞給你決定'代碼重用'的方法改變方法簽名來處理SqlCommand,SqlParameter等事情。使用語句用於自動處理對象,請嘗試使用'MSDN'並對您的結尾做更多的研究,以便您可以瞭解在線課程以外的情況。在現實世界。 – MethodMan

+0

也有更容易的方法來做你想要在你自己的自定義DBUtils類中做的事情。 – MethodMan

+0

你可以在這裏消除while循環,並使用'DataAdapter.FIll()'方法將內容返回給一個'DataTable'你的代碼需要一些嚴重的'Re-Factoring' – MethodMan

回答

1

使用用於連接,命令和讀取器的必要嗎?

是的。 這裏我評論的代碼

using (var command = DbProviderFactories.GetFactory(provider).CreateCommand()) // here you've created the command 
 
      { 
 
       if (command == null) return null; 
 

 
       command.CommandType = CommandType.Text; 
 
       command.Connection = connection; 
 
       command.CommandText = "SELECT * FROM Continent"; 
 

 
       using (var reader = command.ExecuteReader()) //Here you're reading what the command returned. 
 
        while (reader.Read()) 
 
         continents.Add(new Continent(reader["Code"].ToString(), reader["EnglishName"].ToString())); 
 
      }

而且是必要的null檢查?

它可以返回空值數據,因此是絕對

代碼看起來混亂

這就是編碼器壽命brotha。使用對象的循環將節省空間。

+0

你在這裏發佈的'NON Answer'的目的是什麼?複製他的代碼並不真的有助於我的意見評論可以解釋這一點不要重新發布笨重的代碼 – MethodMan

+0

@MethodMan滾動到右邊的傢伙。我發表了評論。請+1來彌補你的誤解: –