Du bør være i stand til at sende en forekomst af SqlBytes
som en parameter til en SqlCommand
hvor som helst en varbinary
er nødvendig. Den samme SqlBytes
klasse har en konstruktøroverbelastning, der ombryder en Stream
. Så opret blot en SqlBytes
forekomst fra strømmen, og indsend det derefter som parameterværdien.
Med andre ord, indpas det i din reviderede kode i stedet for denne:
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);
Brug denne:
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);
Glem selvfølgelig ikke at bortskaffe MemoryStream
og alle disse andre IDisposable
forekomster efter kommandoen er blevet udført.
Edit:OK, jeg så lige bunden af din redigering, hvilket antyder, at dataene er ekstremt store, og du ikke ønsker, at de skal ende i hukommelsen, og det løser faktisk ikke det problem. Sagen er, at hvis værdien er så stor, er det en dårlig ide at gemme den i en varbinary
kolonne i første omgang.
Hvis du bruger SQL Server 2008, kan du (og bør!) bruge FILESTREAM i stedet for. Dette gør faktisk understøtter "ægte" streaming i ADO.NET gennem SqlFileStream-klassen.
Hvis du ikke kan bruge FILESTREAM
lagring, så er jeg bange for, at du bliver nødt til at håndtere, at dataene er i hukommelsen på et tidspunkt, det er stort set sådan ADO.NET fungerer.