利用程序导入数据(oracle),将导入命令写入ImportData.bat例如:sqlplusw [email protected]/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 [email protected]/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[i];
      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[i]+' '+
               '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[i]+' 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[i]+' 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[i]+';'+#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;

解决方案 »

  1.   

    最后一句出错? TFileStream有没有close属性?两个文件的free是不是都执行到了?
      

  2.   

    可能是WinExec(PChar(MWorkPath+'BatFile\ImportData.bat'), SW_HIDE);中
    BatFile前少一个"\"?—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————
      

  3.   

    TFileStream没有close属性,程序没有报错,只是执行ImportData.bat时会调用CreatUser.sql,当sqlpuls执行时会出现一下错误: 无法打开文件".\CreateUser.sql"因为单独执行bat文件没错,所以我怀疑是CreateUser.sql没有释放。但是两个Free都执行了
      

  4.   

    to lxpbuaa(桂枝香在故国晚秋) ( )那里没错MWorkPath后面有'\'
      

  5.   

    idilent(说错了别怪我)不行,和这个没关系
      

  6.   

    看程序是两个都释放了,问题出在你的.bat文件里,在这里面你要提供绝对路径,而不是相对路径。虽然,有相对路径直接执行可以运行,但是如果用winexec调用的话就不行了!
      

  7.   

    所以,在.bat里createuser.sql文件你要给出绝对路径!
      

  8.   

    写入绝对路经,CreatUser.sql根本不执行,急死了
      

  9.   

    不懂!帮你up 
    你是否试试在 Delphi 的project->Options->Compiler中的Syntax Options中选中
    Typed @ operator 项(可能跟@这个有关系)