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

Posso usare un flusso per INSERIRE o AGGIORNARE una riga in SQL Server (C#)?

Dovresti essere in grado di passare un'istanza di SqlBytes come parametro per un SqlCommand ovunque una varbinary è necessario. Lo stesso SqlBytes class ha un sovraccarico del costruttore che esegue il wrapping di un Stream . Quindi crea semplicemente un SqlBytes istanza dal flusso, quindi passalo come valore del parametro.

In altre parole, inserendolo nel codice rivisto, invece di questo:

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

Usa questo:

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

Naturalmente, non dimenticare di smaltire il MemoryStream e tutti questi altri IDisposable istanze dopo l'esecuzione del comando.

Modifica:OK, ho appena visto la parte inferiore della tua modifica, il che implica che i dati sono estremamente grandi e non vuoi che finiscano in memoria, e questo in realtà non risolverà il problema. Il fatto è che, se il valore è così grande, è una cattiva idea salvarlo in un varbinary colonna in primo luogo.

Se stai usando SQL Server 2008, puoi (e dovresti!) usare invece FILESTREAM. Questo in realtà fa supporta lo streaming "vero" in ADO.NET tramite la classe SqlFileStream.

Se non puoi utilizzare FILESTREAM storage, quindi temo che prima o poi dovrai fare i conti con i dati in memoria, più o meno è così che funziona ADO.NET.