Du bör kunna skicka en instans av SqlBytes
som en parameter till ett SqlCommand
varhelst en varbinary
behövs. Samma SqlBytes
klass har en konstruktoröverbelastning som omsluter en Stream
. Så skapa helt enkelt en SqlBytes
instans från strömmen, skicka in den som parametervärde.
Med andra ord, passa in det i din reviderade kod istället för detta:
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);
Använd detta:
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);
Naturligtvis, glöm inte att kassera MemoryStream
och alla dessa andra IDisposable
instanser efter att kommandot har utförts.
Edit:OK, jag såg precis botten av din redigering, vilket antyder att data är extremt stor och att du inte vill att den ska hamna i minnet, och detta kommer faktiskt inte att lösa det problemet. Saken är den att om värdet är så stort är det en dålig idé att lagra det i en varbinary
kolumn i första hand.
Om du använder SQL Server 2008 kan du (och bör!) använda FILESTREAM istället. Detta gör faktiskt stöder "true" streaming i ADO.NET genom klassen SqlFileStream.
Om du inte kan använda FILESTREAM
lagring, då är jag rädd att du kommer att behöva ta itu med att data finns i minnet någon gång, det är ungefär så ADO.NET fungerar.