| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 493 人关注过本帖
标题:请求帮忙,数据库的复制
只看楼主 加入收藏
xinyu22
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2010-11-5
结帖率:55.56%
收藏
已结贴  问题点数:10 回复次数:2 
请求帮忙,数据库的复制
各位老师,请大家帮帮我,看一下我的代码问题出在哪里: 我现在在做一个用VB代码实现数据库的复制(就是把数据库换个名字,内容不变,还是在本地机器上。)时出现错误。我是这样想的,先在本地机器上指定数据库的备份,然后再在本地机器上创建一个新的数据库(当然数据库名称不重复),然后把刚才的数据库备份文件再恢复到这个新建的数据库上,达到复制数据库,并改名的目的。思路就是这样!可是总是出错,    当然我用的是sql server 2000 。

总是报以下错误:

[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 操作异常终止

代码如下:
‘下面是备份数据库的代码
            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-02 11:09
c1_wangyf
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:7
帖 子:665
专家分:2832
注 册:2010-5-24
收藏
得分:7 
没有仔细的读你的的代码(当然对语法也不是很了解了,哈哈),对于你标记的蓝色部分If (strDBName.ToUpper() = txtDatabase.Text.ToUpper()) ,我想如果这里判断是false才不执行这段,那么你不妨设个断点看看strDBName.ToUpper()的值到底是什么?

另外还有就是你在还原之前应该把要还原的数据库关了(没有看你的代码是不是关了,只是自己的想法啊!!),然后再打开备份过的数据库,还原到以前的数据库里面,我觉得原理应该是这样!!

仅供参考!!
2010-12-02 21:54
xinyu22
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2010-11-5
收藏
得分:0 
晕了。。。还是不行啊。
2010-12-06 12:32
快速回复:请求帮忙,数据库的复制
数据加载中...
 
   



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

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