Newsgroup: it.comp.lang.visual-basic
Titolo: [VB] - mosca cieca con le "dipendenze"!!!

Mi scuso se il post è lunghetto, ma più di così non posso riassumere.
Da menu progetto->riferimenti leggo:
Visual basic for applications (msvbvm60.dll)
Visual basic runtimes objects and procedures (msvbvm60.dll\3)
Visual basic objects and procedures (VB6.olb)
OLE Automation (stdole2.tlb)
Microsoft data formatting Object Library 6.0 (SP4) (MSSTDFMT.dll)
Microsoft DAO 3.6 Object Library (dao360.dll)
FSFWrap 1.0 Type Lybrary (FSFWrap.dll)
ActiveMovie Control Type (quartz.dll)
DirectShowStream 1.0 Type Lybrary (amstream.dll)Directx 7 For Visual Basic
Type Lybrary (dx7vb.dll)
IshellFolder Extended Type Lybrary 1.2 (ISHF_Ex.tlb)
il programma usa un database di access, nelle proprietà dei controlli data
ho impostato "UseJet".
Ora, mi è stato assicurato (in questo NG) che il programma può girare anche
senza che sia installato access sulla macchina.
Ho creato un benedetto installer (usando inno setup, se necessario posso
riportare lo script) con queste librerie:
dao360.dll
MSSTDFMT.dll (percè rompe sempre le scatole se nn è la stessa versione)
FSFWrap.dll (necessaria al programma e nn presente in windows)
ISHF_Ex.tlb
Con questa configurazione mi dava "classe non registrata  CLSID...." e
questo problema l'ho risolto aggiungendo la libreria:
dao350.dll
a questo punto però spunta un non meglio identificato errore 525 "data
access error".
Mi è stato detto che avrei risolto installando mdac_typ.exe aggiornando la
mia versione di MDAC. ma onestamente non capisco perchè dal momento che il
problema si presenta su altre macchine.
Ho creato anche il file delle dipendenze con la creazione guidata pacchetti
di Visual Basic, e l'elenco che ottengo è:
Uses1=MSSTDFMT.DLL
Uses2=dao360.dll
Uses3=FSFWrap.dll
Uses5=ISHF_Ex.tlb
Uses4=quartz.dll
Uses6=MSMASK32.OCX
Uses7=MSCOMCT2.OCX
Beh, le ultime tre credo di poterle scartare. o no?
Ho eseguito i test su 5 macchine, tutte senza access, 3 con windows 2000 e 2
con windows XP. Bene, misteriosamente i risultati sono questi:
tutto fila liscio su una con 2000 e su una con XP
su una con 2000 e una con XP errore 525
sulla terza con 2000 "manca la dll vb5db.dll" (ma questa non è nelle
dipendenze riscontrate da VB)
La macchina su cui ho realizzato l'applicazione ha 2000 pro, con VB6 ita
SP5, mdac 2.7 (2.70.9001.0) e credo di avere installata la versione 4 del
Jet.
Spero di non aver scordato nulla.
Vi prego, aiutatemi!!!
Non sono un esperto, ormai lo sapete. Ne sto uscendo veramente pazzo, e
prima che la mia autostima si avvicini allo zero assoluto...
Grazie

senza che sia installato access sulla macchina.
Se tu avessi letto anche gli altri post avresti scoperto che, per far girere una
applicazione che utilizza ADO per connettersi ad un db access dovevi installare
una serie di cosucce. L'ultimo post, in ordine di tempo, completo, accurato e
chiosato, aveva per subject
[!][FAQ]Distribuire applicazioni ADO
postato da lokar, che ha confessato, per altro, di non aver mai dovuto fare una
cosa del genere, ma a furia di leggere post sull'argomento, aveva imparato tutto
lo stesso.
Salutoni
Sergio

 ha scritto nel messaggio
news:Ofs%9.12309$YL4....@tornado.fastwebnet.it...

Sulla macchina con XP che non andava ho appena fatto installare mdac_typ.exe
(preso dal sito microsoft), ma nulla da fare, sempre lo stesso problema.
aiuuuuuuuuuuuuuuuto!!!

 aiuuuuuuuuuuuuuuuto!!!
Anzichč aiutarti, visto come quoti dovrei, usare delle male parole...
Comunque, vedi un po' se questo ti serve:
[!][FAQ]Distribuire applicazioni ADO.
Ciao
Alberto
PS: leggi anche un po' di netiquette, altrimenti qui dentro hai vita
breve...

 [!][FAQ]Distribuire applicazioni ADO.
Sono andato a cercarmi quel post. Ma a questo punto sorge un'altra domanda,
e vi prego (prima di prendermi a calci nel sedere se ho sbagliato a quotare
anche sta volta) di darmi un consiglio.
Il programma che ho fatto ormai credo di aver capito che usi ADO, ed è già
un passo avanti. Io ero convinto che usasse DAO per via del riferimento in
VB alla dao360.dll.
Detto questo, dal post di lokar apprendo che è necessario installare un
pacco di roba per far andare un programma con ADO. Ma dal momento che è una
utility di 600 K, distribuita gratis su internet, non mi pare il caso di far
scaricare alla gente 20 e passa mega di roba aggiuntiva per farla girare.
Allora vi chiedo: se passo a ODBC mi evito tutto sto casino? me la cavo con
qualche libreria stupida?
Vi ringrazio per la pazienza e vi chiedo scusa se sono stato scortese nel
quotare e/o postare i miei messaggi.
Grazie

 lo stesso.
Vado subito a cercarlo e a leggerlo.
Grazie mille.

 nel quotare e/o postare i miei messaggi.
Basta imparare.
Complimenti per i miglioramenti repentini.
Ciao
Alberto

 Alberto
Enrico

 > Verifica piuttosto se non puoi eliminare qualche riferimento.
Bene, ho installato il mdac_type.exe e il JetSp3E.exe su una delle macchine
con XP che non andava.
Il problema rimane.
Bah :'(((
Ciao

 Il problema rimane.
Esattamente quale problema rimane?
(non č una domanda oziosa, credimi)
Salutoni
Sergio

 Sergio
Enrico

 Il problema è sempre lo stesso. Errore 525 "errore di accesso ai dati"
Quale istruzione pensi che generi questo errore?
Scusa se insisto con l'interrogatorio, ma stai affermando che una procedura
comunemente accettata non dà i risultati attesi, è fondamentale, a questo punto,
chiarire tutti i termini della questione.
Salutoni
Sergio

 Sergio
Ciao
Enrico

 ti riporto il codice:
Sicuramente indispensabile, ma per quanto mi riguarda insufficiente :-)
Non riesci a risalire all'istruzione incriminata?
Salutoni
Sergio

 Sergio
 Ciao
Enrico

 domande, capire le risposte e lurkare.
Per favore, non prendertela: parto dal presupposto che si frequenti il ng allo
scopo di imparare, quindi penso di fare un piacere se faccio notare gli errori.
Naturalmente se gli errori li commetto io il fatto che qualcuno li noti non
giova alla mia autostima, ma meglio che se ne accorgano qui piuttosto che i
clienti.
Risalutoni
Sergio

 Sergio
Ciao

>> dove avviene l'errore?
Un mezzo niubbo che distribuisce applicativi in mezza Italia?
Un bel coraggio...
Comunque, a parte gli scherzi...
Non entro nel merito del tuo codice. Gli errori potrebbero stare in cento
punti diversi.
Quindi, adesso fai una versione di debug, in cui metti una serie di msgbox,
uno ogni riga di codice, in modo da individuare esattamente il punto in cui
l'app va in errore (come ti ha detto Cssoft).
Poi ci risentiamo.
Anche perchč, se hai messo MDAC_Typ2.7, poi Jet40Sp3, e hai verificato di
non avere Tlb o msvcrt nel setup, a livello di distribuzione dovresti essere
a posto, e l'errore potrebbe essere in esecuzione.
Ad esempio, in XP e W2k č possibile inibire l'accesso in scrittura a
determinate cartelle, anche locali;
Potresti fare riferimento a librerie di scripting non presenti;
Potresti usare CreateObject su classi onnregistrate, ecc....
Per cui, senza individuare il punto esatto siamo in mezzo al mare.
Facci sapere.
Alberto

 Alberto
Enrico

 Poi ci risentiamo.
Ho fatto come mi avete consigliato, e questo è quello che è venuto fuori.
Per completezza riporto tutta la sub incriminata e vi spiego cosa ho fatto:
Private Sub Form_Load()
    Call loadform
    'initializzo le variabili
    firstCD = True
    noofcds = 0
    player.Visible = False
    xlabel.Visible = False
    Text1.Visible = False
    info.Visible = True
    altre_tracce.Visible = False
    MsgBox ("1")
    Data1(0).Visible = False
    MsgBox ("2")
    Data1(0).DatabaseName = VB.App.Path & "\db1.mdb"
    'Msgbox("miapassword")
    'Data1(0).Connect = ";PWD=miapassword"
    MsgBox ("3")
    Data1(0).Refresh
    'Impostiamo l'indice da usare
    MsgBox ("4")
    Data1(0).Recordset.Index = "Fourcc"
    MsgBox ("5")
    Data1(1).Visible = False
    MsgBox ("6")
    Data1(1).DatabaseName = VB.App.Path & "\db1.mdb"
    'Msgbox("miapassword")
    'Data1(1).Connect = ";PWD=miapassword"
    MsgBox ("7")
    Data1(1).RecordSource = "Audio_codec"
    MsgBox ("8")
    Data1(1).Refresh
    ' Impostiamo l'indice da usare
    MsgBox ("9")
    Data1(1).Recordset.Index = "ID_audio"
    MsgBox ("10")
    Data1(2).Visible = False
    MsgBox ("11")
    Data1(2).DatabaseName = VB.App.Path & "\db1.mdb"
    'Msgbox("miapassword")
    'Data1(2).Connect = ";PWD=miapassword"
    MsgBox ("12")
    Data1(2).RecordSource = "Audio_codec"
    MsgBox ("13")
    Data1(2).Refresh
    ' Impostiamo l'indice da usare
    MsgBox ("14")
    Data1(2).Recordset.Index = "ID_audio"
End Sub
All'inizio ho messo un Msgbox per riga di codice, con attenzione particolare
alla riga con la password perchè (e lupo se lo ricorderà sicuramente) mi
aveva dato problemi in passato.
Poi alla prima prova su una macchina non mia, l'errore era all'altezza del
'Msgbox("miapassword"). Allora mi son detto, vuoi vedere che si incasina
quando deve immettere la password per l'apertura del database?
Detto fatto ho commentato le due righe (megbox + comando) è ho eseguito la
prova nuovamente. A questo punto l'errore avviene alla riga successiva, cioè
al momento del data1(0).refresh.
In sostanza l'ultima operazione che riesce a fare è
Data1(0).DatabaseName = VB.App.Path & "\db1.mdb"
ci avete capito nulla?
Sono disposto a mandarvi il sorgente di questa cosa, perchè la mia autostima
(peraltro già parecchio bassa) sta assumendo le sembianze dell'indice mibtel
in tempi di guerra... scende precipitosamente!!!
Grazie e ciao

 in tempi di guerra... scende precipitosamente!!!
P.S. mi sono accorto, riguardando i posts precedenti, che non ho mai detto
che il database č in access 97.
Secondo voi puň risolvere trasformarlo in 2000?
Ciao

     'Data1(1).Connect = ";PWD=miapassword"
Quindi (vedi che funziona), abbiamo individuato l'errore.
Che fallisca la riga successiva se commenti questa è ovvio (se non fai il
connect, fa fatica a fare altre operazioni).
A questo punto ti devo dire una cosa: Non uso assolutamente il
DataEnvironment (se quel Data1 lo è), per cui esattamente non ti so dire.
Però, così a occhio, toglierei quel punto e virgola all'inizio, e
verificherei la password.
Mi fido di te che Connect sia una proprietà (pensavo fosse un metodo).
Oltre a questo, verifica che l'utente con cui esegui l'applicativo abbia
autorizzazioni di lettura e scrittura sulla cartella in cui si trova il DB
(con XP è possibile gestire anche questi diritti).
Ciao
Alberto

 Alberto
Enrico

 accede come administrator :(
Anche su 2000 č possibile togliere le autorizzazioni, anche ad un
administrator, se si vuole.
Ma era solo un consiglio per iniziare a togliere di mezzo alcune ipotesi.
Alberti

 Ma era solo un consiglio per iniziare a togliere di mezzo alcune ipotesi.
Dunque?
passi la mano?
speriamo he qualcuno abbia qualche idea :'(
Ciao

 passi la mano?
Sě.
Non ho mai usato il controllo Data.
Mi era sfuggito inizialmente questo dettaglio, per cui piuttosto che dire
delle cavolate lascio la palla a qualcun altro.
Ciao
Alberto

 delle cavolate lascio la palla a qualcun altro.
Sperem...
ciao

 speriamo he qualcuno abbia qualche idea :'(
Siamo alla frutta ormai.....
Sono nelle stesse condizioni di alberto, non uso il controllo data, quindi sparo
a caso.
quando fai la connect dell'oggetto data, prova a specificare comunque "access
2000;PWD=eccetera"
oppure prova quanto indicato in uno dei link postati da lupo:
Option Explicit
Private daoDB36 As Database
Private rs As DAO.Recordset
Dim sPath As String
Private Sub Form_Load()
sPath = _
"C:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb"
Set daoDB36 = DBEngine(0).OpenDatabase(sPath)
Set rs = daoDB36.OpenRecordset("Customers")
Set Data1.Recordset = rs
End Sub
e vediamo che cosa succede.
--
Salutoni
Sergio

 Sergio
Ciao, enrico

 Dim sPath As String
Qualcosa si muove, un errore son riuscito ad eliminarlo. Ecco come ho fatto:
Option Explicit
Dim db As Database
Call form_load()
    Set db = OpenDatabase(App.Path + "\db1.mdb")
End sub
Private Sub apri_Click()
    Dim q1 As DAO.Recordset
    Set q1 = db.OpenRecordset("select * from lista_completa where fourcc='"
+ realVCodec + "'")
        If avi_header_fourcc <> "DIB " Then
             If q1.EOF Then
                fourcc.Text = avi_header_fourcc
                VCodec.Text = avi_det_VCodec
            Else
                VCodec.Text = q1("codec")
            End If
        Else
            VCodec.Text = LoadResString(234 + lingua)
            fourcc.Text = avi_header_fourcc
        End If
Bene, in questo modo ho eliminato i controlli data.
Questo va. Ma nel form eseguo tre volte di fila una ricerca nel database, e
ala seconda da errore.
Ora ho definito anche q2 e q3 as dao.recordset, ma sono attesa di un test.
Ma c'č un problema. All'inizio avevo dichiarato una sola q as dao.recordset
Nel frattempo vi chiedo se ho fatto bene, e se avete qualche altro
suggerimento. Grazie.
Ciao

 Bene, in questo modo ho eliminato i controlli data.
FUUUUUUUNZIOOOOOOOOOOOOOOOOOOOOOOOONAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
sissě
ce l'ho fatta finalmente.
dichiarando tre variabili, q1,q2 e q3 as dao recordset funziona alla grande.
Grazie Sergio ed Alberto per avermi accompagnato in questa lotta!
hehehe
davvero vi sono riconoscente per la pazienza, i suggerimenti e i rimproveri.
Grazie, grazie grazie.
(appena finisco di sistemare sta versione vi posto il link da cui
scaricarla, cosě ci date un'occhiata per sapere di cosa parlavamo) :)
Ciao