Měli byste být schopni předat instanci SqlBytes
jako parametr pro SqlCommand
kdekoli varbinary
je potřeba. To samé SqlBytes
třída má přetížení konstruktoru, který obaluje Stream
. Jednoduše tedy vytvořte SqlBytes
instance ze streamu, pak ji předejte jako hodnotu parametru.
Jinými slovy, vložte to do vašeho revidovaného kódu místo tohoto:
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);
Použijte toto:
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);
Samozřejmě nezapomeňte zlikvidovat MemoryStream
a všechny tyto další IDisposable
instance po provedení příkazu.
Edit:OK, právě jsem viděl spodní část vaší úpravy, která naznačuje, že data jsou extrémně velká a nechcete, aby skončila v paměti, a to ve skutečnosti tento problém nevyřeší. Věc se má tak, že pokud je hodnota tak velká, je špatný nápad ji ukládat do varbinary
sloupec na prvním místě.
Pokud používáte SQL Server 2008, můžete (a měli byste!) místo toho použít FILESTREAM. To ve skutečnosti dělá podporují "pravé" streamování v ADO.NET prostřednictvím třídy SqlFileStream.
Pokud nemůžete použít FILESTREAM
úložiště, pak se obávám, že se budete muset vypořádat s tím, že data jsou v určitém okamžiku v paměti, přesně tak ADO.NET funguje.