sql >> Databasteknik >  >> RDS >> Sqlserver

Kan jag använda en ström för att INFOGA eller UPPDATERA en rad i SQL Server (C#)?

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.



  1. Övervaka MySQL-prestanda med ClusterControl

  2. Ta bort med Left Join i Oracle 10g

  3. Django Migrations:A Primer

  4. MariaDB JSON_VALUE() Förklarad