我正在尝试从SQL Server 2008备份和还原数据库

时间:2016-02-21 07:05:51

标签: c# asp.net sql-server-2008

我正在尝试备份和还原SQL Server 2008数据库,但我收到错误消息

  

数据库名称附近的语法错误

以下是备份和恢复的代码,编写为c#asp.net。

我可以就此获得帮助吗?

private void btnbackup_Click(object sender, EventArgs e)
{
    try
    {
        if (combodatabase.Text.CompareTo("") == 0)
        {
            MessageBox.Show("Please select a Database");
            return;
        }

        con = new SqlConnection(connectionstring);
        con.Open();

        sql = "BACKUP DATABASE" + combodatabase.Text + " TO DISK='" + txtbackupfileloc.Text + "\\" + combodatabase.Text + "-" + DateTime.Now.Ticks.ToString() + ".bak'";

        cmd = new SqlCommand(sql, con);
        cmd.ExecuteNonQuery();

        con.Close();
        con.Dispose();

        MessageBox.Show("Database Backup Successfully Completed.");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

恢复代码:

private void btnrestore_Click(object sender, EventArgs e)
{
    try
    {
        if (combodatabase.Text.CompareTo("") == 0)
        {
            MessageBox.Show("Please Select a Database");
            return;
        }

        con = new SqlConnection(connectionstring);
        con.Open();

        sql = "ALTER DATABASE" + combodatabase.Text + "SET SINGLE_USR WITH ROLLBACK IMMEDIATELY ";
        sql += "RESTORE DATABASE" + combodatabase.Text + "From DISK='" + txtrestorefileloc.Text + "'With REPLACE;";

        cmd = new SqlCommand(sql, con);
        cmd.ExecuteNonQuery();

        con.Close();
        con.Dispose();

        MessageBox.Show("Database Successfully Restored");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

2 个答案:

答案 0 :(得分:3)

您在BACKUP DATABASE和数据库名称之间没有任何空格,这将是第一个问题,第二个(恢复)代码也是如此。

您可以在调试模式下附加自己,以便在构建完所有的SQL查询字符串后查看SQL命令是什么。似乎那里缺少很多空白。一旦你拥有它,你可以将它发布在SQL Server Management Studio中并查看那里的错误提示,可能会更容易。

最后但并非最不重要的是,如果您无法轻松调试应用程序或弹出SQL查询(显然不是因为您显示ex.Message的情况),您可以运行SQL Server Profiler会话,用于检查针对SQL Server执行的查询。

答案 1 :(得分:0)

您在SQL语句中缺少一些空格

检查出来:

sql = "BACKUP DATABASE" + combodatabase.Text + " TO DISK='" + ....

如果您选择名为TEST的数据库,则会变为:

BACKUP DATABASETEST TO DISK=.....

或者这个:

sql = "ALTER DATABASE" + combodatabase.Text + "SET SINGLE_USR WITH ROLLBACK IMMEDIATELY ";
sql += "RESTORE DATABASE" + combodatabase.Text + "From DISK='" + txtrestorefileloc.Text + "'With REPLACE;";

变为

ALTER DATABASETESTSET SINGLE_USR WITH ROLLBACK IMMEDIATELY
RESTORE DATABASETESTFrom DISK=......

{strong}需要至少一个空间BACKUP DATABASE和数据库名称之间!整个代码中的一些代码 - 在将关键字和占位符拼接在一起时,您需要更加小心 - 有时它们之间需要空格

此外,如果您的数据库名称以任何方式“特殊”(例如,它本身包含空格,以数字等开头),您可能需要将数据库名称放在方括号中:

BACKUP DATABASE [Test DB] .....

BACKUP DATABASE [7dwarfs] .....