Dim ret As Integer
If Text1.Text = "" Then
    MsgBox "请选择要恢复的数据文件!", vbInformation, "提示"
    Exit Sub
Else
    ret = MsgBox("数据恢复操作将会覆盖以前的所有数据并且覆盖后无法恢复,您确定要进行恢复操作吗?", vbQuestion + vbOKCancel + "提示")
    If ret = vbOK Then
        Me.MousePointer = 11
        Dim cn As New ADODB.Connection
        Dim s_restore As String
        'Debug.Print gs_conn_string
'此时需要连接master数据库才能完成数据恢复操作
        cn.Open "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=7;Initial Catalog=master;Data Source=127.0.0.1 "
'同上wzgl为需要恢复的数据库
        s_restore = "restore database student1 from disk='" + Trim(Text1.Text) + "'"
'text1一个用于记录需要恢复文件的地址的textbox
        cn.Execute s_restore
        cn.BeginTrans        
        If Err.Number = 0 Then
            cn.CommitTrans
            MsgBox "数据恢复成功!", vbInformation, "提示"
        Else
            cn.RollbackTrans
            MsgBox "数据恢复失败!", vbCritical, "提示"
        End If
        cn.Close
        Set cn = Nothing
        Me.MousePointer = 1
    Else
        Exit Sub
    End If
End If在没有其它程序连接SQL SERVER 的时候它能实现恢复备份的功能但是我想在SQL SERVER被连接状态恢复数据库!提示“数据库在使用,为获得数据库的排它访问权”实时错误!请问各位老大怎么解决呢!急!!!!!!!!!!!!!!

解决方案 »

  1.   

    将当前默认数据库改为master,实现如下:
    AdoCon.DefaultDatabase = "master" '将当前默认数据库改为master
    AdoCon.Execute "set noexec off set parseonly off "
    AdoCon.Execute " restory database cargps to disk= 'e:\backup\xxx'"
    AdoCon.Execute "user xxx"
      

  2.   

    做两个工程,一个是主工程,一个是数据恢复工程,同时生成两个EXE文件,在恢复数据库时先保存数据,关闭主工程,运行恢复数据库程序,之后再回到主程序,只能这样啦,连接时不能恢复的,备份可以。
      

  3.   

    先断开当前连接,然后重新连接服务器,不要指定默认数库,即不指定Initial Catalog.
      

  4.   

    这是数据库规定的,你去sql server里面手动恢复也会出现这种结果!!按规定就是要退出所有程序!不明白你为什么一定要连着数据库恢复!那样数据也不安全!
      

  5.   

    问题已经解决了!散点源程序给所有和我一样的朋友!If Text1.Text = "" Then
        MsgBox "请选择要恢复的数据文件!", vbInformation, "提示"
        Exit Sub
    Else
        ret = MsgBox("数据恢复操作将会覆盖以前的所有数据并且覆盖后无法恢复,您确定要进行恢复操作吗?", vbQuestion + vbOKCancel, "提示")
        If ret = vbOK Then
             Label1.Visible = True
             Command1.Enabled = False
             Me.MousePointer = 11
             Shell "scm -silent 1 -action 2  -service mssqlserver " 'Specfied sqlserver service
             Sleep 100
             Dim cn As New ADODB.Connection
             Dim s_restore As String
             'Debug.Print gs_conn_string
             '此时需要连接master数据库才能完成数据恢复操作
            cn.Open "Provider=SQLOLEDB.1;server=123;Persist Security Info=False;Initial Catalog=master;Data Source=127.0.0.1;user id=sa;password=7"
             '同上student1为需要恢复的数据库
            s_restore = "restore database student1 from disk='" + Trim(Text1.Text) + "'"
             'text1一个用于记录需要恢复文件的地址的textbox
            cn.Execute s_restore
            cn.BeginTrans
            If Err.Number = 0 Then
                cn.CommitTrans
                MsgBox "数据恢复成功!", vbInformation, "提示"
                Command1.Enabled = True
                Label1.Visible = False
            Else
                cn.RollbackTrans
                MsgBox "数据恢复失败!", vbCritical, "提示"
                Command1.Enabled = True
            End If
            cn.Close
            Set cn = Nothing
            Me.MousePointer = 1
        Else
            Exit Sub
        End If
        On Error Resume Next
        Dim DBC As New DataBaseConnection
        If db.State = 1 Then
           db.Close
        End If
        db.ConnectionString = DBC.SqlConnectString(d1, d2, d3)
        rs.CursorType = adOpenDynamic
        rs.CursorLocation = adUseClient
        rs.LockType = adLockOptimistic
        db.CursorLocation = adUseClient
        db.Open
        Set cmd.ActiveConnection = db
        If Err.Number Then
           MsgBox Err.Description, 16 + vbOKOnly, Err.Number
           Exit Sub
        End If
        db.DefaultDatabase = "student1"
        If Err.Number Then
           MsgBox Err.Description, 16 + vbOKOnly, Err.Number
           Exit Sub
        End If
    End If
      

  6.   

    但还有一相求!就是cn.Open "Provider=SQLOLEDB.1;server=123;Persist Security Info=False;Initial Catalog=master;Data Source=127.0.0.1;user id=sa;password=7"这句的server它的值能不能是一个变量的值比如!dim x as stringx=不同机器上的计算机名称然后想做到我的程序在不同的机器上也能运行!
    我是这样做的!cn.Open "Provider=SQLOLEDB.1;server='" & x & "';Persist Security Info=False;Initial Catalog=master;Data Source=127.0.0.1;user id=sa;password=7"在执行到这条语句之前已经有值了!为什么不能运行呢!难道server=....这句只能指定值不能是变量值吗!还望各位帮帮忙!谢谢!
      

  7.   

    cn.Open "Provider=SQLOLEDB.1;server=" & x & ";Persist Security Info=False;Initial Catalog=master;Data Source=127.0.0.1;user id=sa;password=7"
      

  8.   

    cn.ConnectionTimeout = 25
        cn.Provider = "sqloledb"
        cn.Properties("Data Source").Value = sServerName
        cn.Properties("Initial Catalog").Value = sDatabaseName    
        cn.Properties("User ID").Value = sUserName
        cn.Properties("Password").Value = sPassword    cn.Open
      

  9.   

    to zsgzsgzsg(zsg) ( ) 你的办法不行的!不能在这个语句中再有“”这样它会出错的!还有更方便的方法吗!最好是不要改变语句的格式!谢谢了!
      

  10.   

    to  xksboth(☆凌云☆) 
    你可以把这些信息写在ini文件中,然后,读取这些信息
      

  11.   

    '.ini文件的相关源代码
    Public Function GetProfile(strFileName As String, strSection As String, strName As String) As String
      '这个函数是用来对INI文件进行读操作的
      '函数说明:
      'strFileName 是所要读取的文件名
      'strSection  是这个文件中的一个节点名
      'strName 是所要查找的字段名
      '返回值:
       strSectionTemp = ""
       strNameTemp = ""
       strreturn = ""
       On Error GoTo ErrSrchSection
       Open strFileName For Input As #1
       ' 下面这段程序是用来查找节点的
         Do While Not EOF(1)
            strCharA = Input(1, #1)
            If strCharA = "[" Then
               Do While Not EOF(1)
                 strCharB = Input(1, #1)
                 If strCharB = "]" Then Exit Do
                 strSectionTemp = strSectionTemp & strCharB
               Loop
            End If
            If strSectionTemp = strSection Then
              strCharA = Input(2, #1)
              Exit Do
            Else
              strSectionTemp = ""
            End If
         Loop
     On Error GoTo ErrReadFile
      
    aa:
        '下面这段程序是用来查找所要查找的字段的
        strNameTemp = ""
        Do While Not EOF(1)
          strCharA = Input(1, #1)
          If strCharA <> "=" Then
            strNameTemp = strNameTemp & strCharA  '得到名称
          Else
            Exit Do
          End If
        Loop
            If strNameTemp = strName Then
                Line Input #1, strreturn  '如果找到与它匹配的字段名,就返回得到的值
            Else
                Line Input #1, strreturn  '如果未找到与它匹配的字段名,就继续找
                GoTo aa
            End If
        Close #1
        GetProfile = strreturn
        Exit Function
    ErrReadFile:
        Dim inrRet As Integer
        intret = MsgBox("在文件中没有找到所要查找的字段", vbAbortRetryIgnore, "错误信息")
        Select Case intret
           Case vbAbort
              GetProfile = ""
              Close #1
              Exit Function
           Case vbRetry
              Resume
           Case vbIgnore
              Resume Next
         End Select
    ErrSrchSection:
         MsgBox "节点未找到", vbOKOnly
         GetProfile = ""
         Close #1
    End Function
      

  12.   

    还有,关于还原数据库的问题,我请教过别人,给了我这样的一个存储过程:
    create  proc  killspid  (@dbname  varchar(20))  
    as  
    begin  
    declare  @sql  nvarchar(500)  
    declare  @spid  int  
    set  @sql='declare  getspid  cursor  for    
    select  spid  from  sysprocesses  where  dbid=db_id('''+@dbname+''')'  
    exec  (@sql)  
    open  getspid  
    fetch  next  from  getspid  into  @spid  
    while  @@fetch_status  <  >-1  
    begin  
    exec('kill  '+@spid)  
    fetch  next  from  getspid  into  @spid  
    end  
    close  getspid  
    deallocate  getspid  
    end
    该存储过程,用来结束当前数据库进程。很好用。
    在还原数据库前,先kill当前的数据库进程,就可以还原了。
      

  13.   

    问题已经解决!在此感谢-131-(咕咚)yem9(嘟嘟猫) ( )  zsgzsgzsg(zsg) ( ) 还有版主大哥lihonggen0(李洪根,用.NET,标准答案来了) ( ) 小弟已经发了散分的贴子!请各位界时光临!再次表示感谢!http://expert.csdn.net/Expert/topic/1580/1580905.xml?temp=9.026736E-02