Anda harus dapat meneruskan instance SqlBytes
sebagai parameter ke SqlCommand
di mana pun varbinary
dibutuhkan. SqlBytes
yang sama itu kelas memiliki kelebihan konstruktor yang membungkus Stream
. Jadi cukup buat SqlBytes
instance dari aliran, lalu berikan itu sebagai nilai parameter.
Dengan kata lain, masukkan itu ke dalam kode revisi Anda, alih-alih ini:
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);
Gunakan ini:
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);
Tentu saja, jangan lupa untuk membuang MemoryStream
dan semua IDisposable
lainnya ini instance setelah perintah dieksekusi.
Sunting:Oke, saya baru saja melihat bagian bawah hasil edit Anda, yang menyiratkan bahwa datanya sangat besar dan Anda tidak ingin itu berakhir di memori, dan ini sebenarnya tidak akan menyelesaikan masalah itu. Masalahnya, jika nilainya sebesar itu, sebaiknya disimpan di varbinary
kolom di tempat pertama.
Jika Anda menggunakan SQL Server 2008, Anda dapat (dan harus!) menggunakan FILESTREAM sebagai gantinya. Ini sebenarnya memang mendukung streaming "benar" di ADO.NET melalui kelas SqlFileStream.
Jika Anda tidak dapat menggunakan FILESTREAM
penyimpanan, maka saya khawatir Anda harus berurusan dengan data yang ada di memori pada suatu saat, begitulah cara kerja ADO.NET.