具有多个表单的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
在这段代码中:
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();
}
在备份或还原代码之前添加上述代码,然后即使您有到数据库的打开连接,备份或还原也可以工作。