2013-08-19 29 views
-1

嘗試備份和還原數據庫時出現此錯誤。數據庫備份和還原期間路徑中的非法字符C#

後端:SQL server 2008

前端: C#

數據庫備份過程中路徑

非法字符,並使用C#

private void backToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     try 
     { 
     string FileToMove = null; 
     string MoveLocation = null; 
     string FileToDel = null; 

     FileToMove = "|DataDirectory|\\CMS_DB.mdf"; 
     MoveLocation = "|DataDirectory|\\backup\\CMS_DB.mdf"; 
     FileToDel = "|DataDirectory|\\backup\\CMS_DB.mdf"; 

     if (MessageBox.Show("Are you sure you want to backup current database?", "CONFIRMATION", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == System.Windows.Forms.DialogResult.Yes) 
     { 
      System.IO.File.Delete(FileToDel); 
      System.IO.File.Copy(FileToMove, MoveLocation); 
      MessageBox.Show("Database successfully backup!"); 
     } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

    private void restoreToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     try 
     { 
     string FileToMove = null; 
     string MoveLocation = null; 
     string FileToDel = null; 


     FileToMove = "|DataDirectory|\\CMS_DB.mdf"; 
     MoveLocation = "|DataDirectory|\\backup\\CMS_DB.mdf"; 
     FileToDel = "|DataDirectory|\\backup\\CMS_DB.mdf"; 

     if (MessageBox.Show("Are you sure want to permanently replace current database with the backup database?", "CONFIRMATION", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == System.Windows.Forms.DialogResult.Yes) 
     { 
      System.IO.File.Delete(FileToDel); 
      System.IO.File.Copy(FileToMove, MoveLocation); 
      MessageBox.Show("Database successfully restored!"); 

     } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

請在此幫助恢復。

回答

1

您需要查看Path.GetInvalidPathChars Method以確定無效字符的列表。

數組返回此方法不能保證包含 一套完整的文件和目錄 名稱中的無效字符。全套無效字符可能因文件系統而異。例如,對於 示例,在基於Windows的桌面平臺上,無效路徑字符 可能包含ASCII/Unicode字符1到31以及引號 (「),小於(<),大於(>),管道(|) ,退格(\ b)中,空 (\ 0)和製表符(\ t)的

如果我沒有記錯我看到一個管道(|)。在您提供的文件名字符

0

這裏有兩件事,

首先檢查文件夾「備份」存在,然後使用此方法刪除非法字符R:

public string StripIllegalChars(string _input) 
    { 
     int CharPos = 0; 
     char[] stChars = System.IO.Path.GetInvalidPathChars(); 
     string Result = _input; 

     CharPos = 0; 


     foreach (char achr in stChars) 
     { 


      CharPos = _input.IndexOf(achr); 


      if (CharPos > 0) 
      { 

       Result = Result.Replace(achr.ToString(), ""); 

      } 

     } 

     return Result; 
    } 

也ü可以從MS使用: http://msdn.microsoft.com/en-us/library/system.io.path.getinvalidpathchars.aspx

+0

我試過了:FileToMove =「」+ System.Environment.CurrentDirectory +「\\ CMS_DB.mdf」; MoveLocation =「」+ System.Environment.CurrentDirectory +「\\ backup \\ CMS_DB.mdf」; FileToDel =「」+ System.Environment.CurrentDirectory +「\\ backup \\ CMS_DB.mdf」;但仍然收到錯誤CMS_DB.mdf正在被另一個進程使用.. –

+0

這是另一個錯誤。這意味着你的數據庫被鎖定在Porgram或sql實例中。嘗試關閉文件中的任何連接,然後將其移至備份目標。 –

+0

我關閉了連接,但仍然收到相同的錯誤... 我試過con.Dispose()或con.Close()...有沒有其他方法在備份數據庫之前正確關閉連接 –

0

| DataDirectory目錄|是一個替代字符串,可用於分別配置數據庫文件的位置,但僅在定義ADO.NET連接時適用。

This post可能對您有所幫助。我會引用可能對您最有幫助的部分:

那麼DataDirectory從哪裏來?這是安裝程序定義的 設置之一:

  • .MSI安裝程序將其定義爲應用的目標文件夾。
  • ClickOnce在您的項目中定義了一個特殊的數據文件夾。
  • Web應用程序使用App_Data文件夾。
  • Visual Studio調試器使用調試文件夾。

所以你需要改變你的應用程序,並替換 「| DataDirectory目錄|」根據您的目標部署環境,將部分字符串轉換爲正確的物理路徑。

+0

我試過了: FileToMove =「」+ System.Environment.CurrentDirectory +「\\ CMS_DB.mdf」; MoveLocation =「」+ System.Environment.CurrentDirectory +「\\ backup \\ CMS_DB.mdf」; FileToDel =「」+ System.Environment.CurrentDirectory +「\\ backup \\ CMS_DB.mdf」; 但仍然出現錯誤CMS_DB.mdf正在被另一個進程使用.. –

+0

這是一個不同的問題:您可能仍然在其他地方打開該文件。在嘗試此方法之前,檢查連接是否已正確處理。 – OnoSendai

+0

我關閉了連接,但仍然收到相同的錯誤... 我試過con.Dispose()或con.Close()...有沒有其他方法在備份數據庫之前正確關閉連接 –