【问题标题】:Windows Forms Application C#: adding global variables:Windows 窗体应用程序 C#:添加全局变量:
【发布时间】:2015-10-15 13:52:27
【问题描述】:

美好的一天, 我正在尝试制作一个需要连接到我们的数据库之一的 Windows 窗体应用程序。

我可以使用 System.Data.Odbc 对象连接到数据库。

我在本地函数中创建 OdbcConnection 对象、打开它、读取数据和关闭它都没有问题。但是我的表单需要发送许多查询,因此我想避免每次查询数据库时打开和关闭连接。

现在,我想采取的方法是将 OdbcConnection 对象声明为我的 Forms 类的一个字段,然后在 InitializeComponent() 方法中打开它,让数据库连接在 Form 期间打开,然后关闭仅在窗体关闭时才显示。

但这是一个问题,因为 Visual Studio 不想让我修改 InitializeComponent() 中的任何内容,所有内容都必须由表单设计代表我创建,因此我无法自己打开 OdbcConnection。

完成此任务的干净方法是什么?

谢谢

【问题讨论】:

  • 如果你使用CommandConnection对象最好自己打开和关闭连接。如果你使用DataAdapter,你可以让适配器控制连接状态。
  • 定义一个特定的类来执行此操作,并应用/使用单例模式。在这里阅读更多:link
  • @Maarten 我认为共享连接不是一个好主意。如果需要,ADO.Net 将使用连接池来完成。但是如果 OP 想要表现得不是那么好,那么使用单例是一个不错的选择。
  • 感谢您的回复。实际上我注意到只要我不修改 InitializeComponent() 方法,如果我在 Form1.Designer.cs 的末尾添加私有字段,Visual Studio 就不会抱怨,所以现在我有一个打开 OdbcConnection 实例的加载事件处理程序,以及关闭它的 FormClosing 事件处理程序。我的方法有什么陷阱吗?
  • 不要碰Form1.Designer.cs,而是给Form1.cs添加一个属性

标签: c# forms winforms visual-studio


【解决方案1】:

你为什么不能写

    public partial class credentials : Form
    {
    private Connection con;

        public credentials()
        {
            InitializeComponent();
            con = new Connection();
        }
}

【讨论】:

  • 好电话,我试过了,它奏效了。如果我弄乱了构造函数,我害怕 Visual Studio 抱怨,但事实证明,如果我弄乱 InitializeComponent();
【解决方案2】:

如果你使用Command对象最好自己打开和关闭连接。如果你使用DataAdapter,你可以让适配器控制连接状态。

您应该知道共享连接不是一个好主意。如果需要,ADO.Net 将使用连接池来执行此操作,我建议您手动打开和关闭连接。

但根据您的要求,这里是您可以使用的代码:

public class Form1:Form
{
    public Form1()
    {
        InitiallizeComponent();
    }

    private OdbcConnection connection;

    //If you want to open and close connection automatically uncomment commented codes
    //Then you don't need to open and close connection manually
    protected override void OnLoad(EventArgs e)
    {
        connection= new OdbcConnection("your connection string here");
        //this.Connection.Open();
        base.OnLoad();
    }

    protected override void OnClosing(CancelEventArgs e)
    {
        //this.Connection.Close();
        this.Connection.Dispose();         
        base.OnClosing(e);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    相关资源
    最近更新 更多