D
dragoon1974
Unregistered / Unconfirmed
GUEST, unregistred user!
利用程序导入数据(oracle),将导入命令写入ImportData.bat例如:
sqlplusw system@tn.tnkj.com/manager @./CreateUser.sql
imp system/manager full=y file=F:/dyf/tnfund2003-01-07.dmp log=F:/dyf/tnfund_imp%date:~4,10%.txt
调用CreatUser.sql文件重新生成数据库用户,如下:
connect system@tn.tnkj.com/manager
drop user tnfund cascade;
create user tnfund identified by top default tablespace tsp_sgs quota unlimited on tsp_sgs;
grant connect, resource, select any table to tnfund;
可是每次执行时总是说打不开CreatUser.sql,但是如果直接执行ImportData.bat则不会出错。是不是因为CreatUser.sql正在进行操作打不开呀,但已经释放过了。
procedure TRestoreForm.btnImportClick(Sender: TObject);
var
batFile, sqlFile : TFileStream;
tempStr, fileName : string;
i : integer;
IniFile : TIniFile;
sUser : string;
begin
if lsbFile.Count=0 then begin
MessageDlg('没有选择文件。', mtError, [mbOk], 0);
Exit;
end;
batFile:=TFileStream.Create(MWorkPath+'/BatFile/ImportData.bat', fmCreate);
sqlFile:=TFileStream.Create(MWorkPath+'/BatFile/CreateUser.sql', fmCreate);
// IniFile:=TIniFile.Create(MWorkPath+MIniName);
try
// Write ImportData.bat File
tempStr:='sqlplusw system@'+sName+'/manager @./CreateUser.sql'+#13#10;
batFile.Write(Pointer(tempStr)^, Length(tempStr));
for i:=0 to lsbFile.Count-1 do begin
tempStr:=lsbFile.Items.Strings;
fileName:=ExtractFileName(tempStr);
fileName:=Copy(fileName, 1, Length(fileName)-14);
// sUser:=IniFile.ReadString('Import Set', fileName, )
tempStr:='imp system/manager full=y '+
'file='+lsbFile.Items.Strings+' '+
'log='+sPath+'/'+fileName+'_imp%date:~4,10%.txt'+
#13#10;
batFile.Write(Pointer(tempStr)^, Length(tempStr));
end;
// Write CreateUser.sql File
tempStr:='connect system@'+sName+'/manager'+#13#10;
sqlFile.Write(Pointer(tempStr)^, Length(tempStr));
// drop user
for i:=0 to sUsers.Count-1 do begin
tempStr:='drop user '+sUsers.Strings+' cascade;'+#13#10;
sqlFile.Write(Pointer(tempStr)^, Length(tempStr));
end;
// create user
for i:=0 to sUsers.Count-1 do begin
tempStr:='create user '+sUsers.Strings+' identified by top default '+
'tablespace tsp_sgs quota unlimited on tsp_sgs;'+#13#10;
sqlFile.Write(Pointer(tempStr)^, Length(tempStr));
tempStr:='grant connect, resource, select any table to '+sUsers.Strings+';'+#13#10;
sqlFile.Write(Pointer(tempStr)^, Length(tempStr));
end;
finally
batFile.Free;
sqlFile.Free;
// IniFile.Free;
end;
// Import data
WinExec(PChar(MWorkPath+'BatFile/ImportData.bat'), SW_HIDE);
end;
执行ImportData.bat时会调用CreatUser.sql,当sqlpuls执行时会出现一下错误: 无法打开文件"./CreateUser.sql"。因为单独执行bat文件没错,所以我怀疑是CreateUser.sql没有释放。但是两个Free都执行了
sqlplusw system@tn.tnkj.com/manager @./CreateUser.sql
imp system/manager full=y file=F:/dyf/tnfund2003-01-07.dmp log=F:/dyf/tnfund_imp%date:~4,10%.txt
调用CreatUser.sql文件重新生成数据库用户,如下:
connect system@tn.tnkj.com/manager
drop user tnfund cascade;
create user tnfund identified by top default tablespace tsp_sgs quota unlimited on tsp_sgs;
grant connect, resource, select any table to tnfund;
可是每次执行时总是说打不开CreatUser.sql,但是如果直接执行ImportData.bat则不会出错。是不是因为CreatUser.sql正在进行操作打不开呀,但已经释放过了。
procedure TRestoreForm.btnImportClick(Sender: TObject);
var
batFile, sqlFile : TFileStream;
tempStr, fileName : string;
i : integer;
IniFile : TIniFile;
sUser : string;
begin
if lsbFile.Count=0 then begin
MessageDlg('没有选择文件。', mtError, [mbOk], 0);
Exit;
end;
batFile:=TFileStream.Create(MWorkPath+'/BatFile/ImportData.bat', fmCreate);
sqlFile:=TFileStream.Create(MWorkPath+'/BatFile/CreateUser.sql', fmCreate);
// IniFile:=TIniFile.Create(MWorkPath+MIniName);
try
// Write ImportData.bat File
tempStr:='sqlplusw system@'+sName+'/manager @./CreateUser.sql'+#13#10;
batFile.Write(Pointer(tempStr)^, Length(tempStr));
for i:=0 to lsbFile.Count-1 do begin
tempStr:=lsbFile.Items.Strings;
fileName:=ExtractFileName(tempStr);
fileName:=Copy(fileName, 1, Length(fileName)-14);
// sUser:=IniFile.ReadString('Import Set', fileName, )
tempStr:='imp system/manager full=y '+
'file='+lsbFile.Items.Strings+' '+
'log='+sPath+'/'+fileName+'_imp%date:~4,10%.txt'+
#13#10;
batFile.Write(Pointer(tempStr)^, Length(tempStr));
end;
// Write CreateUser.sql File
tempStr:='connect system@'+sName+'/manager'+#13#10;
sqlFile.Write(Pointer(tempStr)^, Length(tempStr));
// drop user
for i:=0 to sUsers.Count-1 do begin
tempStr:='drop user '+sUsers.Strings+' cascade;'+#13#10;
sqlFile.Write(Pointer(tempStr)^, Length(tempStr));
end;
// create user
for i:=0 to sUsers.Count-1 do begin
tempStr:='create user '+sUsers.Strings+' identified by top default '+
'tablespace tsp_sgs quota unlimited on tsp_sgs;'+#13#10;
sqlFile.Write(Pointer(tempStr)^, Length(tempStr));
tempStr:='grant connect, resource, select any table to '+sUsers.Strings+';'+#13#10;
sqlFile.Write(Pointer(tempStr)^, Length(tempStr));
end;
finally
batFile.Free;
sqlFile.Free;
// IniFile.Free;
end;
// Import data
WinExec(PChar(MWorkPath+'BatFile/ImportData.bat'), SW_HIDE);
end;
执行ImportData.bat时会调用CreatUser.sql,当sqlpuls执行时会出现一下错误: 无法打开文件"./CreateUser.sql"。因为单独执行bat文件没错,所以我怀疑是CreateUser.sql没有释放。但是两个Free都执行了