sql >> Database teknologi >  >> RDS >> Sqlserver

Kan jeg bruge en stream til at INDSÆTTE eller OPDATERE en række i SQL Server (C#)?

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.



  1. Få resultatet af dynamisk SQL til en variabel til sql-server

  2. Sådan får du rækkenummer i PostgreSQL

  3. JDBCTemplate sæt indlejret POJO med BeanPropertyRowMapper

  4. Måder at gendanne data fra SQL Server Transaction Log File