【问题标题】:Error In DATABASE RESTORE数据库还原中的错误
【发布时间】:2015-02-11 00:49:42
【问题描述】:
private void restoreBtn_Click(object sender, EventArgs e)
{
        try
        {
            if (databaseCmbBox.Text.CompareTo("") == 0)
            {
                MessageBox.Show("Please Select A Database");
                return;
            }
            con = new SqlConnection(connectionString);
            con.Open();
            sql = "ALTER DATABASE " + databaseCmbBox.Text  +" SET Single_User WITH Rollback Immediate ; RESTORE DATABASE " +
            databaseCmbBox.Text + " FROM DISK = @PATH WITH REPLACE ; ALTER DATABASE " + databaseCmbBox.Text + " SET Multi_User ;";
            comm.Parameters.AddWithValue("@PATH", databaseRestorePath.Text);
            comm.CommandTimeout = 86400000;


            //sql = "Alter Database "+databaseCmbBox.Text+" Set SINGLE_USER WITH ROLLBACK IMMEDIATE";
            //sql += "RESTORE Database " + databaseCmbBox.Text + " FROM DISK = '" + databaseRestorePath.Text + "' WITH REPLACE";
            comm = new SqlCommand(sql, con);
            comm.ExecuteNonQuery();

            con.Close();
            con.Dispose();
            MessageBox.Show("Database Succesfully Restored");

        }
        catch (Exception)
        {

            throw;
        }
}

请这段代码抛出这个错误,

WindowsFormsApplication1.exe 中出现“System.Data.SqlClient.SqlException”类型的未处理异常

附加信息:必须声明标量变量“@PATH”。

关键字“with”附近的语法不正确。如果这个语句是一个公用表表达式、一个 xmlnamespaces 子句或一个更改跟踪上下文子句,则前面的语句必须以分号结束。

请问这段代码有什么错误?

【问题讨论】:

  • 你向 comm 添加参数,然后创建新的 comm 实例!
  • 非常感谢...我真的没有看到那个错误。现在可以了。

标签: c# sql sql-server winforms


【解决方案1】:

参数应在主查询字符串定义后添加。

 private void restoreBtn_Click(object sender, EventArgs e)
    {
        try
        {
            if (databaseCmbBox.Text.CompareTo("") == 0)
            {
                MessageBox.Show("Please Select A Database");
                return;
            }
            con = new SqlConnection(connectionString);
            con.Open();
            sql = "ALTER DATABASE " + databaseCmbBox.Text  +" SET Single_User WITH Rollback Immediate ; RESTORE DATABASE " +
            databaseCmbBox.Text + " FROM DISK = @PATH WITH REPLACE ; ALTER DATABASE " + databaseCmbBox.Text + " SET Multi_User ;";
            comm.CommandTimeout = 86400000;


            //sql = "Alter Database "+databaseCmbBox.Text+" Set SINGLE_USER WITH ROLLBACK IMMEDIATE";
            //sql += "RESTORE Database " + databaseCmbBox.Text + " FROM DISK = '" + databaseRestorePath.Text + "' WITH REPLACE";
            comm = new SqlCommand(sql, con);
            comm.Parameters.AddWithValue("@PATH", databaseRestorePath.Text);
            comm.ExecuteNonQuery();

            con.Close();
            con.Dispose();
            MessageBox.Show("Database Succesfully Restored");

        }
        catch (Exception)
        {

            throw;
        }

【讨论】:

    【解决方案2】:

    我认为您的代码有些混乱。在声明它之前使用 comm 变量(也许这也是一个错误)但是 第一个

    comm = new SqlCommand(sql, con);
    

    然后

    comm.Parameters.AddWithValue("@PATH", databaseRestorePath.Text);
    comm.CommandTimeout = 86400000;
    

    第二个显示完整的sql命令,因为

    sql = "ALTER DATABASE " + databaseCmbBox.Text  +" SET Single_User WITH Rollback Immediate ; RESTORE DATABASE " +
    

    不完整(以+结尾)

    第三个我建议你在 using 语句中使用 SqlConnection 以确保它总是被释放

    using (SqlConnection connection = new SqlConnection(connectionString)) 
    {}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多