Чтение большого объема данных из базы данных Oracle и их экспорт в файл.dat с использованием C#

У нас есть запрос, который будет выполняться ежемесячно и возвращает данные размером 1 ГБ.

Используемый здесь запрос - это просто запрос на выборку с внутренними объединениями, без использования курсора.

В настоящее время они выполняют этот запрос в Toad и экспортируют данные из окна вывода в виде файла.dat.

Обратите внимание, что выполнение этого вручную с помощью жабы занимает 2 часа времени.

После этого они изменяют текст заголовка в файле.dat, чтобы иметь осмысленные имена, чтобы поделиться им с нашими клиентами.

Я хочу автоматизировать этот процесс, создав исполняемый файл, который будет делать этот процесс.

Снимок кода выглядит следующим образом

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 завершен в течение нескольких секунд.

Но при чтении данных из устройства чтения данных выдается сообщение "Исключением является ORA-03113: конец файла в канале связи в System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle, Int32 rc)" через 8 часов.

Может ли кто-нибудь, пожалуйста, дайте мне знать, что вышеупомянутый подход хорош для обработки данных размером 1 ГБ? или же

Есть ли другой лучший способ сделать это?

Спасибо, Гаятри

2 ответа

Может быть, вы можете попробовать

CommandBehavior = SequentialAccess

из MSDN

Используйте SequentialAccess для извлечения больших значений и двоичных данных

Образец как его использовать

Вы можете экспортировать данные напрямую из процедуры PL/SQL и иметь файл оболочки (вместо exe), который запускает их из SqlPlus.

Смотрите этот вопрос на SO о том, что поставить в процедуру экспорта данных.

Другие вопросы по тегам