我有一个主窗口窗体,可以打开许多其他窗体。所有表单都有一个共同的oracle数据库连接。
我是C#的新手(到目前为止一直使用visual basic),我不确定达到此目的的最佳方法。
潜在选项:
编辑:请参阅@ C4ud3x的答案,了解示例类以执行此功能。
答案 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
进程。