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

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

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

В настоящее время они выполняют этот запрос в 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 завершен в течение нескольких секунд.

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

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

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

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

Ответы [ 2 ]

1 голос
/ 28 ноября 2011

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

CommandBehavior = SequentialAccess

из MSDN

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

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

0 голосов
/ 28 ноября 2011

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

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

...