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

时间:2016-05-11 15:42:33

标签: c# database forms oracle parent-child

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

我是C#的新手(到目前为止一直使用visual basic),我不确定达到此目的的最佳方法。

潜在选项:

  1. 将连接传递给子表单作为输入。
  2. 将主窗口窗体作为父窗口传递给子窗体并使用其成员变量连接。
  3. 我还没考虑过其他一些选择。
  4. 编辑:请参阅@ C4ud3x的答案,了解示例类以执行此功能。

4 个答案:

答案 0 :(得分:7)

选项3:

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

.NET支持连接,因此创建它们并不是一个昂贵的过程。在需要时创建连接,使用它,然后处理它。这样做的有效方法是使用using块。

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

答案 1 :(得分:0)

分享连接非常危险。无论如何你想要这样做,这是一种可行的方法: 您可以定义一个通过此接口的接口。这样,您可以定义稍后要共享的其他属性。

public interface IMainWindow
{
  Datebase Db;
}

将此界面实施到您的MainWindow:

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

第二个访问MainWindow的Window只能访问此界面。

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

答案 2 :(得分:0)

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

您需要共享连接字符串。这可以是将其传递给ctor中的表单的共享变量。

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

打开和关闭非常快。建议的做法是尽可能晚地打开并尽快关闭以保持连接数量下降。

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

答案 3 :(得分:0)

除了有关whats wrong with your question的说明外,您还可以为数据库内容添加一个新类,并从以下所有表单中访问它:

// 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进程。