| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 778 人关注过本帖
标题:请求帮忙,数据库的复制
只看楼主 加入收藏
xinyu22
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2010-11-5
结帖率:55.56%
收藏
已结贴  问题点数:0 回复次数:7 
请求帮忙,数据库的复制
各位老师,请大家帮帮我,看一下我的代码问题出在哪里: 我现在在做一个用VB代码实现数据库的复制(就是把数据库换个名字,内容不变,还是在本地机器上。)时出现错误。我是这样想的,先在本地机器上指定数据库的备份,然后再在本地机器上创建一个新的数据库(当然数据库名称不重复),然后把刚才的数据库备份文件再恢复到这个新建的数据库上,达到复制数据库,并改名的目的。思路就是这样!可是总是出错,    当然我用的是sql server 2000 。
代码如下:
‘下面是备份数据库的代码
            Dim sqlserver As New SQLDMO.SQLServer
            Dim backup As New SQLDMO.Backup
            Try
                sqlserver.LoginSecure = False
                sqlserver.Connect(txtServer.Text.Trim(), txtUsername.Text.Trim(), txtPwd.Text.Trim())
                backup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database
                backup.Database = "studb"
                backup.Files = "c:\database.bak"          ’这里我是写死的。应该没有关系吧!下面还原的时候还是用这个
                backup.BackupSetName = "studb"
                backup.BackupSetDescription = "数据库备份"
                backup.Initialize = True
                backup.SQLBackup(sqlserver)               
            Catch ex As Exception
                MsgBox(ex.Message, MsgBoxStyle.OkOnly, "提示")
            Finally
                sqlserver.DisConnect()
            End Try
上面的备份代码执行起来没有问题,可以备份到c盘里。接下来就是还原:

‘下面是还原的代码:
        Dim tmpserver As New SQLDMO.SQLServer
        Dim conn As New SqlConnection
        Try
            conn.ConnectionString = "server=(local);user id=sa; password=;Initial Catalog="
            Dim command As New SqlCommand
            command.Connection = conn
            ' txtDatabase.Text  是用户输入的新数据库的名称,因为这个数据库不存在,所以我就先把这个数据库 txtDatabase.Text  用代码创建出来,然后再给它还原。
            ’下面是创建新数据库的代码,将主数据库文件和日志文件放在D盘的database 文件夹里
            Dim strsql = "use master     create database " & txtDatabase.Text.Trim() & " on primary  (Name =" & txtDatabase.Text.Trim() & _
                            "_data,filename='D:\database\" & txtDatabase.Text.Trim() & ".mdf',size=10,filegrowth=10%) " & _
                            " log on (name =" & txtDatabase.Text.Trim() & "_log,filename='D:\database\" &  
txtDatabase.Text.Trim() & ".ldf',size=3,filegrowth=1)"
             = strsql
            conn.Open()
            command.ExecuteNonQuery()
            conn.Close()
            '执行上面的创建数据库代码也是没有问题  可以创建  txtDatabase.Text 数据库
            
            ‘下面是还原数据库代码
            Dim tmprestore As New SQLDMO.Restore
            tmprestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database
            Dim qr As SQLDMO.QueryResults
            qr = tmpserver.EnumProcesses(-1)
            Dim iColPIDNum As Integer = -1
            Dim iColDbName As Integer = -1
            Dim i As Integer
            '杀死其它的连接进程
            For i = 1 To qr.Columns  
                Dim strName As String = qr.ColumnName(i)
                If (strName.ToUpper().Trim() = "SPID") Then
                    iColPIDNum = i
                ElseIf (strName.ToUpper().Trim() = "DBNAME") Then
                    iColDbName = i
                End If
                If (iColPIDNum <> -1 And iColDbName <> -1) Then
                    Exit For
                End If
            Next
            For i = 1 To qr.Rows

                Dim lPID As Integer = qr.GetColumnLong(i, iColPIDNum)
                Dim strDBName As String = qr.GetColumnString(i, iColDbName)
                If (strDBName.ToUpper() = txtDatabase.Text.ToUpper()) Then     ‘杀 txtDatabase.Text  数据库进程,这里我测试过如果将 txtDatabase.Text替换为studb  也是不可以 ,程序根本就不走这段 tmpserver.KillProcess(lPID)。郁闷。。。
                    tmpserver.KillProcess(lPID)
                End If
            Next
            tmprestore.Files = "c:\database.bak"     ’这里是之前备份的文件
            tmprestore.FileNumber = 1
            tmprestore.Database = txtDatabase.Text.Trim()   ‘设置数据库的名称为用户输入的
            tmprestore.ReplaceDatabase = True
            tmprestore.SQLRestore(tmpserver)      ‘ 每次执行到里,总是会报错。???????
            MsgBox("数据恢复成功。", MsgBoxStyle.OkOnly, "系统提示")            
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.OkOnly, "提示")
        Finally
            tmpserver.DisConnect()
        End Try

总是报以下错误:

[Microsoft][ODBC SQL Server Driver][SQL Server]无法重写文件 'D:\database\studb_Data.MDF'。数据库 'studb' 正在使用该文件。
[Microsoft][ODBC SQL Server Driver][SQL Server]文件 '连锁销售系统_Data' 无法还原为 'D:\database\studb_Data.MDF'。请使用 WITH MOVE 选项来标识该文件的有效位置。
[Microsoft][ODBC SQL Server Driver][SQL Server]无法重写文件 'D:\database\studb_Log.LDF'。数
据库 'studb' 正在使用该文件。
[Microsoft][ODBC SQL Server Driver][SQL Server]文件 '连锁销售系统_Log' 无法还原为  
'D:\database\studb_Log.LDF'。请使用 WITH MOVE 选项来标识该文件的有效位置。
[Microsoft][ODBC SQL Server Driver][SQL Server] RESTORE DATABASE 操作异常终止。

先谢谢大家了。。。

搜索更多相关主题的帖子: 数据库 请求 
2010-12-01 17:18
xinyu22
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2010-11-5
收藏
得分:0 
补充一句: 新建的数据库没有做任何操作,怎么会报正在使用呢?
2010-12-01 17:22
不说也罢
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:39
帖 子:1481
专家分:4989
注 册:2007-10-7
收藏
得分:7 
‘下面是还原数据库代码
            Dim tmprestore As New SQLDMO.Restore
            tmprestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database'在这行代码下面添加下面的两行代码

tmpserver.LoginSecure = False
tmpserver.Connect("你的服务器名", "sa", "你的密码")'tmpserver不创建连接,你代码怎么不出错呀?

===================================================
讨厌C#的行尾的小尾巴;和一对大括号{ }
===================================================
2010-12-04 17:23
不说也罢
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:39
帖 子:1481
专家分:4989
注 册:2007-10-7
收藏
得分:0 
程序代码:
       Dim tmprestore As SQLDMO.Restore = New SQLDMO.Restore
        Dim tmpserver As SQLDMO.SQLServer = New SQLDMO.SQLServer
        Try
            tmpserver.LoginSecure = False
            tmpserver.Connect("(local)", "sa", "")
            tmprestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database
            tmprestore.Database = "studb"
            tmprestore.Files = "c:\database.bak"
            tmprestore.FileNumber = 1
            tmprestore.ReplaceDatabase = True
            tmprestore.SQLRestore(tmpserver)
            MsgBox("数据库已经被成功恢复!")
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.OkOnly, "提示")
        Finally
            tmpserver.DisConnect()
        End Try

以上代码在 + SQLSERVER2000中测试恢复数据通过

===================================================
讨厌C#的行尾的小尾巴;和一对大括号{ }
===================================================
2010-12-04 17:25
xinyu22
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2010-11-5
收藏
得分:0 
tmpserver  已经连接上去了。连接写在前面。。。如果没有写连接的话,   tmpserver.LoginSecure = False   这句代码就报错了。哪能执行到还原的时候才报错啊!

还是晕啊 。。。
 
2010-12-06 12:36
不说也罢
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:39
帖 子:1481
专家分:4989
注 册:2007-10-7
收藏
得分:0 
以下是引用xinyu22在2010-12-6 12:36:17的发言:

tmpserver  已经连接上去了。连接写在前面。。。如果没有写连接的话,   tmpserver.LoginSecure = False   这句代码就报错了。哪能执行到还原的时候才报错啊!

还是晕啊 。。。
 
我还晕呢。下面给你完整代码

===================================================
讨厌C#的行尾的小尾巴;和一对大括号{ }
===================================================
2010-12-06 12:37
不说也罢
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:39
帖 子:1481
专家分:4989
注 册:2007-10-7
收藏
得分:0 
程序代码:
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim tmpserver As New SQLDMO.SQLServer
        'Dim conn As New SqlConnection
        Try
            'conn.ConnectionString = "SERVER=.;uid=sa;pwd=;database=master"
            'Dim command As New SqlCommand
            'command.Connection = conn
            '' txtDatabase.Text  是用户输入的新数据库的名称,因为这个数据库不存在,所以我就先把这个数据库 txtDatabase.Text  用代码创建出来,然后再给它还原。
            ''下面是创建新数据库的代码,将主数据库文件和日志文件放在D盘的database 文件夹里
            ''Dim strsql = "use master     create database " & txtDatabase.Text.Trim() & " on primary  (Name =" & txtDatabase.Text.Trim() & _
            ''                "_data,filename='D:\database\" & txtDatabase.Text.Trim() & ".mdf',size=10,filegrowth=10%) " & _
            ''                " log on (name =" & txtDatabase.Text.Trim() & "_log,filename='D:\database\" & txtDatabase.Text.Trim() & ".ldf',size=3,filegrowth=1)"
            '' = strsql
            ''conn.Open()
            ''command.ExecuteNonQuery()
            ''conn.Close()
            ' ''执行上面的创建数据库代码也是没有问题  可以创建  txtDatabase.Text 数据库

            ''下面是还原数据库代码
            Dim tmprestore As New SQLDMO.Restore
            tmprestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database
            tmpserver.LoginSecure = False
            tmpserver.Connect("(local)", "sa", "")
            Dim qr As SQLDMO.QueryResults
            qr = tmpserver.EnumProcesses(-1)
            Dim iColPIDNum As Integer = -1
            Dim iColDbName As Integer = -1
            Dim i As Integer
            '杀死其它的连接进程
            For i = 1 To qr.Columns
                Dim strName As String = qr.ColumnName(i)
                If (strName.ToUpper().Trim() = "SPID") Then
                    iColPIDNum = i
                ElseIf (strName.ToUpper().Trim() = "DBNAME") Then
                    iColDbName = i
                End If
                If (iColPIDNum <> -1 And iColDbName <> -1) Then
                    Exit For
                End If
            Next
            For i = 1 To qr.Rows

                Dim lPID As Integer = qr.GetColumnLong(i, iColPIDNum)
                Dim strDBName As String = qr.GetColumnString(i, iColDbName)
                If (strDBName.ToUpper() = txtDatabase.Text.ToUpper()) Then     '杀 txtDatabase.Text  数据库进程,这里我测试过如果将 txtDatabase.Text替换为studb  也是不可以 ,程序根本就不走这段 tmpserver.KillProcess(lPID)。郁闷。。。
                    tmpserver.KillProcess(lPID)
                End If
            Next
            tmprestore.Files = "c:\database.bak"     '这里是之前备份的文件
            tmprestore.FileNumber = 1
            tmprestore.Database = txtDatabase.Text.Trim()   '设置数据库的名称为用户输入的
            tmprestore.ReplaceDatabase = True
            tmprestore.SQLRestore(tmpserver)      ' 每次执行到里,总是会报错。???????
            MsgBox("数据恢复成功。", MsgBoxStyle.OkOnly, "系统提示")
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.OkOnly, "提示")
        Finally
            tmpserver.DisConnect()
        End Try

    End Sub

这是我在你原来的代码基础上修改的。将上面代码复制过去直接使用。
最好你新建一个项目进行本代码的测试。不要修改注释部分。
tmpserver.Connect("(local)", "sa", "")这一句你可以修改SERVER的连接参数

===================================================
讨厌C#的行尾的小尾巴;和一对大括号{ }
===================================================
2010-12-06 12:45
不说也罢
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:39
帖 子:1481
专家分:4989
注 册:2007-10-7
收藏
得分:0 
有什么问题欢迎再来探讨。如果你仍未测试通过,请将catch注释掉,看程序断点在什么地方

===================================================
讨厌C#的行尾的小尾巴;和一对大括号{ }
===================================================
2010-12-06 12:46
快速回复:请求帮忙,数据库的复制
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019249 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved