Wir verwenden einen Oracle Nclob für eine der Spalten in unserer Datenbank, während wir eine "gepufferte: falsche" Auswahl von 8 Millionen Zeilen machen, die wir immer nicht mehr genügend Speicher haben würden.
using (var connection = new OracleConnection(_databaseConfiguration.ConnectionString))
{
connection.Open();
var result = connection.Query<ClassWithNClob>(query, param, buffered: false);
foreach (var element in result)
{
//do something with element that has a nclob
}
}
Wir haben das mit dem Standard-OracleDataReader gelöst und als wir auf den NCLOK zugreifen wollten, haben wir ihn mit einer using-Anweisung umschlossen. Wir möchten Dapper dafür verwenden, da dies die Konvertierung viel einfacher machen würde, aber an dieser Stelle nicht möglich ist.
using (var connection = new OracleConnection(_databaseConfiguration.ConnectionString))
{
connection.Open();
var command = new OracleCommand(query,connection);
using (OracleDataReader oraReader = oracleCommand.ExecuteReader())
{
while(oraReader.Read())
{
using(var blobStream = reader.GetOracleClob(2))
{
//something with bloblStream.Value
}
}
}
}
Wir glauben, dass dies ein Fehler ist, aber gibt es etwas, das wir gerade vermissen?
Dapper ist sehr bemüht, nicht viel über bestimmte Anbieter wissen zu müssen. Ich vermute, in Ihrem Fall ist es nur zu Äquivalent von:
obj.YourClobMember = reader.GetValue(8);
Das Problem hier ist, dass es in der Tat nie von Dapper entsorgt werden wird. Ich würde vorschlagen, dass in diesem Szenario Ihre beste Wette wäre, eine Bereinigungsmethode zu haben , die Sie aus Ihrer Schleife aufrufen , die überprüft, ob das Clob-Mitglied nicht null ist, und wenn dies der Fall ist und es null zuweist. Dies könnte sogar dadurch erfolgen, dass Sie Ihren IDisposable
.
Es könnte auch etwas möglich sein, das einen benutzerdefinierten Typ-Handler beinhaltet, aber die Tatsache, dass der offensichtliche Typ hier byte[]
macht es umständlich, da dies bereits eine hartnäckige Handhabung hat.