还原数据库时,揭示"数据库正在使用"

xilaianzxsc 2011-03-29 05:15:49
vfp+SQL

备份已经会了,现学"还原"

现对SQL数据库进行还原时,使用的是下列命令:

nhandle=sqlstringconnect("driver=sql server;server=lyf;uid=;pwd=;database=lyf2010")

If SQLExec(nhandle,"restore database lyf2010 from disk='c:\windows\desktop\数据库备份.BAK'")>0
Messagebox("恢复完成!",64,"信息提示")
Else
Messagebox("恢复失败,可能有用户正在操作数据!",16,"信息提示")
Endif

出错提示为:恢复失败,可能有用户正在操作数据

用aerror()函数进行错误跟踪,提示如下错误:
[Microsoft][ODBC SQL Server Driver][SQL Server]因为数据库正在使用

说明:程序运行时,已经打开了此数据库,再用备份件恢复时,肯定无法恢复.

问:如何将一个"打开着的SQL数据库"暂关了?

先关,再恢复,恢复成功后,再开.

这个过程,如何写代码?
...全文
98 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
xilaianzxsc 2011-03-30
  • 打赏
  • 举报
回复
我来仔细研究一下.

14楼的分析,极有道理
都市夜猫 2011-03-30
  • 打赏
  • 举报
回复
不能停止服务,停掉后你的程序如何向 sql server 发送指令?只有在修复数据库时才有可能需要停止服务。

恢复数据库的基本条件有两条:
一是要切换到 master,而是可以切换到单用户状态(与 vfp 中可以独占使用表类似)
关键代码如下:

cSqlCmd = "use master"
SQLExec(nHandle, cSqlCmd )
cSqlCmd = "Exec sp_dboption '要恢复的数据库名', single, true"
nResult = SQLExec(nHandle, cSqlCmd)
If -1 == nResult
* 报错: 无法切换到单用户模式。可能确实有其他用户在使用,或者当前用户无权限等原因
* 用 AError 函数取出并显示错误信息
Return .F.
EndIf

* 再检查一下,确保已切换到单用户工作模式
cSqlCmd = "Exec sp_dboption '要恢复的数据库名', single"
nResult = SQLExec(nHandle, cSqlCmd, '_temp')
If Upper(_temp.CurrentSetting) <> 'ON'
* 报错: 无法切换到单用户模式。
Use In _temp
Return .F.
EndIf
Use In _temp

cSqlCmd = "Restore Database 要恢复的数据库名 From Disk='备份文件完整路径' With Replace"
nResult = SQLExec(nHandle, cSqlCmd)
* 检查恢复操作是否成功
* ...
* 最后退出单用户工作模式
cSqlCmd = "Exec sp_dboption '被恢复的数据库名', single, false"
* ...

xilaianzxsc 2011-03-29
  • 打赏
  • 举报
回复
明天再继续吧...今天先回家了.

先谢谢各位老师了
needacoder 2011-03-29
  • 打赏
  • 举报
回复
学习了
xilaianzxsc 2011-03-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wwwwb 的回复:]
引用 7 楼 xilaianzxsc 的回复:
引用 2 楼 apple_8180 的回复:
你连接 database=lyf2010 这个库,又恢复这个库,当然不行,在恢复前将所有连接此库的句柄,要么断开,要么先 Use Master,才能再恢复


问:断开,如何写代码?

SQLDISCONNECT(0)
再连接SQLSERVER
[/Quote]

请问老师:SQLDISCONNECT(0)放在下面的代码中的哪个位置?


nhandle=sqlstringconnect("driver=sql server;server=lyf;uid=;pwd=;database=lyf2010")

If SQLExec(nhandle,"restore database lyf2010 from disk='c:\windows\desktop\数据库备份.BAK'")>0
Messagebox("恢复完成!",64,"信息提示")
Else
Messagebox("恢复失败,可能有用户正在操作数据!",16,"信息提示")
Endif
wwwwb 2011-03-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xilaianzxsc 的回复:]
引用 2 楼 apple_8180 的回复:
你连接 database=lyf2010 这个库,又恢复这个库,当然不行,在恢复前将所有连接此库的句柄,要么断开,要么先 Use Master,才能再恢复


问:断开,如何写代码?
[/Quote]
SQLDISCONNECT(0)
再连接SQLSERVER


xilaianzxsc 2011-03-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wwwwb 的回复:]
!"NET STOP SQL服务名"
OR
用WINEXEC、ShellExecute来运行 NET STOP SQL服务名
[/Quote]

我试下哦~~
wwwwb 2011-03-29
  • 打赏
  • 举报
回复
!"NET STOP SQL服务名"
OR
用WINEXEC、ShellExecute来运行 NET STOP SQL服务名
xilaianzxsc 2011-03-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 apple_8180 的回复:]
你连接 database=lyf2010 这个库,又恢复这个库,当然不行,在恢复前将所有连接此库的句柄,要么断开,要么先 Use Master,才能再恢复
[/Quote]

问:断开,如何写代码?
xilaianzxsc 2011-03-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wwwwb 的回复:]
引用 3 楼 xilaianzxsc 的回复:
用工停SQLSERVER服务,是不现实的.

毕竟是写在程序里.

就一个按钮"恢复数据库",这个按钮里面,要把所有问题都解决了.

而不是另外再手工停SQLSERVER服务

用代码也可以,参考 NET STOP SQL服务
[/Quote]

愿闻其详
wwwwb 2011-03-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xilaianzxsc 的回复:]
用工停SQLSERVER服务,是不现实的.

毕竟是写在程序里.

就一个按钮"恢复数据库",这个按钮里面,要把所有问题都解决了.

而不是另外再手工停SQLSERVER服务
[/Quote]
用代码也可以,参考 NET STOP SQL服务
xilaianzxsc 2011-03-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 apple_8180 的回复:]
你连接 database=lyf2010 这个库,又恢复这个库,当然不行,在恢复前将所有连接此库的句柄,要么断开,要么先 Use Master,才能再恢复
[/Quote]

我试试.稍等
xilaianzxsc 2011-03-29
  • 打赏
  • 举报
回复
用工停SQLSERVER服务,是不现实的.

毕竟是写在程序里.

就一个按钮"恢复数据库",这个按钮里面,要把所有问题都解决了.

而不是另外再手工停SQLSERVER服务
十豆三 2011-03-29
  • 打赏
  • 举报
回复
你连接 database=lyf2010 这个库,又恢复这个库,当然不行,在恢复前将所有连接此库的句柄,要么断开,要么先 Use Master,才能再恢复

wwwwb 2011-03-29
  • 打赏
  • 举报
回复
最简单的方法,先停SQLSERVER服务,再启动,这样就可以了,呵呵

2,722

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧