private void 数据恢复ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                FolderBrowserDialog fbd = new FolderBrowserDialog();
                fbd.Description = "请选择目录";
                fbd.SelectedPath = "C:";
                if (fbd.ShowDialog() == DialogResult.OK)
                {
                    string SqlStr1 = "server=.;database=Northwind;uid=sa;pwd=123";
                    string fileName = fbd.SelectedPath;
                    string SqlStr2 = "restore database Northwind from disk='" + fileName + "备份数据.bak'";
                    SqlConnection conn = new SqlConnection(SqlStr1);
                    conn.Open();
                    SqlCommand cmd = new SqlCommand(SqlStr2, conn);
                    cmd.ExecuteNonQuery();
                    conn.Close();
                    MessageBox.Show("数据文件备份成功", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            catch (Exception er)
            {
                MessageBox.Show(er.Message.ToString());
            } 
未能获得对数据库的排它访问权  该怎么处理哦 还想要个功能如果路径内有这个文件则备份成功 否则弹出该路径下无文件 
帮我改下代码吧!~~顺便有个疑问做的软件给别人安装完 对方没有安装SQL 那软件里需要的数据该保存到哪里去

解决方案 »

  1.   

    因为数据库正在使用,所以未能获得对数据库的排它访问权。 RESTORE DATABASE 操作异常终止。
    --查询分析器中,用下面的代码来处理use master
    goif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_killspid]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[p_killspid]
    GOcreate proc p_killspid
    @dbname sysname--要关闭进程的数据库名
    as  
    declare @s nvarchar(1000)
    declare tb cursor local for
    select s='kill '+cast(spid as varchar)
    from master..sysprocesses 
    where dbid=db_id(@dbname)open tb 
    fetch next from tb into @s
    while @@fetch_status=0
    begin
    exec(@s)
    fetch next from tb into @s
    end
    close tb
    deallocate tb
    go--用法  
    exec p_killspid  'MSLearning' -- 注,MSLearning 为数据库名
    *************************************************************
    以上我是在数据查询分析器里建立了存储过程p_killspid,使用p_killspid。你可以在程序里执行。
      

  2.   

    上面的运行结果 出问题啊
    无法找到数据类型 Northwind。
    参数 '@dbname' 的数据类型无效。
    我对SQL一点都不会
      

  3.   

    Northwind ,你加上单引号了吗?exec p_killspid  'Northwind' 
      

  4.   


    试试SQLDMO
    用代码判断文件是否存在,
    FileInfo   TheFile   =   new   FileInfo("路径");   
      if   (TheFile.Exists)   
      {......}
    总要有数据库才能存数据取数据
      

  5.   

    @dbname sysname--要关闭进程的数据库名
    @dbname 'Northwind'  这里有问题
      

  6.   

    晕。
    @dbname sysname--要关闭进程的数据库名 
    @dbname 'Northwind'  这里有问题你干吗要把 sysname改成“'Northwind'”?
      

  7.   

    private void 数据恢复ToolStripMenuItem_Click(object sender, EventArgs e) 
            { 
                 
                    string path = "e:\test";//自己选个要备份的路径 
                    
                        string SqlStr1 = "server=.;uid=sa;pwd=123"; 
                        
     
                        string sqlstr3 = "backup   database   northwind   to   disk= ' " + path + " '";
                        SqlConnection conn = new SqlConnection(SqlStr1); 
                        conn.Open(); 
                      
                        sqlcommand cmd = new sqlcommand(sqkstr3,conn);
                         try
                {
                    conn.Open();
                    cmd.ExecuteNonQuery();
                    MessageBox.Show("备份成功! ");
                }
                catch
                {
                    MessageBox.Show("备份失败! ");
                }
                finally
                {
                    conn.Close();
                }       }
    觉得数据库的备份就选个具体路径比较好.如果要用SaveFileDialog那就把数据表备份成EXCEL更好吧
    只是个人看法.
      

  8.   

    问题是备份的是个数据库啊 SaveFileDialog 不好用
      

  9.   

    string SqlStr1 = "server=.;database=master;uid=sa;pwd=123";
                        string fileName = fbd.SelectedPath;
                        string SqlStr2 = "restore database Northwind from disk='" + fileName + "备份数据.bak'"; 还原数据库时,应该连到master上。还要保证没有其他进程正在使用 要还原的数据库。
      

  10.   

    用 if(File.Exists("c:\1.txt")) 来判断