2011-11-28 199 views
2

我们有一个查询将按月执行并返回大小为1GB的数据。从oracle数据库读取大量数据并使用C#将其导出为.dat文件

此处使用的查询只是包含内部连接的选择查询,不涉及游标。

目前他们正在Toad中执行此查询并将数据从输出窗口导出为.dat文件。

请注意,使用蟾蜍手动操作需要2小时。

之后,他们正在更改.dat文件中的标题文本,使其具有有意义的名称与我们的客户共享。

我想通过创建一个将执行此过程的exe来自动执行此过程。

代码快照看起来像下面

using (OracleConnection conn = new OracleConnection()) 
{ 
    conn.ConnectionString = ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString; 
    conn.Open(); 

    using (OracleCommand cmd = new OracleCommand(commandText)) 
    { 
     cmd.Connection = conn; 

     using (OracleDataReader dtReader = cmd.ExecuteReader()) 
     { 
      outputContent = new StringBuilder(); 

      while (dtReader != null && dtReader.Read()) 
      { 
       for (int i = 0; i < dtReader.FieldCount; i++) 
       { 
        outputContent.Append(dtReader[i]); 
        outputContent.Append(delimiter); 
       } 

       outputContent = outputContent.Replace(delimiter, Environment.NewLine, outputContent.Length - 1, 1); 
      } 
     } 
    } 
} 

outputPath = string.Format(ConfigurationManager.AppSettings["OutputPath"], DateTime.Now.Ticks); 
outputStream = new StreamWriter(outputPath, true); 

//Export 
outputStream.Write(outputContent.ToString()); 
outputStream.Close(); 

从日志中,它得到了OT知道,执行读者语句秒内完成。

但从DataReader的读取数据抛出 “异常信息是ORA-03113:结束文件在System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle,的Int32 RC)上的通信信道 ” 8小时后时间。

任何人都可以请让我知道上面的方法是好的处理1GB大小的数据?或

有没有其他更好的方法来做到这一点?

感谢, Gayathri

回答

0

您可以直接从PL/SQL程序中导出数据,并有一个shell文件(而不是一个exe),从SQLPLUS启动它。

请参阅this question on SO了解如何在导出数据的过程中进行操作。

+0

感谢您的建议.Query根据当前的月份在where条件中取代了一些月份值。我计划相应地为每个月份的thro代码更改cmd文本。标题需要更改在输出内容中。所有这些可能需要以上建议手动中断。 – Gayathri

+0

请记住,您可以从shell将参数传递给PlSql(有关unix中的示例,请参阅http://www.dbforums.com/oracle/1214698-procedure-call-through-shell-script.html)和/或运行shell或PlSql来自C#的代码。 –

1

可能是你可以尝试

的CommandBehavior = SequentialAccess

MSDN

使用SequentialAccess检索大值和二进制数据

一个sample如何使用它

相关问题