2011-03-10 56 views
0

我有一個方法,讓我啓動備份的數據庫。我想知道的是,如果我應該在這種情況下使用ExecuteNonQuery(),或者如果有更好的使用。這是目前我的代碼:我應該使用ExecuteNonQuery這個數據庫備份命令

public static void RunBackup(string dbName, string filePath, string backupName, string connString) 
    { 
     using(SqlConnection objConnection = new SqlConnection(connString)) 
     { 

      string commmandText = "BACKUP DATABASE @DBName TO DISK = @FilePath WITH NOFORMAT, NOINIT, NAME = @BackUpName, SKIP, NOREWIND, NOUNLOAD, STATS = 10"; 
      SqlCommand objCommand = new SqlCommand(commmandText,objConnection); 
      objCommand.Parameters.AddWithValue("@dbName", dbName); 
      objCommand.Parameters.AddWithValue("@FilePath", filePath); 
      objCommand.Parameters.AddWithValue("@BackUpName", backupName); 

      objConnection.Open(); 
      objCommand.ExecuteNonQuery(); 
      objConnection.Close(); 
     } 
    } 

有一件事我關心的是能夠驗證備份是完整的,成功的,同時處理超時問題以進行備份和較長的時間才能完成。

回答

1

爲了處理長時間運行的查詢我結束了這是怎麼回事的問題:

public static void RunBackup(string dbName, string filePath, string backupName, string connString) 
    { 
     string commmandText = "BACKUP DATABASE @DBName TO DISK = @FilePath WITH NOFORMAT, NOINIT, NAME = @BackUpName, SKIP, NOREWIND, NOUNLOAD, STATS = 10"; 
     SqlConnection objConnection = new SqlConnection(connString); 
     try 
     { 
      SqlCommand objCommand = new SqlCommand(commmandText, objConnection); 
      objCommand.Parameters.AddWithValue("@dbName", dbName); 
      objCommand.Parameters.AddWithValue("@FilePath", filePath); 
      objCommand.Parameters.AddWithValue("@BackUpName", backupName); 

      objConnection.Open(); 

      IAsyncResult result = objCommand.BeginExecuteNonQuery(); 
      while (!result.IsCompleted) 
      { 
       System.Threading.Thread.Sleep(100); 
      } 


      int count = objCommand.EndExecuteNonQuery(result); 
     } 
     catch (SqlException e) 
     { 
      throw e; 
     } 
     finally 
     { 
      objConnection.Close(); 

     } 

    } 

這將讓我不asyncronously執行命令不超時問題。我將在最終的代碼集中添加一些額外的錯誤處理等。我可能會做一些額外的工作,看看能否通過EndExecuteNonQuery或AsyncCallBack獲得腳本末尾返回的更好狀態。

0

如果您不知道通過電話接收到數據庫中的任何信息,則應該使用ExecuteNonQuery。如果在執行命令期間發生任何錯誤,您將得到相應的異常。

3

ExecuteNonQuery表示該命令不返回任何數據。這並不意味着它會異步執行或者您不會收到錯誤信息。它會阻止,直到命令完成並返回任何可能發生的錯誤

1
ExecuteNonQuery() 

應該可以在這裏使用。我想要做的就是圍繞使用方法進行嘗試,以捕捉可能發生的任何錯誤並妥善處理它們。

0

這確實看起來應該放在存儲過程中以進行一些錯誤處理。

另外,看看here看代碼完成。

0

我認爲ExecuteNonQuery是好的,但你應該考慮用戶與您的查詢超時。

objCommand.CommandTimeout = 60 * 60; //一小時或更長時間

如果您使用的是桌面應用程序,那麼肯定您應該在異步調用中執行此查詢。

0

ExecuteNonQuery是正確的使用命令。

如果您希望收到有關還原過程的更多信息,您應該訂閱SqlConnection對象的InfoMessage事件。那就是你可以捕獲所有「非錯誤」消息。

0

試試吧。它解決了超大規模數據庫時超時過期的問題。

私人小組Command1_Click() 上的錯誤繼續下一步 昏暗CON作爲新連接 昏暗TM作爲字符串 con.CommandTimeout = 500 '''命令超時時間應爲500

用ConA .ConnectionString =「 Provider = SQLOLEDB.1; Persist Security Info = False; User ID = sa; Initial Catalog = dbiBMS; Data Source = 192.168.103。4" 。開 結束隨着 TM = CStr的(時間)

con.Execute 「備份數據庫dbiBMS到磁盤= 'E:\ Database_Backup \ Test1.bak' 與格式」

con.Close MSGBOX TM 退出小組 X: MSGBOX Err.Description

結束子