第二次问,是否有人能回答(50分)

  • 主题发起人 dragoon1974
  • 开始时间
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都执行了
 
我在csdn问没人能回答,都说这里高手多,来这里也让我失望。
 
等等吧,高手还是很多的!我问了问题有时候要等好几天的![:D]
 
前些天就问过一次,出了一次差怎么也找不到问题了,奇怪。
 
没有实际的环境测试,很难回答.
几点意见:
1.CreateUser.sql创建成功?
2.调试到WinExec位置,自己编辑一下CreateUser.sql看看出错?
3.调试到WinExec位置,自己运行ImportData.bat有错?
根据情况再说.
 
应该是你调用BAT文件的程序当前路径不是SQL文件的存放路径,

换个简单的方法

你可以把以下语句放在TQuery中执行
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;

用TDatabase打开数据库
 
to ning_ning
ImportData.bat 和 CreateUser.sql 都没有问题,程序执行以后可以正确生成这两个文件,然后手动执行ImportData.bat没有任何问题。

to TeaTeaTTT
“应该是你调用BAT文件的程序当前路径不是SQL文件的存放路径“
什么意思?bat文件和sql文件在一个目录,但是和程序不在一个目录,这没有关系吧。
 
楼上(TeaTeaTTT)所说的正确,你的程序涉及到了所谓的当前路径的问题,
每个程序运行的时候都有一个当前路径。你直接运行ImportData.bat没有问题,
说明你是在'MWorkPath'+/BatFile/这个目录运行的,ImportData.bat里面的sqlplusw ..寻找的CreateUser.sql
在当前目录,
如果你在'MWorkPath'目录运行一下这个批处理,命令类似于“./BatFile/ImportData.bat”,
你就会发现,同样的问题产生了。

tempStr := 'sqlplusw system@' + sName + '/manager @./CreateUser.sql' + #13#10;
tempStr := 'sqlplusw system@' + sName + '/manager @'+MWorkPath+'/BatFile/CreateUser.sql' + #13#10;
 
非常感谢
 
顶部