Newsgroup: it.comp.lang.visual-basic
Titolo: ADO e AS/400???

Ciao a tutti.
Sto cercando di preparare un pgm in VB6 che utilizzi un AS/400 tramite
OLEDB.
Il codice che sto usando è il seguente:
Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
cnn.Open "Provider=IBMDA400;Data Source=S441D9BA;", "QSECOFR", "QSECOFR"
rst.Open "TEST_SOURC.FTPETIF0", cnn, adOpenKeyset, adLockOptimistic,
adCmdTable
rst.AddNew
Su quest'ultima riga ricevo il seguente errore:
"Errore di run-time 3251"
Current recordset does not support updating. This may be to a limitation of
the provider, or of the selected locktipe.
Sto sbagliando qualcosa?
Devo per caso abilitare qualcosa su AS/400?
Grazie in anticipo
Nicola

No ! il provider OLEDB di IBM Client Access NON consente la scrittura.
Devi usare OLEDB per ODBC (nel Data Source devi mettere una connessione
ODBC(32) Client Access) .
Oppure fare eseguire la scrittuta alla connessione tramite execute.
es.:  cnn.execute "UPDATE MiaLibreria.Miofile SET campo = valore" (spero la
sintassi SQL sia esatta)
Ciao.


 ha scritto nel messaggio
news:9oabb9$h91$1...@pinco.nettuno.it...


 ....................
.....Guarda io uso semplicemente ADO e lavoro benissimo come su un qualsiasi
database (tipo Access o similari) ti allego un esempio funzionante e scemo
(scemo l'esempio) .
Tieni presente che su AS400 e' possibile anche usare le transazioni con il
RollBack
ed e' importante (molto importante) capire come muoversi con i cursori  e le
viste logiche.
DIM TMP        As New ADODB.Recordset
DIM ASCONN As New ADODB.Connection
Set ASCONN = New ADODB.Connection
ASCONN.ConnectionString = "DSN=AS4XXX;PWD=QSECOFR"
ASCONN.Open
TMP.CursorLocation = adUseClient
TMP.CursorType = adOpenDynamic
TMP.LockType = adLockOptimistic
'cerco il codice del cliente
' Simulo la Seek
' puoi usare viste logiche (indici) invece del file fisico
TMP.Open "SELECT * FROM LLL.FFF WHERE CODICE = '" & var & "'" , ASCONN
IF TMP.EOF Then
     ' non esiste aggiungo record
     ' altrimenti esegue le replace sul record trovato
     TMP.AddNew
End If
TMP.Fields("CODICE") = cVar1
TMP.Fields("DESCRI") = cVar2
TMP.Update
TMP.Close
ASCONN.Close
Set TMP = Nothing
Set ASCONN = Nothing
Ciao.

 wrote in message
9oc4f6$1gr$1...@pinco.nettuno.it...


 semplice TMP.execute "insert into etc etc";
l'unica soluzione che ho trovato sta appunto nell'INSERT INTO...
o UPDATE, tremendamente lento ma l'unica soluzione valida
non č la tua nuvoletta :))
--
Fibia "Sakamoto" FBI
E-mail: 
fibi...@hotmail.com
ICQ UIN 63586057
Sito Personale: 
http://www.geocities.com/fibiafbi
VB Simple: 
http://vbsimple.virtualave.net
Membro #26 delle Mitiche Brigate Takahashi sezione Sud

 semplice TMP.execute "insert into etc etc";
Dunque... L'esempio che ho postato FUNZIONA. in azienda ho decine di
procedure scritte in questo
modo , praticamente come data-base server usiamo solo AS400 per vari motivi
(sicurezza,velocita',ecc. ecc.), l'ambiente tipico e' win2K con IBM Client
access 4.5.0  sp SF44217.
SI ! Uso il driver ODBC di  IBM C.A. che esegue benissimo le AddNew  .. MA
.. devi uase il cursore
lato Client , Questo implica che ADO deve crearsi una  tabella di
riferimenti locale dei records
per fornire le informazioni che altrimenti non sarebbero disponibili es.:
RecordCount.
Quindi e' impensabile eseguire una SELECT * su milioni di record (per
questioni di velocita' e memoria),
Ma con opportune tecniche si aggira l'ostacolo.
Altra cosa importantissima e' il controllo di record duplicati (su AS400)
che puo' essere attivo sul file
ma non esiste un contatore automatico (Tipo ID di Access) che rende univoco
il record.
OVVIAMENTE all'interno del progetto VB(6) devono esserci i riferimenti
opportuni :
Microsoft activex data objects 2.5 Library
Microsoft activex data objects Recordset 2.5 Library
Altra cosa io uso execute solo per operazioni particolari , come lo
svuotamento di un file (.execute "DELETE FROM xx.yyy")
Ultima cosa la sintassi SQL di ADO e' diversa da quella AS400 (devi scrivere
Libreria.File NON Libreria/File)
Non sono un eperto e questo e' tutto quello che conosco, ma funziona.
Ciao

 wrote in message
9ocbe5$3no$1...@pinco.nettuno.it...



Scusa una precisazione riguardo ad un tuo precedente post.
TMP.Execute .....      e' un ERRORE !!
Il metodo Execute si applica alla connessione non al Recordset.
Quindi e' ASCONN.Execute ...
Ciao.

 wrote in message
9ocknp$6h4$1...@pinco.nettuno.it...


 iniziale
Premetto che non sono un esperto , ma visto che mi sono dovuto arrangiare e
visto
la scarsa conoscienza dell'ambiemte VB+ADO+AS400 ho risolto i(nel mio caso)
in questo modo :
Una sola connection public in tutta l'applicazione , vari recordset (il meno
possibile)
divisi per selezioni 'mirate' tipo select * from xxx.ccc codice='001' con
cursore lato client
e per quelli di 'massa' tipo select * from ccc.xxx. where nome like ......"
con cursore
lato server (quindi il carico di lavoro e' tutto sul motore SQL dell' AS400
(molto performante(!?))
usate in combinazione anche sullo stesso file fisico.
OVVIAMENTE selezione solo dei campi interessati e quindi utilizzo del * solo
quando serve.
Utilizzo delle viste logiche al posto dei file fisici che aumentano la
velocita' anche del 200 %
mi spiego se la vista logica e' del tipo  campo1 + campo2 faccio la select *
from lib/vistalogica where
... condizione ORDER BY campo1+campo2   ho riscontrato un netto
miglioramento delle prestazioni.
Questa e' quanto, ovviamente le prestazioni dipendono quasi totalmente dalla
'prestanza' del tuo
AS400 .
Ciao

Una domandina...
Ma non si può fare una "Select *" anche lato client limitando semplicemente
la cache, ovvero "pacchettizzando" i records restituiti ?!
Il server mi trasmetterà i records necessari solo quando li richiedo.
O sbaglio?

 ha scritto nel messaggio
news:6eGq7.13209$Lp6.4...@news.infostrada.it...

Dimmi come .
Ciao.


Proprietà "CacheSize":
(da "Programmare con VB6" di F.Balena)
The CacheSize property sets and returns the number of records that ADO will
cache locally when working with cursors. You can adjust the value of this
property to fine-tune your application, trading memory for performance. You
can assign a new value to this property at any moment, but if the Recordset
is already open, the new setting will be used only when ADO needs to fill
the local cache-that is, when you move the pointer to the current record to
point to a record that isn't in the cache.
....quindi direi che si potrebbe no?

 Proprietà "CacheSize":
Depende tutto depende da che punto ..... :-)))
Depente da cosa devi fare se vuoi "vedere" OK ma se ti servono tutti quelli
che (il calcio :->))) ....
Basta !!!!!   scusa la mia arterio ma oggi  "tengo voglia d' fa' niente"
Ciao