-1

尝试备份和还原数据库时出现此错误。

后端: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);
        }
    }

请帮助解决这个问题。

4

3 回答 3

1

您需要查看Path.GetInvalidPathChars 方法来确定无效字符列表。

不保证从此方法返回的数组包含文件和目录名称中无效的完整字符集。完整的无效字符集可能因文件系统而异。例如,在基于 Windows 的桌面平台上,无效路径字符可能包括 ASCII/Unicode 字符 1 到 31,以及引号 (")、小于 (<)、大于 (>)、竖线 (|)、退格 ( \b)、空 (\0) 和制表符 (\t)。

如果我没记错的话,我会在您提供的文件名中看到一个竖线 (|) 字符。

于 2013-08-19T04:10:00.907 回答
0

这里有两件事,

首先检查文件夹“备份”是否存在,然后使用此方法删除非法字符:

 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

于 2013-08-19T04:15:26.477 回答
0

|数据目录| 是一个替换字符串,可用于单独配置数据库文件的位置,但仅在定义ADO.NET 连接时才有效。

这篇文章可能对你有一些帮助。我将引用可能对您最有帮助的部分:

那么 DataDirectory 是从哪里来的呢?这是安装程序定义的部署设置之一:

  • .MSI 安装程序将其定义为应用程序的目标文件夹。
  • ClickOnce 在您的项目中定义了一个特殊的数据文件夹。
  • Web 应用程序使用 App_Data 文件夹。
  • Visual Studio 调试器使用调试文件夹。

因此,您需要更改您的应用程序,并替换“|DataDirectory|” 根据您的目标部署环境,将您的部分字符串转移到正确的物理路径。

于 2013-08-19T04:19:36.830 回答