2016-04-21 75 views
1

我目前是一名學生,學習C#和數據庫。不幸的是,我要去的學校並沒有使用C#與數據庫進行交互。所以我正在自己學習。處理數據庫時的最佳做法

我寫了一些使用數據庫和C#的小程序。它們運行良好,並且做我想要的,即使它們可能沒有正確構建。我正在寫一個新的程序,這將是我最大的,我希望它是正確的。該程序有許多窗體,類和包含18個表的SQL數據庫。我現在組織的方式是,我的窗體通常會創建一個類的新實例。讓我們說客戶。當點擊保存按鈕時,會創建一個新客戶,分配給這些屬性的值,並將該對象與組合框一起發送到客戶類中的公共方法,或者與我一起工作的任何東西。我也有一個名爲Database的類,它具有我寫的所有SQL查詢。這樣一切都是一個地方。我通常會發送數據庫類作爲參數的字典來填充,然後在客戶類中使用它來填充組合框。我沒有使用數據集,數據表或類似的東西。我直接與數據庫工作。

這被認爲是可以接受的,還是不在現實世界中?我真的希望在不久的將來能夠以此爲生,所以我想正確地學習。我自己做了很多閱讀,而且我看到人們如何做這件事的方式有很多不同。如果有人也有任何好閱讀的建議,我會很感激。

編輯,添加的代碼段爲每一個建議

在我的窗體中添加一個新的客戶,我對他們把他們的地址的位置。我有兩個組合框,一個是國家,一個是城市。我對城市進行了過濾,以便它僅顯示處於狀態組合框中選定狀態的城市。所以在我的表單類中,我有一個方法來改變狀態框索引。它看起來像這樣。

private void cboStates_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     Address.GetFilteredCities(cboCity, (int)cboStates.SelectedValue); 
    } 

cboCity是城市組合框。在地址類中,我有一個看起來像這樣的方法。 Cities是一個字典,其中包含關鍵字的整數,以及該值的字符串。 int是城市的ID,保存在我的數據庫中。該值是城市名稱,顯示在組合框中。

public static void GetFilteredCities(ComboBox box, int stateID) 
    { 
     cities.Clear(); 
     Database.GetFilteredCities(cities, stateID); 

     if (cities.Count > 0) 
     { 
      box.DataSource = new BindingSource(cities, null); 
      box.ValueMember = "Key"; 
      box.DisplayMember = "Value"; 
     } 

     else 
     { 
      box.DataSource = new BindingSource(null, null); 
     } 
    } 
數據庫類

然後,

public static void GetFilteredCities(Dictionary<int, string> cities, int stateID) 
    { 
     try 
     { 
      using (SqlConnection conn = new SqlConnection(connString)) 
      { 
       conn.Open(); 
       SqlCommand grab = new SqlCommand("SELECT CityID, CityName FROM tblCities WHERE StateID = " + stateID, conn); 
       using (SqlDataReader read = grab.ExecuteReader()) 
       { 
        while (read.Read()) 
        { 
         cities.Add((int)read["CityID"], read["CityName"].ToString()); 
        } 
       } 
      } 
     } 

     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, "Error getting cities", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

是否有這樣做的一個比較正確的做法,或這被認爲是一個可以接受的方式?我傾向於在我的方式卡住,所以如果有更好的方式,我寧願現在學習。例如,出於任何原因,使用dataadapter和datatable更好?在使用該程序的同時修改數據表,然後不會將它們提交到數據庫,直到您出於任何原因更好地退出該程序?

+0

我沒有投票,但認爲這個問題過於寬泛和基於意見。更具體一點,展示代碼或多種方式,並尋求更合理的具體原因,以便爲什麼某件事情好或不好。 –

+0

這樣做有幾乎無限的方式,這就是爲什麼編程需要一定程度的創造力。一般來說,它是可以接受的,直到它不工作。所以如果它有效並且你沒有問題,那麼你並沒有真正的問題。我的評論與你的問題一樣寬泛,但你明白了。 – SeanOB

回答

1

很少有現代應用程序包含任何sql,他們經常使用會爲您生成sql的工具。查找一些使用「實體框架」或「nhibernate」作爲幾個示例的示例。也許甚至可以玩RavenDB等對象數據庫......你的類可以直接保存到數據庫中。

+0

這個問題沒有在應用程序中聲明sql作爲一項要求,而我正在考慮提出問題的人的知識。如果一個剛剛接觸編程的人提出這樣的問題,他們很可能不知道這些工具,並可能花費數小時/星期的時間向錯誤的方向發展。 –

+0

如果一個新編程的人沒有指向現代工具,那麼他很可能會成爲下一個無知的程序員寫冗長的代碼。使用EF或NHibernate幾乎不是錯誤的方向。 – TomTom

0

你也可以調用存儲過程。我相信你可能會在一些傳統應用中看到這一點。