2016-03-07 128 views
0

我是WPF(和通用應用程序開發)的新手,我想連接到我的數據庫並使用該連接在我的所有Model類中查詢它。我已經寫在連接字符串中的主窗口後面的代碼在所有類中使用一個數據庫連接

public partial class MainWindow : Window 
{ 
    DBConnection db = new DBConnection(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
     Connect(); 
    } 
    ...etc 

而DBConnection的類看起來像這樣

class DBConnection 
{ 
    private OracleConnection connection; 
    private OracleCommand command; 
    private bool autoDisconnect; 


    public void Connect(bool autoDisconnect = true) 
    { 

     this.autoDisconnect = autoDisconnect; 
     try 
     { 
      if (connection == null) 
      { 
       connection = new OracleConnection("CONNECTION DETAILS"); 
      } 
      if (connection.State != ConnectionState.Open) 
      { 
       connection.Open(); 
      } 
     } 
     catch (OracleException ex) 
     { } 
    } 
..... etc 

,但我想某處創建連接和db對象,因此,在我所有的模型可以直接調用DBConnection類,而無需創建新的對象,每次

例如,這裏有一個模型

public class Authentication 
{ 
    string username; 
    string password; 

    public static bool Authenticate(string UserName, string Password) 
    { 
     db.SetSQL("SQL STATEMENT HERE"); 
     db.ExecuteTransactions(); 
    } 
...etc 

其中SetSQLExecuteTransactions是的DBConnection的類

那麼,和我怎麼能(簡單)連接到數據庫,所以它會在整個應用程序是恆定的方法呢?它只是一個窗口與不同UserControls所以我認爲它可以連接在主窗口代碼後面

+2

不是一個好主意。連接是一種寶貴的資源,不應該在應用程序的整個生命週期內保留。這可能是您服務器端的一個很好的啓動工具。他們應該儘快創建,使用和處置。搜索有關Oracle和您的提供商的連接池(Microsoft,Oracle或....) – Steve

+0

如果你想在@史蒂夫的評論後堅持你的想法。我建議你閱讀兩件事情:單身(對他們來說很容易,他們有特定的用例),更重要的是'static'關鍵字。 – Sidewinder94

+0

@Steve,我不知道!所以我應該在需要使用它時打開連接(如驗證登錄)並在之後關閉它(登錄),然後再次打開/關閉每個單獨的CRUD操作? – North

回答

0

但拿着連接不好
和共享多個查詢的連接不好
如果你想要做一些平行的東西在未來
連接池是非常有效的被推薦的方式
我知道這好像很多

static private dbConnectionString = "CONNECTION DETAILS"; 

using (OracleConnection connection = new OracleConnection(dbConnectionString)) 
{ 
    try 
    { 
     connection.Open(); 
     using (OracleCommand command = connection.CreateCommand()) 
     { 
      ...... 
      using(OracleDataReader rdr = command.ExecuteReader()) 
      { 
      } 
     } 
    } 
    catch(OracleException ex) 
    { 
    } 
    finally 
    { 
     connection.Close(); 
    } 
} 

,或者你可以換一個類別中的DBConnection的

using (DB Connection dbConnection = new DBConnection()) 
{ 
} 

,你通常不會使用ExecuteTrasaction只是一個SQL語句

這是

db.SetSQL("SQL STATEMENT HERE"); 

應該使用parmeterized查詢
我知道你想個好主意使它簡單但它不是
你可能想看像一個實體框架

+0

謝謝,你知道一個很好的教程,涵蓋wpf連接池嗎?我不明白第一個codeblock本身是一個類,還是進入了每個模型,或者查詢的位置 – North

+0

@North有什麼瞭解關於池?創建,打開,使用和關閉。您可以使用模型中的第一個代碼塊,也可以按照我所述將它包裝在DBConnection中。正如我所說你應該使用parmeterized查詢,所以一般的dbConnection是有限的。如果你不知道問題的位置,那我就幫不了你。 – Paparazzi

0
  1. 我認爲最好的是創建一個新的類或將其放入您的DBConnection類。並且在那個班級宣佈您的連接是靜態公開的。
  2. 此外我會使用屬性。 像這樣

    static private DBConnection _db=null; 
    
    static public DBConnection Db 
    { 
        get 
        { 
         if (_db==null) Db=new DBConnection(); //You can also add connection or any initialisation 
         return _db; 
        } 
        set { _db = value; } 
    } 
    

PS在WPF通常不把代碼放到後面的代碼。在WPF所有的代碼都是旅店的模型或的ViewModels

相關問題