已答覆 SqlConnection 問題一問(觀念問題)

  • 2011年7月21日 上午 09:57
     
     

    請問各位大大~我有ㄧ觀念不清楚想提問

     

    假設我程式有兩個WinForm(客戶資料維護,廠商資料維護)

    因為都是連接同一個資料庫,不同資料表

    所以我的SqlConnection只想宣告一次,不想宣告成區域變數,才不會一直開開關關

    那問題來了,我用VB.NET可以寫在模組內,但是我現在是用C#開發

    請問各位大大都是怎樣處理這問題呢??


    IDS

所有回覆

  • 2011年7月21日 上午 10:06
     
     

    寫在某個類別裡 然後繼承該類別

     


    coding or not
  • 2011年7月21日 上午 10:07
     
     
    突然想到~可以將SQL的功能寫在一個class內,要用時去呼叫,再將查詢的資料回傳就好,請問各位大大是不式都這樣實做的呢??
    IDS
  • 2011年7月21日 上午 10:13
     
     
    突然想到~可以將SQL的功能寫在一個class內,要用時去呼叫,再將查詢的資料回傳就好,請問各位大大是不式都這樣實做的呢??
    IDS

    一般比較好的架構是有專門的類別來處理與資料庫連接以及對資料庫進行CRUD的動作,前端表單或網頁就專心處理UI及商業邏輯所需的流程。
    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
  • 2011年7月21日 上午 10:25
     
     

    這個問題沒有絕對的答案.
    不過通常的做法如下

    1.因為ADO.Net本身有Connection Pool機制,反覆建立SqlConnection實體並不會對SQL有太大的效能問題.在程式中雖然會有消耗些效能,但整體而言這部分是可以忽略的.
    而且如果你程式本身會有非同步呼叫或MultiThread機制,那麼用共用方式SqlConnection本身並不是ThreadSafe你要很小心處理這部分問題.這不是件簡單的事.
    2.因為第1點所以SqlConnection只要存取後應該就要關閉通常如下方式
    using(SqlConnection connection = new SqlConnection(...))
    {
    .....
    }

    3.如果需要做離線處理,考慮使用DataSet等離線機制,這樣即使Connection消失也不會有太大問題.

     

     

     


  • 2011年7月21日 上午 10:38
     
     
  • 2011年7月21日 上午 11:12
     
      包含代碼
    突然想到~可以將SQL的功能寫在一個class內,要用時去呼叫,再將查詢的資料回傳就好,請問各位大大是不式都這樣實做的呢??
    IDS

    至少我就是這樣做的

    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;
    using System.Web.Configuration;
    
    
    public class DBUtil
    {
    
      //你自己的連線字串
      public String Con_Str = WebConfigurationManager.ConnectionStrings["Your_Connectiong"].ConnectionString;
    
    
    
      //DataTable
      /// <summary>
      /// 傳入查詢語法字串, 返迴DataTable
      /// </summary>
      /// <param name="queryString">查詢語法</param>
      /// <returns>DataTable</returns>
      public DataTable GetDataTable(String queryString)
      {
    
        DataTable dt = new DataTable();
        SqlConnection connection = null;
    
        try
        {
          connection = new SqlConnection(this.Con_Str);
          SqlCommand command = new SqlCommand(queryString, connection);
          connection.Open();
          SqlDataReader reader = command.ExecuteReader();
          dt.Load(reader);
          reader.Close();
        }
        catch (System.Exception e)
        {
          //處理例外
        }
        finally
        {
          // Always call Close when done reading.
          connection.Close();
        }
    
        return dt;
      }
    }
      
    

    要使用的時候

    DBUtil db=new DBUtil();
    DataTable dt =db.GetDataTable("Select * from YourTable");
    //處理dt動作...
    

    不過這種方式,安全性問題一定要很留意


    Shadowと愉快なコード達
    Please correct me if my concept is wrong
  • 2011年7月22日 上午 01:17
     
     

    阿尼大大~首先感謝您給予我的方向,我有看過文章了,想跟您請教一下,我是否宥會錯意

     

    1.用USING包覆Sqlconnection

    2.如果連接字串一樣,名稱也一樣,那ADO.NET的連接共用就會幫你管理(close之後他並不會真的關閉)

    另外一疑問:

    文中提到

    請不要在 Connection 上呼叫 CloseDispose、呼叫 DataReader,或您類別的 Finalize 方法中的任何其他 Managed 物件。在完成項中,只需釋放類別直接擁有的 Unmanaged 資源。

    這句話的意思是說:不要使用Connection.close()??

     


    IDS
  • 2011年7月22日 上午 03:15
     
     
  • 2011年7月22日 上午 03:51
     
     已答覆

    這只是其中一種說法, 如下:

    如果你以前在 VB是宣告在Module中

    那在 C#可以把它放在某個Class宣告為 static 也可以做出類似的效果


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    • 已標示為解答 kentsl 2011年7月22日 上午 05:19
    •  
  • 2011年7月22日 上午 05:18
     
     
    Bill 大大說中了我最後選擇的做法!!
    IDS
  • 2011年7月25日 上午 06:58
     
     

    請不要在 Connection 上呼叫 Close 或 Dispose、呼叫DataReader,或您類別的 Finalize 方法中的任何其他 Managed 物件。

    它這句翻得怪怪的啦,原意應該是:

    不要在自訂類別的Finalize方法裡面呼叫Connection.Close或Connection.Dispose

     

    http://msdn.microsoft.com/zh-tw/library/0s71x931(v=VS.80).aspx

  • 2011年7月26日 上午 04:47
     
     

    connection沒關,要比開開關關問題多的多...

    connection如果透過static共用,會死的更慘...要用static,請記得確保connection資源是獨立的,只有method內容是共用的。不然一定會遇到多人同時存取,connection還沒釋放的問題。


    常用資源參考:
    小弟的blog: In 91,wiki: my wiki