Ich habe folgendes Problem:
In meiner C#-Anwendung lese ich aus einer Tabelle mit 300.000 Einträgen in einer Oracle-DB alle Zeilen per OracleDataReader aus (um sie in eine Access-DB zu schreiben).
Die Tabelle enthält eine Spalte vom Typ XmlType. Diese Spalte enthält Xml-Dateien mit einer Größe von ca. 300 Zeilen.
Beim Starten des Programms steigt der verbrauchte Speicher (im TaskManager) bis auf die 1-GByte-Grenze, was zwangsläufig zum Absturz des Programms führt (OutOfMenory-Exception). Bis zum Absturz wurden gerade einmal 6.000 der 300.000 Zeilen ausgelesen.
Lese ich hingegen die Spalte FEHLERPROTOKOLL nicht aus, gibt es auch kein (erkennbares) memory-leak.
Die Oracle.ManagedDataAccess.dll hat die Version 4.121.2.0 und sollte somit auf dem neuesten Stand sein.
Ich komme einfach nicht weiter, hat jemand mit dem OracleDataReader in einer ähnlichen Situation schon Erfahrungen gemacht?
Bin für jede Hilfe dankbar, nachfolgend mein Code:
/// <summary>
/// Die Fehlerprotokolle werden auslesen und in die Access-DB übertragen
/// </summary>
private void ReadFehlerprotokolle(OracleConnection oracleConnection, OleDbConnection oleDbConnection, string cmdTextKdbSelectKorrekturauftragHist)
{
try
{
// Oracle-Command ausführen
using (OracleCommand cmdOracleGetKorrekturauftragHist = new OracleCommand(cmdTextKdbSelectKorrekturauftragHist, oracleConnection))
{
int zaehler = 0;
using (OracleDataReader dataReader = cmdOracleGetKorrekturauftragHist.ExecuteReader())
{
if (dataReader != null)
{
while (dataReader.Read())
{
zaehler++;
// Auslesen von für die weitere Verarbeitung notwendigen Feldern
CEntryT_KORREKTURAUFTRAGHIST cEntryT_KORREKTURAUFTRAGHIST = new CEntryT_KORREKTURAUFTRAGHIST(dataReader.GetInt32(dataReader.GetOrdinal(KORREKTURAUFTRAGID)).ToString()/*,
dataReader.GetString(dataReader.GetOrdinal(FEHLERPROTOKOLL))*/);
cEntryT_KORREKTURAUFTRAGHIST.PruefZeitpunkt = dataReader.GetDateTime(dataReader.GetOrdinal(PRUEFZEITPUNKT));
cEntryT_KORREKTURAUFTRAGHIST.KassenSchluessel = dataReader[KASSENSCHLUESSEL] as string ?? null;
cEntryT_KORREKTURAUFTRAGHIST.JournalNr = dataReader[JOURNALNR] as string ?? null;
cEntryT_KORREKTURAUFTRAGHIST.JournalTagUhrzeit = dataReader[JOURNALTAGUHRZEIT] as DateTime? ?? null;
cEntryT_KORREKTURAUFTRAGHIST.JournalVersion = dataReader[JOURNALVERSION] as string ?? null;
cEntryT_KORREKTURAUFTRAGHIST.TicketMelder = dataReader.GetString(dataReader.GetOrdinal(EXTMELDER));
// CMD-statements für Access-Tabellen erstellen
//_insertUpdateFehlerBilder.Work(cEntryT_KORREKTURAUFTRAGHIST);
String t = dataReader.GetString(dataReader.GetOrdinal(FEHLERPROTOKOLL));
//_insertUpdateFehler.Work(cEntryT_KORREKTURAUFTRAGHIST, oleDbConnection, "");
Console.WriteLine("ID = " + cEntryT_KORREKTURAUFTRAGHIST.KorrerkturauftragId);
}
}
}
}
Console.WriteLine("Daten gelesen");
}
catch (Exception ex)
{
Console.WriteLine("Verbindung fehlgeschlagen: " + ex.Message);
}
}