//备份数据
conn.Open();
comm = new SqlCommand("backup database qykhgl to disk= 'c:\\a.bak',conn);
comm.ExecuteNonQuery();
conn.Close();
//恢复数据
conn.Open();
comm = new SqlCommand("restore database qykhgl from disk= 'c:\\a.bak',conn);
comm.ExecuteNonQuery();
conn.Close();
.......
为什么我使用以上的方法备份据库可以实现,但是我恢复备份的时候,就提示:数据库正在使用,无法进行排它访问.请高手指教!多谢!

解决方案 »

  1.   

    http://community.csdn.net/Expert/topic/3999/3999833.xml?temp=.9515039
      

  2.   

    呵呵,好久没来这个地方了
    你的这个问题是你正在用这个数据库,所以你无法来恢复!
    我的解决主案是你应该在master库里面写一个存储过程
    CREATE PROCEDURE RestoreDataBase
    AS
    alter database qykhgl set  OFFLINE
             restore database qykhgl from disk='c:\a.dat'
    alter database qykhgl  set  ONLINE
    GO
    这样才能备份你的数据库!
      

  3.   

    就是说直接用这句话restore database qykhgl from disk= 'c:\\a.bak'不行吗?
      

  4.   

    private void BackupDB(string strDbName)//数据库备份  需要在窗体中放Label,ProgrssBar控件用来显示提示信息和进度条,还有OpenFileDialog,和SaveFileDialog控件
    {
    if (saveFileDialog1.ShowDialog() == DialogResult.OK)
    {

    this.Cursor = Cursors.WaitCursor;
    this.label1.Text = "正在进行数据备份,这可能需要几秒或更长时间,请稍候...";
    this.label1.Visible = true; 
    this.label1.Refresh();
    this.pBar1.Visible = true;
    //------------------------------------------------------------------------------------   
    string selfName = saveFileDialog1.FileName.Trim();
    //string deviceName = "bozhaobeifen";
    //string re = "备份测试";
       
    //◆数据备份:
    SQLDMO.Backup oBackup = new SQLDMO.BackupClass();
    SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
    oBackup.Action = 0 ; 
    oBackup.Initialize = true ; 
    SQLDMO.BackupSink_PercentCompleteEventHandler pceh = new SQLDMO.BackupSink_PercentCompleteEventHandler(Step); 
    oBackup.PercentComplete += pceh;  try
    {
    oSQLServer.LoginSecure = false;
    oSQLServer.Connect(gb.GetJQName(), "sa", "sa");
    oBackup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
    oBackup.Database = strDbName;//数据库名
    oBackup.Files = selfName;//文件路径
    //oBackup.BackupSetName = deviceName;//备份名称
    //oBackup.BackupSetDescription = re;//备份描述
    oBackup.Initialize = true;
    oBackup.SQLBackup(oSQLServer);
    MessageBox.Show("数据库备份成功!","系统提示!",MessageBoxButtons.OK,MessageBoxIcon.Warning);
    }
    catch(System.Exception ex)
    {
    MessageBox.Show("数据库备份失败!请不要选择备份到桌面!\n\n"+ ex.ToString());
    }
    finally
    {
    oSQLServer.DisConnect();
    } //------------------------------------------------------------------------------------
    this.label1.Text = "";
    this.label1.Visible = false;
    this.pBar1.Visible = false;
    this.Cursor = Cursors.Default;

    }
    } /// <summary>
    /// 显示进度条
    /// </summary>
    private void Step(string message,int percent) 

    this.pBar1.Value = percent ; 
    }
    public void RestoreDB(string strDbName)//数据恢复

    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
    this.label1.Visible = true;
    this.label1.Refresh();
    this.pBar1.Visible = true;
    this.label1.Text = "进行数据库恢复,这可能需要几秒或更长时间,请稍候...";
    SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass() ; 
    try 

    svr.Connect(gb.GetJQName(),"sa","sa") ; 
    //杀死所有有关的进程
    SQLDMO.QueryResults qr = svr.EnumProcesses(-1) ; 
    int iColPIDNum = -1 ; 
    int iColDbName = -1 ; 
    for(int i=1;i<=qr.Columns;i++) 

    string strName = qr.get_ColumnName(i) ; 
    if (strName.ToUpper().Trim() == "SPID") 

    iColPIDNum = i ; 

    else if (strName.ToUpper().Trim() == "DBNAME") 

    iColDbName = i ; 

    if (iColPIDNum != -1 && iColDbName != -1) 
    break ; 
    }  for(int i=1;i<=qr.Rows;i++) 

    int lPID = qr.GetColumnLong(i,iColPIDNum) ; 
    string strDBName = qr.GetColumnString(i,iColDbName) ; 
    if (strDBName.ToUpper() == strDbName.ToUpper()) 
    svr.KillProcess(lPID) ; 
    }  SQLDMO.Restore res = new SQLDMO.RestoreClass() ; 
    res.Action = 0 ; 
    SQLDMO.RestoreSink_PercentCompleteEventHandler pceh = new SQLDMO.RestoreSink_PercentCompleteEventHandler(Step); 
    res.PercentComplete += pceh; 
    res.Files = openFileDialog1.FileName.Trim() ; 
    res.Database = strDbName ; 
    res.ReplaceDatabase = true ; 
    res.SQLRestore(svr) ; 
    MessageBox.Show("数据库恢复成功!","系统提示!",MessageBoxButtons.OK,MessageBoxIcon.Warning);

    catch(Exception err) 

    throw(new Exception("恢复数据库失败,请关闭所有和该数据库连接的程序!\n如果在桌面进行恢复请改变路径!\n\n"+err.Message)) ; 

    finally 

    svr.DisConnect() ; 

    this.label1.Visible = false;
    this.pBar1.Visible = false;
    }
      

  5.   

    上面方法copy就可以用。把两个方法分别放在单击事件中即可