数据库还原中的问题。

xlz0306 2003-08-20 01:45:01
在数据库还原中,遇到这样的问题:说要还原的数据库正在访问,不能获得该数据库操作的排他操作。
可是我运行程序的时候就是连数据库的,关掉了还怎么还原啊?

请教:
...全文
35 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
xlz0306 2003-08-25
  • 打赏
  • 举报
回复
300 分哪! 天文数字哎!

我先的把我给卖了才有分给你 :)
ljianq 2003-08-22
  • 打赏
  • 举报
回复
请看以下是我的实际应用:
//DBSavePath是备份文件的完整路径名(包括文件名);
//ExportTempData是数据库名
//sPath是数据恢复后的安装路径
//adoQuery为TADOQuery,其数据连接对象可以指向任意数据库
//如果你不知道其中的文件名,请在查询分析器中使用RESTORE FILELISTONLY查看
try {
AnsiString sCmd;
sCmd="Use Master\r\nRESTORE DATABASE ExportTempData FROM DISK = '";
sCmd+=DBSavePath+"' WITH MOVE 'EmigrantReg_Data' TO '";
sCmd+=sPath+"ExportTempData_dat.mdf',MOVE 'EmigrantReg_Log' TO '";
sCmd+=sPath+"ExportTempData_log.ldf'";
adoQuery->SQL->Text=sCmd;
adoQuery->ExecSQL();
}
catch(...) {
//失败。
xlz0306 2003-08-22
  • 打赏
  • 举报
回复
分啊…… 大家都是出来混的,信用当然是很重要的了,你的方法确实可行,我自然会给你全分的。
bluecyclone 2003-08-22
  • 打赏
  • 举报
回复
300分!我把问题给你解决了!首付200分,不讨价还价!~解决后,付另外的100分!
bluecyclone 2003-08-21
  • 打赏
  • 举报
回复
我的问题已经摆平了,你把分给我全给我,我传消息给你一段代码!保证解决你的问题!
或者我发Email给你也行!你的先把分给我!
bluecyclone 2003-08-21
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2170/2170806.xml?temp=5.631655E-02

我有办法解决!~你把我的问题摆平了,我就帮你!~
xlz0306 2003-08-21
  • 打赏
  • 举报
回复
不是吧?
我的restore 是在程序中用的数据备份功能,关掉程序??????????

杀了我吧……
bluecyclone 2003-08-21
  • 打赏
  • 举报
回复
你先把分给我,我说了有完美解决方案!拖到明天,200分,我都不给!~
hong668 2003-08-21
  • 打赏
  • 举报
回复
关闭后:use master
然后:restore,,,,,,,,,,,,,,
zhpsam109 2003-08-21
  • 打赏
  • 举报
回复
应该是你的程序正在使用数据库,你应该关闭你的应用程序与数据库的所有连接!然后连接master数据库,在执行restore命令!
如果不行,你可以关闭你的应用程序,在查询分析器中执行你的restore命令!(用sa登陆,选择master数据库)!
xlz0306 2003-08-21
  • 打赏
  • 举报
回复
:)
是sql server 2000 数据库,c++ builder 5.0

使用restore database 命令还原,执行语句是,报错如下:

General SQL error.因为数据库正在使用,所以未能获得数据库的排他访问权。Rostore

Database 操作异常终止。

就这样。请教:)
xlz0306 2003-08-21
  • 打赏
  • 举报
回复
不过我要的是解决数据库占用的问题,能不能把你的 restoredatabase 函数给我看看啊 ?

发消息或者 邮件 : xlzhu0306@sohu.com 都可以

先谢了:)
xlz0306 2003-08-21
  • 打赏
  • 举报
回复
to : starstargao(高顾)

谢谢,我去看看行不行。

starstargao 2003-08-21
  • 打赏
  • 举报
回复
还原
void __fastcall TFmWriteToDatabaseFromFile::FormActivate(TObject *Sender)
{
if(DirectoryExists(RestorePath)){
Screen->Cursor = crHourGlass;
try{
RestoreDatabase(RestorePath);
Application->MessageBoxA("数据库还原已顺利完成!","消息",MB_OK|MB_ICONINFORMATION);
}catch(Exception &e){
String caption;
caption = "执行还原操作时发生了一些异常错误,一些资料没有恢复到数据库中,请及时联系数据库管理员\n错误代码为:\n"+e.Message;
Application->MessageBoxA(caption.c_str(),"错误",MB_OK|MB_ICONSTOP);
}
Screen->Cursor = crDefault;
}else if(RestorePath=="Restore Database has been canceled"){
;
}
else{
Application->MessageBoxA("没有当天的备份文件!","提示",MB_OK|MB_ICONINFORMATION);
}
Close();
}
此程序经过多人测试, 应该没有什么问题
starstargao 2003-08-21
  • 打赏
  • 举报
回复
我是这样解决的
starstargao 2003-08-21
  • 打赏
  • 举报
回复
void RestoreDatabase(String FilePath)
{
if(FileExists(FilePath+"\\sys_fee_total.bak"))
WriteToTable("sys_fee_total",FilePath+"\\sys_fee_total.bak",10);

if(FileExists(FilePath+"\\tran_ls.bak"))
WriteToTable("tran_ls",FilePath+"\\tran_ls.bak",14);

if(FileExists(FilePath+"\\user_fee.bak"))
WriteToTable("user_fee",FilePath+"\\user_fee.bak",14);

if(FileExists(FilePath+"\\user_info.bak"))
WriteToTable("user_info",FilePath+"\\user_info.bak",27);

if(FileExists(FilePath+"\\user_tran.bak"))
WriteToTable("user_tran",FilePath+"\\user_tran.bak",9);

if(FileExists(FilePath+"\\work_manager.bak"))
WriteToTable("work_manager",FilePath+"\\work_manager.bak",14);
}
//---------------------------------------------------------------------------
void WriteToTable(String TableName,String DataFilePath,int FieldCount)
{
TADOQuery *RestoreQuery = new TADOQuery(Application);
RestoreQuery->Connection = catvmain->ADOConnection1;
FILE *stream;
char ALineData[10000],*p;
int len =10000,myCount;
String sql;
stream = fopen(DataFilePath.c_str(), "r");
if(stream){
RestoreQuery->Close();
RestoreQuery->SQL->Clear();
RestoreQuery->SQL->Text = "delete from " + TableName;
RestoreQuery->ExecSQL();
while(fgets(ALineData, len, stream)){
myCount = FieldCount;
sql = "insert into "+TableName +" values(";
p = strtok(ALineData,"#*#$#*#");
if(p){
sql += "'"+AnsiString(p)+"'";
myCount -= 1;
}
while(p){
p = strtok(NULL,"#*#$#*#");
if(p && myCount>0){
if(AnsiString(p).Trim()=="")
sql += ",null";
else
sql += ",'"+AnsiString(p)+"'";
myCount -= 1;
}
}
sql += ")";
RestoreQuery->Close();
RestoreQuery->SQL->Clear();
RestoreQuery->SQL->Text = sql;
try{
RestoreQuery->ExecSQL();
}catch(...){
continue;
}
}
}
fclose(stream);
}
Santos 2003-08-20
  • 打赏
  • 举报
回复
把问题描述清楚,才好帮你把脉。:)
lvjack 2003-08-20
  • 打赏
  • 举报
回复
另外什么数据库?什么方法还原?
lvjack 2003-08-20
  • 打赏
  • 举报
回复
不清楚,安慰一下
xlz0306 2003-08-20
  • 打赏
  • 举报
回复
不是吧,就算来个人安慰一下也好

居然后来的帖子跟那么长了,我的还是 0

hoho ^^^^^^^^^^^^

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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