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

时间:2012-01-15 19:58:33

标签: c# winforms

当我运行应用程序时,即使我还没有打开它们,应用程序中的所有表单都已加载/初始化了吗? (I.E. Form.Show)

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

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

FORM LOAD

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

2 个答案:

答案 0 :(得分:3)

在这段代码中:

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

您正在实例化连接,并且从不打开它。 <{1}}子句中的代码永远不会被命中。

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

答案 1 :(得分:0)

杀死所有与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();
            }

在备份或恢复代码之前添加上述代码,即使您与数据库建立了打开连接,您的备份或恢复也会正常工作。