开发语言: C#
数据库采用Oracle9i
每当到月底的时候下面的单位需将大量业务数据上报到总公司。
解决办法:利用ado.net收集数据放到dataset中通过WebService传送到总公司,然后解释成CTL控制程序,使用SQLLDR user/pwd@DataSvice control=XXXXX.ctl方式导入到总公司Oracle数据库中。在调试过程中发现一个奇怪的问题:
      Sqlldr 无法通过程序进行导入。(语法都没有问题)
      但是直接生成一个批处理文件,手工点击运行又都可以导入。不知什么原因。刚开始以为是SQLLDR.exe的路径有问题。结果我把绝对路径输入(c:\oracle90\bin\SQLLDR user/pwd@DataSvice control=XXXXX.ctl)也还是出现上面的这个问题。有这个经验的兄弟姐妹们!帮帮我吧。

解决方案 »

  1.   

    我们用Java来做,也是先生成批处理,然后在Java中执行这个批处理
      

  2.   

    process.start();
    先调出cmd.exe
    然后填写命令
    路径使用绝对路径 如:@"c:\oracle\bin\sqlldr.exe ..."
      

  3.   

    process.start();
    先调出cmd.exe
    然后填写命令
    路径使用绝对路径 如:@"c:\oracle\bin\sqlldr.exe ..."我现在就是用这个做的.结果这个进程根本不执行,
    但我手工cmd窗口中执行就是没问题.
      

  4.   

    在网上查了一些相关资料.有人说是一个什么Oracle环境变量的问题.Oracle我是初学者.不知道Oracle环境应该怎么进行设置.
      

  5.   

    把你要执行的c:\oracle90\bin\SQLLDR user/pwd@DataSvice control=XXXXX.ctl放在一个批处理文件里面比如  aa.cmd然后调用这个批处理c:\oracle90\bin最好放在path中
      

  6.   

    在测试的过程又发现:
    我在用Oralce服务器的机子执行通过了!
    但在只有Oracle客户端的机子上执行时还老样子!
    为什么啊?
    可能对解决问题会有帮助.但我始终找不到原因!!!!
      

  7.   

    我把sqlldr,换成sqlplus。sqlplus执行得很好!!会不会sqlldr执行有些什么条件?
      

  8.   

    调用sqlldr时加上log=LOGFILENAME,看看日志中有什么信息。
      

  9.   

    试过了,根本不产生log、bad文件
      

  10.   

    写个BAT,如
    @echo off
    echo %TIME% START>TEST.LOG
    c:\oracle90\bin\SQLLDR user/pwd@DataSvice control=XXXXX.ctl >>TEST.LOG
    echo %TIME% END>>TEST.LOG
    然后在C#中执行这个BAT,看看TEST.LOG内容
      

  11.   

    其实你不必要那么复杂的,直接生成INSET 语句就OK 的
      

  12.   

    按照匆匆过客的方式进行测试了.
    <<<写个BAT,如
    @echo off
    echo %TIME% START>TEST.LOG
    c:\oracle90\bin\SQLLDR user/pwd@DataSvice control=XXXXX.ctl >>TEST.LOG
    echo %TIME% END>>TEST.LOG
    然后在C#中执行这个BAT,看看TEST.LOG内容看到test.log 结果如下:
    17:20:08.42 START
    17:20:08.42 END
    但是如果我用手工方式直接双击此批处理文件运行看到test.log结果就不同了:
    17:32:10.42 STARTSQL*Loader: Release 9.0.1.1.1 - Production on 星期五 4月 21 17:32:10 2006(c) Copyright 2001 Oracle Corporation.  All rights reserved.达到提交点,逻辑记录计数17
    17:32:13.26 END
      

  13.   

    数据库服务器是不是类linux呀,这样的话有权限问题 ,还有如果达到目的就行的话,我建议使用external table 来代替,功能有过之而无不及,调用还简单,我们公司一直在用
      

  14.   

    external table 对我现在的需求不合适.
    数据库服务器是unix的.
    web服务器是window2000server版的.
    我现在就是通过web服务器调用sqlldr将数据导入到数据库服务器中.
      

  15.   

    很奇怪,你试试再建个BAT,新的BAT中只有一行内容
    OLDBATFILE>RUN.LOG
    再删除原先BAT中的所有输出重定向,C#中调用新的BAT,执行后查看RUN.LOG的内容是什么。
      

  16.   

    TO:匆匆过客
    >>很奇怪,你试试再建个BAT,新的BAT中只有一行内容
    >>OLDBATFILE>RUN.LOG
    >>再删除原先BAT中的所有输出重定向,C#中调用新的BAT,执行后查看RUN.LOG的内容是什么。是不是把bat改一下?
    改成:   sqlldr ...............>run.log
    再看看run.log内容? 
    明天上班我试试看。我估计可能也差不多,每次通过c#调用bat时,sqlldr就是不运行。但手工又可以。奇怪。后来我到其它有Oracle数据库的机子上运行时,发现又可以。
    但是在只安装了Oracle客户端的机子都只能通过手工执行BAT sqlldr才会运行!
    会不会是这样?
      

  17.   

    我的意思是建两个BAT。如A.BAT的内容是
    @echo off
    echo %TIME% START
    c:\oracle90\bin\SQLLDR user/pwd@DataSvice control=XXXXX.ctl
    echo %TIME% END
    B.BAT的内容是
    CALL A.BAT>RUN.LOG
    然后C#调用B.BAT,执行完看RUN.LOG。
      

  18.   

    感谢 bobfang(匆匆过客) 的帮助.