2012-01-15 24 views
1

當我運行應用程序時,應用程序中的所有窗體是否已加載/初始化,即使我尚未打開它們? (IE Form.Show)具有多種形式的C#WinForms應用程序中的連接問題

我這是怎麼關閉登錄表單中的連接:

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數據庫>備份>然後恢復連接?

BACK UP CODE

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

+1

當應用程序啓動時,您需要事先實例化每個表單。這是**不**自動完成的。 – Oded 2012-01-15 20:01:29

+1

你需要添加更多的信息和代碼。你如何開始你的備份過程?什麼是_full_異常消息? – Oded 2012-01-15 20:02:13

+0

如果是這樣,那麼意味着我的表單加載代碼中沒有加載,除非我通過form.show打開表單,正確嗎? @Oded – RMSP 2012-01-15 20:03:37

回答

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

你實例化一個新的連接,從來沒有打開它。在if子句中的代碼將會從中永遠不會出現

你的錯誤是假設連接是唯一一個 - 有可能是多個連接(在其他形式開口,從不正常關閉) - 有些甚至從你的應用程序(例如,使用SQL Server管理工作室 - 有一個開放的查詢窗口到您的數據庫將意味着有一個開放的連接)。

+0

正是我的問題是關於。我有多個連接,因爲我的應用程序中有多個表單。在我到我的備份表單之前,我通過了兩個連接了它的表單。我已經在使用Form.Close打開Backupform之前關閉了這兩種形式的連接。仍然出現錯誤 – RMSP 2012-01-15 20:15:37

+0

@ user1141604 - 如何?你是怎麼做到的?用'使用'語句? – Oded 2012-01-15 20:16:11

+0

我怎麼做了什麼?關閉它之前的連接? – RMSP 2012-01-15 20:19:24

0

追殺到數據庫中的所有連接,最好的辦法是把它脫機,其他的解決方案几乎無法

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

備份之前添加上面的代碼或恢復代碼,然後您的備份或還原會甚至工作如果你打開連接到你的數據庫。

相關問題