Newsgroup: it.comp.software.database
Titolo: salvare array di bytes - vb/access

Scenario: visual basic 6 che via ADO si collega ad un MDB.
Ho necessita' di salvare un array di bytes (di max 1868 componenti) nel 
db.
Inizialmente avevo convertito l'array in una stringa del genere:
184-3-0-0-209-245-60-194-187-60-42...
e l'avevo salvata in un campo memo, per poi riprenderla e fare la 
conversione inversa.
Dato che la soluzione era poco performante e perdevo un sacco di spazio 
(per memorizzare un valore da 0 a 255, appunto un byte, ne perdevo in 
media 2-3) ho pensato di salvare nel campo i caratteri corrispondenti ai 
vari valori... 
Allora per controllare che non si perdesse qualche valore nel passaggio, 
magari con i caratteri ascii non stampabili, ho fatto questa piccola 
prova:
Private Sub Form_Load()
Dim adoConnection As ADODB.Connection
Dim adoRecordset As ADODB.Recordset
Dim Cstring As String
Set adoConnection = New ADODB.Connection
Set adoRecordset = New ADODB.Recordset
Cstring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path &  
"\prova.mdb;Persist Security Info=False"
adoConnection.Open Cstring
Dim vet(256)
Dim car, str As String
car = ""
For i = 1 To 255
    vet(i) = i
    car = car & Chr(vet(i))
Next
car = Replace(car, "'", "''")
SQL = "INSERT into tab values('" & car & "')"
Set adoRecordset = adoConnection.Execute(SQL)
SQL = "SELECT * from tab"
Set adoRecordset = adoConnection.Execute(SQL)
MsgBox (adoRecordset!dati)
car = adoRecordset!dati
str = ""
For i = 1 To 255
	str = str & " - " & Asc(Mid(car, i, 1))
Next
MsgBox (Mid(str, 1, 600))
MsgBox (Mid(str, 601, 1000))
End Sub
Beh, funziona bene... ad eccezione del fatto che ho riempito l'array di 
prova a partire da 1 e non da 0: in quel caso la query viene tagliata 
(un po' come se l'ascii 0 facesse da terminatore di stringhe come in 
C... anche se non l'ho trovato scritto da nessuna parte nell'msdn).
Come memorizzo 'sto benedetto carattere NULL?
C'e' un modo migliore per salvare un array di bytes in un db?
(con mysql avrei provato con un campo blob... con access, non so, 
potrebbe andare il campo OLE? Non l'ho mai usato per ora...)
Ciao ciao,
grazie
Dusk
(follow-up settato su it.comp.software.database)

 Come memorizzo 'sto benedetto carattere NULL?
Probabilmente è questa la stringa che viene "troncata" al primo Chr(0), se
presente in car:
SQL = "INSERT into tab values('" & car & "')"
Ho provato (a dir il vero con DAO) a aggiungere su database Access un record
con un campo Memo assegnando allo stesso una stringa di 256 bytes con pesi
da 0 a 255 con AddNew e Update. Funziona e recupera bene.
rs.Addnew
rs!campo_memo=car
rs.Update

 rs.Update
adoRecordset.CursorType = adOpenKeyset
adoRecordset.LockType = adLockOptimistic
adoRecordset.Open "tab", adoConnection, , , adCmdTable
adoRecordset.AddNew
adoRecordset!dati = car
adoRecordset.Update
It works! :)
Grazie, evidentemente conviene usare i metodi dell'oggetto recordset 
piu' che l'esecuzione "dura e pura" delle query sql... :)
bye,
D.
ps: una curiosita': aprendo il db da access, i campi sembrano vuoti... 
evidentemente il char NULL viene trattato in modo particolare

 evidentemente il char NULL viene trattato in modo particolare
Il problema, molto probabilmente, è sempre lo stesso: in fase di
rappresentazione dei contenuti, il Chr(0) viene inteso come fine stringa...
l'importante che da codice la stringa ci sia, tutta.


Prova con il campo OLE dovrebbe essere come blob ... oppure usa mysql ;-))
---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (
http://www.grisoft.com
).
Version: 6.0.476 / Virus Database: 273 - Release Date: 24/04/2003

 oppure usa mysql ;-))
Non posso, e' un progetto di gruppo... :P
tnx,
D.