当我运行应用程序时,即使我还没有打开它们,应用程序中的所有表单都已加载/初始化了吗? (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;
}
答案 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();
}
在备份或恢复代码之前添加上述代码,即使您与数据库建立了打开连接,您的备份或恢复也会正常工作。