U zou een instantie van SqlBytes
. moeten kunnen doorgeven als een parameter voor een SqlCommand
waar een varbinary
is nodig. Diezelfde SqlBytes
klasse heeft een overbelasting van de constructor die een Stream
omhult . Maak dus eenvoudig een SqlBytes
instantie uit de stream en geef die dan door als parameterwaarde.
Met andere woorden, pas dat in uw herziene code, in plaats van dit:
MemoryStream _MemoryStream = new System.IO.MemoryStream();
_Image.Save(_MemoryStream, _ImageFormat);
SqlParameter _SqlParameter = new
SqlParameter("@" + _ImageFieldName, SqlDbType.Image);
_SqlParameter.Value = _MemoryStream.ToArray();
_SqlCommand.Parameters.Add(_SqlParameter);
Gebruik dit:
MemoryStream _MemoryStream = new System.IO.MemoryStream();
_Image.Save(_MemoryStream, _ImageFormat);
_MemoryStream.Position = 0; // I *think* you need this
SqlParameter _SqlParameter = new
SqlParameter("@" + _ImageFieldName, SqlDbType.VarBinary);
_SqlParameter.Value = new SqlBytes(_MemoryStream);
_SqlCommand.Parameters.Add(_SqlParameter);
Vergeet natuurlijk niet om de MemoryStream
. weg te gooien en al deze andere IDisposable
instanties nadat de opdracht is uitgevoerd.
Bewerken:OK, ik zag net de onderkant van je bewerking, wat inhoudt dat de gegevens extreem groot zijn en dat je niet wilt dat ze in het geheugen terechtkomen, en dit zal dat probleem niet echt oplossen. Het punt is, als de waarde zo groot is, is het een slecht idee om het op te slaan in een varbinary
kolom op de eerste plaats.
Als u SQL Server 2008 gebruikt, kunt u (en moet!) in plaats daarvan FILESTREAM gebruiken. Dit doet eigenlijk ondersteunt "echte" streaming in ADO.NET via de SqlFileStream-klasse.
Als u FILESTREAM
niet kunt gebruiken opslag, dan ben ik bang dat je op een bepaald moment te maken krijgt met de gegevens in het geheugen, dat is ongeveer hoe ADO.NET werkt.