Sie sollten in der Lage sein, eine Instanz von SqlBytes
zu übergeben als Parameter für einen SqlCommand
wo immer ein varbinary
wird gebraucht. Dasselbe SqlBytes
Klasse hat eine Konstruktorüberladung, die einen Stream
umschließt . Erstellen Sie also einfach ein SqlBytes
Instanz aus dem Stream und übergeben Sie diese dann als Parameterwert.
Mit anderen Worten, passen Sie das in Ihren überarbeiteten Code ein, anstatt das hier:
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);
Verwenden Sie dies:
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);
Vergessen Sie natürlich nicht, den MemoryStream
zu entsorgen und all diese anderen IDisposable
Instanzen, nachdem der Befehl ausgeführt wurde.
Bearbeiten:OK, ich habe gerade das Ende Ihrer Bearbeitung gesehen, was bedeutet, dass die Daten extrem groß sind und Sie nicht möchten, dass sie im Speicher landen, und dies wird dieses Problem nicht wirklich lösen. Die Sache ist, wenn der Wert so groß ist, ist es eine schlechte Idee, ihn in einer varbinary
zu speichern Spalte an erster Stelle.
Wenn Sie SQL Server 2008 verwenden, können (und sollten!) Sie stattdessen FILESTREAM verwenden. Das tatsächlich unterstützt "echtes" Streaming in ADO.NET durch die SqlFileStream-Klasse.
Wenn Sie FILESTREAM
nicht verwenden können Speicher, dann fürchte ich, dass Sie sich irgendwann mit den Daten im Speicher befassen müssen, so funktioniert ADO.NET ziemlich genau.