在 C# 中的窗体之间共享数据库连接的最佳方法是什么?
What is the best way to share a database connection between forms in C#?
我有一个主要的 window 表单,可以打开许多其他表单。所有表格都有一个共同的 oracle 数据库连接。
我是 C# 新手(到目前为止一直在使用 Visual Basic),我不确定实现此目的的最佳方法。
可能的选择:
- 将连接作为输入传递给子表单。
- 将主window窗体作为父窗体传递给子窗体,并使用其成员变量连接。
- 我还没有考虑的其他选项。
编辑:查看@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
流程。
我有一个主要的 window 表单,可以打开许多其他表单。所有表格都有一个共同的 oracle 数据库连接。
我是 C# 新手(到目前为止一直在使用 Visual Basic),我不确定实现此目的的最佳方法。
可能的选择:
- 将连接作为输入传递给子表单。
- 将主window窗体作为父窗体传递给子窗体,并使用其成员变量连接。
- 我还没有考虑的其他选项。
编辑:查看@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
流程。