在 C# 中的窗体之间共享数据库连接的最佳方法是什么?

What is the best way to share a database connection between forms in C#?

我有一个主要的 window 表单,可以打开许多其他表单。所有表格都有一个共同的 oracle 数据库连接。

我是 C# 新手(到目前为止一直在使用 Visual Basic),我不确定实现此目的的最佳方法。

可能的选择:

  1. 将连接作为输入传递给子表单。
  2. 将主window窗体作为父窗体传递给子窗体,并使用其成员变量连接。
  3. 我还没有考虑的其他选项。

编辑:查看@C4ud3x 的回答以获取示例class来执行该功能。

选项 3:

不要共享连接。不要为多个请求保持连接打开(除非它们在代码中立即)。不要将连接公开为 public 属性。

连接由 .NET 汇集,因此创建它们不是一个昂贵的过程。在需要时创建连接,使用它,然后丢弃它。一种有效的方法是使用 using 块。

如果您想要一个中心位置来存储用于 创建 连接的连接 string 很好 - 您可以使用 app.config 或其他一些机制将 that 存储在一个地方。

共享连接非常危险。如果你仍然想这样做,这里有一个可能的方法: 您可以定义一个接口并传递这个接口。这样,您就可以定义其他属性以便稍后共享。

public interface IMainWindow
{
  Datebase Db;
}

将此接口实现到您的 MainWindow:

public Window MainWindow : IMainWindow
{
  public Database Db
 ...
}

您第二个 Window 仅通过此界面访问 MainWindow。

public Window SecondWindow
{
  private readonly IMainWindow Mw;
  public SecondWindow(IMainWindow Mw)
  {
    this.Mw = Mw;
    //Access the MainWindow database with Mw.Db
  }
}

您可以传递连接并让他们共享,但这不是推荐的做法。如果一个表单忘记关闭或处理异常,那么它会影响所有表单。如果您进展到并行或后台处理,则可能正在使用连接。

您确实需要共享连接字符串。这可能是将其传递给构造函数中的表单的共享变量。

Connection con = new Connection(conString);
try 
{
   con.Open();
   Command cmd = con.CreateCommand();
   // use command 
}
catch(Exception Ex)
{
}
finally 
{
   con.Close();
}

打开和关闭速度非常快。建议的做法是尽可能晚地打开并尽快关闭以减少连接数。

是的,您可以将所有内容包装在数据库类型中 class,但我喜欢直接使用 is。

除了有关 whats wrong with your question 的说明之外,您还可以为数据库内容添加一个新的 class 并从所有形式访问它,如下所示:

// database.cs
public static class Database
{
    static string connectionString = "user=...pass=...db=...etc";

    public static void ExecuteQuery(string query)
    {
        // open connection
        // send query
        // close connection
    }
}

// form1.cs
public partial class Form1 : Form
{
    public void doSomething()
    {
        Database.ExecuteQuery("Select something");
    }
}

// form2.cs
public partial class Form1 : Form
{
    public void anotherOne()
    {
        Database.ExecuteQuery("Update something");
    }
}

在这种情况下,您不需要在所有表单中声明变量或传递任何实例。

此外,您只需要为您的应用程序关心一次干净的 open -> send -> close 流程。