请求帮忙,数据库的复制
各位老师,请大家帮帮我,看一下我的代码问题出在哪里: 我现在在做一个用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 操作异常终止。
先谢谢大家了。。。