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

Cosa SqlDbType esegue il mapping su varBinary(max)?

SqlDbType.VarBinary con lunghezza -1 è l'equivalente di VARBINARY(MAX), almeno in teoria. Ma il problema è un po' più complesso, poiché esiste anche un tipo (non un valore enum), ovvero SqlTypes.SqlBytes che può essere utilizzato. E c'è SqlTypes.SqlFileStream che può essere utilizzato anche per VARBINARY(MAX) tipi, quando hanno il FILESTREAM attributo.

Ma il problema è che nessuno di questi enum o tipi copre il vero problema con l'utilizzo di VARBINARY(MAX) colonne in ADO.Net:consumo di memoria. Tutti questi tipi, se usati "pronti all'uso", creeranno copie del valore allocato come un singolo array in memoria, che nella migliore delle ipotesi non è performante, ma man mano che il contenuto diventa più grande diventa impossibile da usare perché l'allocazione non riesce . Ho un paio di articoli che mostrano il modo corretto di gestire VARBINARY(MAX) valori in ADO.Net utilizzando una semantica di streaming che evita la creazione di copie in memoria dell'intero contenuto:

  • Scarica e carica immagini da SQL Server tramite ASP.Net MVC
  • FILESTREAM MVC:scarica e carica immagini da SQL Server