在所有类中使用一个数据库连接

时间:2016-03-07 08:15:06

标签: c# wpf database mvvm

我是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 个答案:

答案 0 :(得分: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; }
    }
    
  3. PS在WPF中通常不会将代码放入代码中。 WPF中的所有代码都是inn Models或ViewModels

答案 1 :(得分: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())
{
}

并且通常不会对单个sql语句使用ExecuteTrasaction

这是一个好主意

db.SetSQL("SQL STATEMENT HERE");

应该使用parmeterized查询
我知道你想让事情变得简单,但事实并非如此 您可能希望看起来像实体框架