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

本文关键字:应用程序 连接 问题 C#WinForms 表单 | 更新日期: 2023-09-27 18:20:26

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

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

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;
}

错误消息http://img824.imageshack.us/img824/8541/error1lj.jpg

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

在这段代码中:

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-打开数据库的查询窗口将意味着存在打开的连接)。

终止所有数据库连接的最佳解决方案是使其离线,其他解决方案几乎无法通过

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();
            }

在备份或还原代码之前添加上述代码,然后即使您有到数据库的打开连接,备份或还原也可以工作。