Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从oracle数据库读取大量数据并使用C将其导出为.dat文件_C#_Large Data Volumes - Fatal编程技术网

C# 从oracle数据库读取大量数据并使用C将其导出为.dat文件

C# 从oracle数据库读取大量数据并使用C将其导出为.dat文件,c#,large-data-volumes,C#,Large Data Volumes,我们有一个每月执行一次的查询,返回1GB大小的数据 这里使用的查询只是一个带有内部联接的select查询,不涉及游标 目前,他们正在Toad中执行此查询,并将数据从输出窗口导出为.dat文件 请注意,使用Toad手动执行此操作需要2小时的时间 之后,他们将更改.dat文件中的标题文本,使其具有有意义的名称,以便与我们的客户共享 我想通过创建执行此过程的exe来自动化此过程 代码快照如下所示 using (OracleConnection conn = new OracleConnection()

我们有一个每月执行一次的查询,返回1GB大小的数据

这里使用的查询只是一个带有内部联接的select查询,不涉及游标

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

请注意,使用Toad手动执行此操作需要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();
从日志中可以知道,execute reader语句在几秒钟内完成

但从datareader读取数据会抛出异常消息ORA-03113:通信通道上的文件结束 8小时后,在System.Data.OracleClient.OracleConnection.CheckErrorRociErrorHandle errorHandle,Int32 rc上

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

还有其他更好的方法吗

谢谢,
Gayathri

您可以直接从PL/SQL过程导出数据,并拥有一个shell文件,而不是从SqlPlus启动数据的exe文件

请参阅导出数据过程中的内容。

可能有问题,您可以尝试

CommandBehavior=顺序访问

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


A如何使用它

谢谢你的建议。根据当前月份,查询在where条件下有一些月值需要替换。我计划通过代码相应地更改每个月的cmd文本。输出内容中的标题需要更改。所有这些可能需要手动中断上述建议。请记住,您可以从shell向PlSql传递参数请参见unix中的示例和/或从C运行shell或PlSql代码。