具有多个表单的C#WinForms应用程序中的连接问题

具有多个表单的C#WinForms应用程序中的连接问题,c#,winforms,C#,Winforms,当我运行应用程序时,应用程序中的所有表单是否都已加载/初始化,即使我尚未打开它们?(即形式展示) 以下是我在登录表单中关闭连接的方式: if (usertype == "UT1") //admin rights { //GET LOGGED USER Home_Admin homeAdmin = new Home_Admin(); homeAdmin.SetUsername(username); cString.Close(); this.Close()

当我运行应用程序时,应用程序中的所有表单是否都已加载/初始化,即使我尚未打开它们?(即形式展示)

以下是我在登录表单中关闭连接的方式:

if (usertype == "UT1") //admin rights
{
    //GET LOGGED USER
    Home_Admin homeAdmin = new Home_Admin();
    homeAdmin.SetUsername(username);

    cString.Close();
    this.Close();

    System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(OpenHomeAdmin));
    t.Start();
}
以及我是如何从Home_Admin的菜单条中找到备份表单的

private void backUpToolStripMenuItem_Click(object sender, EventArgs e)
{
    BackUp BackUpForm = new BackUp();
    BackUpForm.Show();
}
我正在尝试创建我的数据库备份,如果我只运行备份表单,它将非常有效。如果我从一开始就启动应用程序,它会显示备份失败,数据库正在使用中。我已经关闭了从登录到表单的连接,在那里我将启动备份表单,甚至设置

if(conn.State = connectionState.Open)
{
     conn.close();
}
在备份程序之前是否有任何方法可以终止所有与SQL数据库的连接>备份>然后恢复连接?

备份代码

    public void BackupDatabase(String destinationPath)
    {
        SqlConnection cString = new SqlConnection();
        cString.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=D:\\MY_THESIS\\WORKING FILES\\NNIT-RMS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";

        if (cString.State == ConnectionState.Open) 
        {
            cString.Close();
        }

        try
        {
            //MY SERVER
            String userName = "NNIT-Admin";
            String password = "password";
            String serverName = @"RITZEL-PC\SQLEXPRESS";

            ServerConnection connection = new ServerConnection(serverName, userName, password);
            Server sqlServer = new Server(connection);

            Backup BackupMgr = new Backup();
            BackupMgr.Devices.AddDevice(destinationPath, DeviceType.File);
            BackupMgr.Database = "NNIT DB";
            BackupMgr.Action = BackupActionType.Database;
            BackupMgr.SqlBackup(sqlServer);

            MessageBox.Show("Back up saved!");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message + " " + ex.InnerException);
        }
    }
表单加载

private void BackUp_Load(object sender, EventArgs e)
{            
    string date = DateTime.Now.Day.ToString();
    string year = DateTime.Now.Year.ToString();
    string month = DateTime.Now.Month.ToString();

    Filename_txt.Text = "NNIT-RMSDB_" + month + date + year;
}
错误消息 在这段代码中:

SqlConnection cString = new SqlConnection();

cString.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=D:\\MY_THESIS\\WORKING FILES\\NNIT-RMS.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";

if (cString.State == ConnectionState.Open) 
{
    cString.Close();
}
您正在实例化一个新连接,但从未打开它。
if
子句中的代码永远不会被命中


您的错误是假设新连接是唯一的连接-可能有多个连接(以其他形式打开,但从未正确关闭)-有些连接甚至不是来自您的应用程序(例如,使用SQL Server Management Studio-打开数据库的查询窗口将意味着存在打开的连接).

终止与db的所有连接的最佳解决方案是使其脱机,其他解决方案几乎失败

using (SqlConnection sqlcnn = new SqlConnection("Data Source=.\\SQLEXPRESS;Integrated Security=True"))
            {
                SqlCommand sqlcmd = new SqlCommand("ALTER DATABASE DB_NAME SET OFFLINE WITH ROLLBACK IMMEDIATE", sqlcnn);
                sqlcnn.Open();
                sqlcmd.ExecuteNonQuery();
                sqlcnn.Close();
            }

在备份或还原代码之前添加上述代码,这样即使您已打开与数据库的连接,备份或还原也能正常工作。

当应用程序启动时,您需要先实例化每个表单。这不是自动完成的。您需要添加更多的信息和代码。如何开始备份过程?什么是完整的异常消息?如果是这样,那么这意味着我在表单加载中的任何代码都不会加载,除非我通过form.show打开表单,对吗@OdedCorrect。您需要加载事件处理程序要执行的表单。@user1141604:为什么要初始化一个尚未使用的类?是的,表单加载在第一次显示之前就出现了。这正是我的问题所在。我有多个连接,因为我的应用程序中有多个表单。在我进入备份表单之前,我通过了两个表单,其中有连接。在使用Form.Close打开Backupform之前,我已经关闭了这两个表单中的连接。还有错误appears@user1141604-怎么做?你是怎么做到的?是否使用
语句?@user1141604-是。您可以在问题中发布用于关闭连接的代码吗?@user1141604-您应该使用
语句将连接和命令的创建包装在
中,以确保正确关闭和处理。这可能是问题所在,但如果您不查看服务器以查看哪些内容仍然连接到数据库,则无法判断它是否是您的应用程序。如何在SQL server中检查哪些内容连接到我的数据库?