Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Kann ich einen Stream verwenden, um eine Zeile in SQL Server (C#) einzufügen oder zu aktualisieren?

Sie sollten in der Lage sein, eine Instanz von SqlBytes zu übergeben als Parameter für einen SqlCommand wo immer ein varbinary wird gebraucht. Dasselbe SqlBytes Klasse hat eine Konstruktorüberladung, die einen Stream umschließt . Erstellen Sie also einfach ein SqlBytes Instanz aus dem Stream und übergeben Sie diese dann als Parameterwert.

Mit anderen Worten, passen Sie das in Ihren überarbeiteten Code ein, anstatt das hier:

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);

Verwenden Sie dies:

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);

Vergessen Sie natürlich nicht, den MemoryStream zu entsorgen und all diese anderen IDisposable Instanzen, nachdem der Befehl ausgeführt wurde.

Bearbeiten:OK, ich habe gerade das Ende Ihrer Bearbeitung gesehen, was bedeutet, dass die Daten extrem groß sind und Sie nicht möchten, dass sie im Speicher landen, und dies wird dieses Problem nicht wirklich lösen. Die Sache ist, wenn der Wert so groß ist, ist es eine schlechte Idee, ihn in einer varbinary zu speichern Spalte an erster Stelle.

Wenn Sie SQL Server 2008 verwenden, können (und sollten!) Sie stattdessen FILESTREAM verwenden. Das tatsächlich unterstützt "echtes" Streaming in ADO.NET durch die SqlFileStream-Klasse.

Wenn Sie FILESTREAM nicht verwenden können Speicher, dann fürchte ich, dass Sie sich irgendwann mit den Daten im Speicher befassen müssen, so funktioniert ADO.NET ziemlich genau.