Newsgroup: it.comp.lang.visual-basic
Titolo: RDO e copia di campi "memo"

Ok, forse nel mex precedente sono stata prolissa e confusionaria, ma questo
rispecchia bene il mio stato d'animo visto che non riesco a risolvere il
problema.... SGRUNT!
Cercando di sintetizzare e chiarire....
Devo copiare un record da una tabella di un db in una tabella di un altro
db. Le strutture sono identiche. I DB sono Access 2.0 e la rel. di VB e' la
6.0 sp3.
Devo accedere tramite RDO perche' in teoria (molto in teoria!) dovrei
potermi "fregare" del tipo di db con cui sto lavorando (sono stati definiti
dei DSName all'interno di ODBC32 e accedo tramite quelli con RDO).
La complicazione sta nel fatto che il record in questione ha un campo
definito "memo" e che in realtà contiene degli oggetti binari
(registrazioni vocali, documenti word e chi piu ne ha piu' ne metta...).
Ora, fino alla versione 5.0 di VB per leggere tale campo non facevo altro
che 
Dim vCampo
	...
	vCampo = rdoRS("CampoMemo")
e in vCampo mi ritrovavo il contenuto del campo in questione.
Con la versione 6.0 di VB questo non mi e' piu' concesso e la lettura di
questa colonna mi restituisce il seguente errore: 
<S1000: [Microsoft][ODBC Microsoft Access Driver]
Operation is not supported for this type of object.>.
Ho provato allora ad utilizzare il metodo apposito (GetChunk) cosi' come
viene ben spiegato nell'help (nella speranza che fosse stato risolto il
baco della versione 5.0 che comunque non funzionava), ma l'errore
persiste!!! 
Cmq ho una precisazione da fare:
Ho appurato personalmente che i metodi GetChunk e AppendChunk dell'RDO non
hanno mai funzionato nemmeno nella versione 5.0. Provandoli
con DAO invece ha funzionato tutto (da qui ne deduco che il modo in cui
li ho provati era corretto e che il baco fosse all'interno della dll di
sistema).
Forse la sto facendo piu' grave di quello che effettivamente è, pero' vi
assicuro che di questi campi memo non ne posso proprio piu'!!!
Riporto in coda parte del codice che avevo scritto... se volete qualche
delucidazione chiedete pure... pagherei oro per risolvere questa
questione...
Vi prego.... aiutatemi.....
Paperina*
-------------------------------------------
Public Function CopiaTabellaAppunti(IdTab as Long, NewIdTab as Long) as
boolean
Dim rsPIn           As rdoResultset
Dim sSQL            As String
Dim vOggetto
Dim lColSize        As Long
     .......
    sSQL = "select * from Tabella Where Chiave = " & IdTab 
 
    Set rsPIn = g_DB.OpenResultset(sSQL, rdOpenDynamic)
    Do While Not rsPIn.EOF
      with clsOLE
       .ID = lNewId
       .Campo1= rsPIn("CAMPO1") 
       .Descrizione1 = rsPIn("DESCRIZIONE") 
       .ClasseServer = rsPIn("CLASSE_SERVER")
'*************************************************************************************
        lColSize = rsPIn("OGGETTO").ColumnSize
=======>>>>>>       vOggetto = rsPIn("OGGETTO").GetChunk(lColSize)
                                                       'E qui va in errore
       .Oggetto = vOggetto
       LenOggetto = Len(.Oggetto)
'*************************************************************************************
       'esegue la scrittura su database
        .WriteNew
        End With
End Function

 vCampo = rdoRS("CampoMemo")
a fare :
vCampo = rdoRS!CampoMemo
fammi sapere
Ciao
---

 ha
scritto:
|:>ai provato invece di
|:>> vCampo = rdoRS("CampoMemo")
|:>a fare :
|:>vCampo = rdoRS!CampoMemo
E' assolutamente la stessa cosa... e anche l'errore non cambia...
Paperina*

A me Getchunk funziona sia in DAO che in RDO. Tuttavia puo' esserci un
problema quando il campo è NULL (in questo caso, pero', dovrebbe essere la
richiesta della lunghezza ad andare in errore).
Il fatto di usare un variant potrebbe essere un problema - io uso sempre un
array di Byte - 
p.es
.:
   Dim bb() As Byte
   bb() = rdoRS("CampoMemo").GetChunk(rdoRS("CampoMemo").ColumnSize)
(Questo secondo me funziona.)
Io farei un controllino sul contenuto del campo (cioè la ColumnSize) e
proverei a ricevere in bb().
----------------------------------------------------------------------
Stefano Minardi
zet...@mclink.it
----------------------------------------------------------------------


ha scritto:
|:>   Dim bb() As Byte
|:>   bb() = rdoRS("CampoMemo").GetChunk(rdoRS("CampoMemo").ColumnSize)
Macche'... Ho provato, ma niente da fare... L'errore e' sempre lo stesso e
il campo e' impostato (contiene una registrazione vocale di 821.312 byte).
Paperina*

Io lo uso tutti i giorni, quindi direi che c'è qulcosa che non va.



ha scritto:
OK. Fermi tutti!!!
Ho risolto!!
Devo dire che mi ci sono volute due settimane di ricerche, ma alla fine ho
capito!!!
Il problema sta proprio nella definizione (errata sin dal principio) dei
campi all'interno della tabella come "memo" anziche' come "Oggetti OLE".
Vorrei sottolineare che questa struttura me la sono trovata sin dal
principio e ho dovuto adeguarmi a qualcosa che era fuori dalla mia
comprensione. In ogni caso, fino a che si accedeva a tali campi a 16 bit
non ci sono stati problemi, ma quando poi sono passata a 32 bit (vb5) ho
cominciato ad averne sicuramente in scrittura (AppendChunk) e quando infine
sono approdata a vb6, avendo installato con MDAC 2.1 i nuovi driver per
Access, ha cominciato a dare i numeri anche la lettura di questi campi
(GetChunk), e meno male....
Il problema sembra consistere nel fatto che i campi memo sono stati
(giustamente, dico io) progettati per accogliere semplicemente stringhe
(anche se "infinitamente" lunghe), e l'inserimento al loro interno di
valori binari ha mandato a pallino (purtroppo solo nelle versione a 32 bit)
la traduzione dei valori contenuti (ha qualcosa a che vedere con la
traduzione in UNICODE...)...
Vabbe'... 
Ringrazio comunque tutti coloro che hanno almeno provato ad aiutarmi.
Paperina*

traduzione in UNICODE...)...
E' probabile. Infatti io ho sempre usato ANSI sia per i memo che per i
longbinary (array di byte, non stringhe) per cui li gestisco nello stesso
modo *in scrittura* oltre che in lettura.
Si noti che un dbms unicode (
p.es
. Access) potrebbe avere la brutta tendenza
a interpretare i dati scritti in un campo blob tramite una stringa -
trasformando la stringa nell'equivalente unicode. Questo, oltre a far
raddoppiare l'occupazione, renderebbe illeggibili i dati.



ha scritto:
|:>Si noti che un dbms unicode (
p.es
. Access) potrebbe avere la brutta tendenza
|:>a interpretare i dati scritti in un campo blob tramite una stringa -
|:>trasformando la stringa nell'equivalente unicode. Questo, oltre a far
|:>raddoppiare l'occupazione, renderebbe illeggibili i dati.
Appunto... ^__________^
Paperina*