你先把数据库相关的程序都关掉,然后再查询分析器中restore语句前增加
use master
Go
use master
Go
解决方案 »
- 求一SQL查询语句!谢谢~!
- FastReport3 条件求和的问题,紧急,解决结帖
- excelworksheet中的第二行的单元格已设置为自动换行,如何让第二行的单元格自动调整行的高度,来显示多行内容?
- 在ShellExecute中能使用相对路径吗?
- !!!紧急求救,实在不会了!!!!!
- 关于rave报表:无论数据多少我怎么看到的只有一页,超过的就没有了,手工增加一个页面,又看不到,怎么办?
- 怎样创建txt文件,并把一些字符串写到txt文件?
- 求3DES加密解密源代码
- 我的msdn里面没内容了,运行 dexplore.exe 打开了程序,可是里面是空的
- 怎麼才能讓報表橫著列印報表?請教大家了!
- 200分问一个严肃的感情问题,谢绝灌水!
- 怎样动态建立变量
use master
Restore DataBase shenji from shenji200207212115 with replace
ok 可以结帐了
as_DeviceName:=ListView1.Selected.Caption;
ls_Sql:='use master Restore DataBase shenji from '+as_DeviceName+' with replace'; DataM.T_cominfo.Close;
DataM.T_codeinfo.Close;
DataM.T_com0.Close;
DataM.T_com1.Close;
DataM.T_com2.Close;
DataM.T_offinfo.Close;
DataM.Q_query.Close;
DataM.Q_sample.Close;
DataM.Q_sign.Close; DataM.Q_backup.Close;
DataM.Q_backup.SQL.Clear;
DataM.Q_backup.SQL.Add(ls_Sql);
DataM.Q_backup.ExecSQL;
DataM.Q_backup.Close;
总是说没有排它访问权,我应该怎样修改代码呀??????????????还有! 我把DataBase的KeepConnection和Connected都设置为False,为什么运行程序其它表还能打开???再者!怎样动态改变DataBase所连接的数据库???
请大家帮帮忙呀! 感激不尽!!!
ls_Sql:='Restore DataBase shenji from '+as_DeviceName+' with replace'; DataM.Database1.Connected:=False;
DataM.Database2.Connected:=True; DataM.Q_backup.Close;
DataM.Q_backup.SQL.Clear;
DataM.Q_backup.SQL.Add(ls_Sql);
两个DataBase都是KeepConnection:=False,还是一样的错误呀!
总是说数据库正在使用,可是我并没有使用呀! DataM.Q_backup.ExecSQL;
DataM.Q_backup.Close;
DataBase1应该是连接到Master的TDatabase
DataBase1:
Connected=Ture
KeepConnection = False
LoginPrompt = False
DataBase2:
Connected=False
KeepConnection = False
LoginPrompt = False
DataBase1连接shenji库,DataBase2连接master库,用于恢复备份的Query连接在DataBase2上!
button代码:
DataBase1.Connected:=False;
DataBase2.Connected:=True;
Query2.ExecSQL;
DataBase2.Connected:=False;
DataBase1.Connected:=True;
Table1.Open;
还是原来的错误!
如果开始DataBase1.connected=False在运行,就可以恢复了!
这可怎么办呀! 我还有其他好多Table和Query要在备份恢复前打开呢!
请高手帮忙呀!!!!!!!!!!!!!!!!!!!!!!!!!!!!
不是讲了
use master
go
在恢复。就可以了,你在干什么啊。
你测试了没有
查询分析器里面写,
如果在delphi 里面
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('use master');
adoquery1.sql.add('go');
adoquery1.sql.add('Restore DataBase shenji from shenji200207212115 with replace );
adoquery1.execsql;
goRestore DataBase shenji from shenji200207212115 with replace
go
建立一个新 ADOConnection用 ADOCommand 实现,数据库选择 master.
查询分析器里面写,
如果在delphi 里面
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('use master');
adoquery1.sql.add('go');
adoquery1.sql.add('Restore DataBase shenji from shenji200207212115 with replace );
adoquery1.execsql;
我做试验时DataBase2默认连接在Master上!
我就是不明白为什么DataBase1能连接库,否则Database2没有排他权,我都在代码中关闭连接了呀! 不应该没有呀!
必须! DataBase1一开始就不连接,DataBase2才好用! 这不等于DataBase1没有用吗! 我还有好多Table和Query连在上面有用呢!
请问怎么办!
难道BDE不行,非要改ADO这可麻烦了!
也是这样! 这是怎么回事呀!
除非程序一开始数据库什么也连就能恢复备份!
否则就不行! 好像是断不开其他与数据库相连的控件!
可是!我在代码中将:Connected=False KeepConnection = False
应该可以断开吧! (use master我也试过,跟这个没关系)
请大家帮帮忙呀!!!!!!!!!!!!!!!!!!
//使用 master 数据库
query1.close;
query1.sql := 'use master';
query1.execsql; //设置 shenji 为单用户模式
//请自己将 "" 进行处理 使得命令为 EXEC sp_dboption 'shenji','single user',true
query1.sql := 'EXEC sp_dboption "shenji","single user",true';
query1.execsql; query1.sql.text := 'Restore DataBase shenji from shenji200207212115 with replace';
query1.execsql; //设置 shenji 为非单用户模式
//请自己将 "" 进行处理 使得命令为 EXEC sp_dboption 'shenji','single user',true
query1.sql := 'EXEC sp_dboption "shenji","single user",true';
query1.execsql; //使用 shenji 数据库
query1.close;
query1.sql := 'use shenji';
query1.execsql;except
//异常处理
//设置 shenji 为非单用户模式
//请自己将 "" 进行处理 使得命令为 EXEC sp_dboption 'shenji','single user',true
query1.sql := 'EXEC sp_dboption "shenji","single user",true';
query1.execsql;
end;
function TRestoreIt.BackUpDatabase:boolean;
var
sLogicNameOfData,sLogicNameOfLog:string;
sPhysicalNameOfData,sPhysicalNameOfLog:string;
dSizeOfData,dSizeOfLog:DWORD;
begin
With frmMenu.adoqrySys do
try
pServer:=rsServerName;
pDatabase:=rsDatabase;
pUser:=rsUser;
pPassWord:=rsPassword;
frmMenu.adcBack.Close;
frmMenu.adcBack.LoginPrompt:=False;
frmMenu.adcBack.Params.Values['Server Name']:=pServer;
frmMenu.adcBack.Params.Values['Database Name']:='master';
frmMenu.adcBack.Params.Values['User Name']:=rsUser;
frmMenu.adcBack.Params.Values['Password']:=rsPassword;
frmMenu.adcBack.Open;
Close;
DatabaseName:='Back'; if Not FileExists(Directory+BackUpFile) then
Raise Exception.Create('备份文件丢失:'+Directory+BackUpFile); Application.ProcessMessages;
Close;
SQL.Clear;
SQL.Add('USE master');
SQL.Add('Select Name from sysdevices Where Name='''+DumpDevice+'''');
Open;
if Not Eof then
begin
Close;
SQL.Clear;
SQL.Add('USE master');
SQL.Add('EXEC sp_dropdevice '''+DumpDevice+'''');
ExecSQL;
end;
Close;
SQL.Clear;
SQL.Add('USE master');
{
if Copy(Directory,1,1)='\' then
SQL.Add('EXEC sp_addumpdevice ''pipe'', '''+DumpDevice+''','''+Directory+BackUpFile+'''')
else
}
SQL.Add('EXEC sp_addumpdevice ''disk'', '''+DumpDevice+''','''+Directory+BackUpFile+'''');
ExecSQL;
Application.ProcessMessages;
Close;
SQL.Clear;
SQL.Add('Use Master');
SQL.Add('RESTORE FILELISTONLY from '+DumpDevice);
Open;
//注意此处尚未加上正常的异常处理,因为我忘了怎么写
First;
if UpperCase(FieldByName('Type').AsString)='D' then
begin
sLogicNameOfData :=FieldByName('LogicalName').AsString;
sPhysicalNameOfData:=FieldByName('PhysicalName').AsString;
dSizeOfData :=FieldByName('Size').Value;
end;
if UpperCase(FieldByName('Type').AsString)='L' then
begin
sLogicNameOfLog :=FieldByName('LogicalName').AsString;
sPhysicalNameOfLog :=FieldByName('PhysicalName').AsString;
dSizeOfLog :=FieldByName('Size').Value;
end;
Next;
if UpperCase(FieldByName('Type').AsString)='D' then
begin
sLogicNameOfData:=FieldByName('LogicalName').AsString;
sPhysicalNameOfData:=FieldByName('PhysicalName').AsString;
dSizeOfData :=FieldByName('Size').Value;
end;
if UpperCase(FieldByName('Type').AsString)='L' then
begin
sLogicNameOfLog :=FieldByName('LogicalName').AsString;
sPhysicalNameOfLog :=FieldByName('PhysicalName').AsString;
dSizeOfLog :=FieldByName('Size').Value;
end; Close;
SQL.Clear;
SQL.Add('Use Master');
SQL.Add('RESTORE DATABASE '+rsDatabase);
SQL.Add('FROM '+DumpDevice);
if not bDiffer then
SQL.Add('WITH REPLACE,')
else
SQL.Add('WITH');
SQL.Add('MOVE '''+sLogicNameOfData+''' TO '''+rsDirectory+'.MDF'',');
SQL.Add('MOVE '''+sLogicNameOfLog+''' TO '''+rsDirectory+'.LDF''');
ExecSQL;
Application.ProcessMessages;
Close;
SQL.Clear;
SQL.Add('USE master');
SQL.Add('EXEC sp_dropdevice '''+DumpDevice+'''');
ExecSQL;
lblCaption.Caption :='';
bBeLooping:=False;
MyShowMessage('数据库恢复完成!');
frmInitialize_Step3.Close;
Result:=True;
except
on E:Exception do
begin
ShowMessage(E.Message);
WriteErrlog('复制到备分服务器',E.Message);
Result:=False;
end;
end;
end;