Newsgroup: it.comp.lang.visual-basic
Titolo: Salvare file all'interno di un db SQL Server con VB

Salve a tutti,
ho la seguente necessità: ho un gestionale in VB e devo andare a
salvare, all'interno di un DB SQL Server, dei file di varia natura.
Quale tipologia di campo devo utilizzare affinchè vengano memorizzati
correttamente?
E soprattutto in Visual Basic quali sono le primitive per scrivere e
leggere file da database?

Ricky ha detto questo martedì :

Hai la possibilità di utilizzare campi Blob, ossia binari lunghi. Ma lo 
streaming di invio e ricezione non è banale.
Una alternativa veloce veloce, anche se ti aumenta il traffico di rete 
(ma devi valutare tu quali siano le dimensioni medie dei file), è 
quella di leggere il file, codificarlo in Hex (e qui in mezzo se vuoi 
puoi aggiungere criptazione o compressione), ed inviarlo come stringa 
in un campo Text, che supporta Ascii di qualunque lunghezza.
Ciao
Alberto
-- 
A questo punto hanno trovato un muro,
un muro duro, molto molto duro,
che siamo noi.

 streaming di invio e ricezione non è banale.
Non conosco SQL Server ma in firebird si fa abbastanza bene, io estraggo in
una cartella temporanea e poi apro il file, al termine lo risalvo nel blob.
Unica cosa devo utilizzare tramite Ado, non ho trovato il modo di usare una
sintassi tipo INSERT INTO FBLOB o UPDATE FBLOB SET...
(tutto preso googlando quando mi serviva)
FBLOB: la mia tabella contenente i files
CBLOB è il mio campo blob in una tabella, NOMEFIELE è il campo dove
memorizzo il nome del file (es. "PIPPO.DOC")
LETTURA:
################################################
  Dim MyStream As ADODB.Stream
  Set MyStream = New ADODB.Stream
  ADORs.Source = "SELECT * FROM FBLOB WHERE IDBLOB='" & Val(IDBlobK) & "'"
  ADORs.Open
 
  If Not ADORs.EOF Then
    If Not IsNull(ADORs("CBLOB")) Then
      With MyStream
        .Type = adTypeBinary  'Tipo stream binario
        .Open 'apro stream
        .Write ADORs("CBLOB") 'Scrivo nello stream il campo blob
        appo$ = App.Path & "\Temp\" & ADORs("NOMEFILE")
        .SaveToFile appo$, adSaveCreateOverWrite 'Salvo il nuovo file
        .Close  'Chiudo stream
      End With
    End If
  End If
  ADORs.Close
SALVATAGGIO di un campo esistente:
###############################################
      ADORs.LockType = adLockOptimistic 'setto proprietà e apro recordset
      ADORs.CursorType = adOpenStatic
      ADORs.Source = "SELECT * FROM FBLOB WHERE IDBLOB='" & Val(IDBlobK) &
"'"
      ADORs.Open
 
      With MyStream
        .Type = adTypeBinary 'definisco stream tipo binario
        .Open 'apro stream
        .LoadFromFile (appo$)  'carico il file da salvare
      End With
      ADORs("DATAMODIFICA") = Format(Date, "mm-dd-yyyy")
      ADORs("CBLOB") = MyStream.Read  'Nel campo blob inserisco lo stream
      ADORs.Update 'Riaggiorno il Rs per prendere i cambiamenti dell'AddNew
      ADORs.Close
      'reimposto le proprietà recordset di default
      ADORs.LockType = adLockReadOnly
      ADORs.CursorType = adOpenForwardOnly
INSERIMENTO NUOVO RECORD: 
################################################
  ADORs.LockType = adLockOptimistic 'setto proprietà e apro recordset
  ADORs.CursorType = adOpenStatic
  ADORs.Open "FBLOB", ADOCn, adOpenStatic, adLockOptimistic, adCmdTable
 
  ADORs.AddNew  'Aggiungo un recordset
 
  MyStream.Type = adTypeBinary 'definisco stream tipo binario
  MyStream.Open 'apro stream
  MyStream.LoadFromFile (PathFile$)  'carico il file da salvare
  ADORs("DATAMODIFICA") = Format(Date, "mm-dd-yyyy")
  ADORs("CBLOB") = MyStream.Read  'Nel campo blob inserisco lo stream
  ADORs.Update 'Riaggiorno il Rs per prendere i cambiamenti dell'AddNew
  ADORs.Close

       ADORs.Update
Ecco, questo è il motivo per cui non uso gli Stream.


 Ecco, questo è il motivo per cui non uso gli Stream.
Infatti è l'unica cosa che non sono riuscito ad evitare :\.
Un'alternativa potrebbe farsi una tabella che contiene il path del file
invece che il file stesso. Il database è molto più leggero, ma i file sono
in una cartella (magari la si può proteggere in qualche modo...)