Newsgroup: it.comp.lang.visual-basic
Titolo: Problema con ADOX - [LUNGHETTO]

Salve a tutti...
Breve intro:
VB6 e mini software per la gestione della Prima Nota. Ho inserito in
apertura del programma una procedura di verifica dell'esistenza del DB
(Access); in caso non esiste lo crea tramite ADOX. La procedura č stata
creata tramite il programmino scaricato da questo link:
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=22085&lngWId=1
Il problema č che, se il DB non esiste e parte la procedura di creazione,
mi restituisce un errore -
2147217887
 (Descrizione errore: "Si sono
verificati errori in un'operazione OLE DB composta da piů passaggi.
Controllare i singoli valori di stato OLE DB, se disponibili. Nessuna
operazione eseguita") in corrispondenza della riga CAT.Tables.Append TBL.
Riferimenti ad ADOX inseriti correttamente. Vi posto la prima parte della
procedura. Il resto č simile:
Option Explicit
Private CAT As ADOX.Catalog
Public Sub CreateMDB(ByVal Path As String)
    On Error GoTo ErrTrap
 
    Set CAT = New ADOX.Catalog
 
    If Right$(Path, 1) = "\" Then
        Path = Left$(Path, Len(Path) - 1)
    End If
 
    ' ===[Create Database]===
    CAT.Create "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                 "Data Source=" & Path & "\Contabilita.mdb;"
                 '&_
                 '"Jet OLEDB:Database Password=;" &_
                 '"Jet OLEDB:Engine Type=5;"
 
    CAT.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                 "Data Source=" & Path & "\Contabilita.mdb;"
 
    CreateTables
    CreateViews
    CreateProcedures
    CreateIndexes
    CreateKeys
 
    Set CAT = Nothing
 
    Exit Sub
ErrTrap:
    MsgBox Err.Number & " / " & Err.Description
    Exit Sub
    Resume
End Sub
Private Sub CreateTables()
On Error GoTo ErrTrap
Dim TBL As ADOX.Table
' ===[Create Table 'BilancioSocieta']===
  Set TBL = New ADOX.Table
  Set TBL.ParentCatalog = CAT
  TBL.Name = "BilancioSocieta"
  TBL.Columns.Append "ID_Bilancio", adInteger, 0
  TBL.Columns("ID_Bilancio").Properties("AutoIncrement") = -1 ' True
  TBL.Columns("ID_Bilancio").Properties("Nullable") = True
  TBL.Columns.Append "AnnoBilancio", adInteger, 0
  TBL.Columns("AnnoBilancio").Properties("NullAble") = True
  TBL.Columns.Append "ResiduoCassa", adCurrency, 0
  TBL.Columns("ResiduoCassa").Properties("NullAble") = True
  TBL.Columns.Append "ChiusuraCassa", adCurrency, 0
  TBL.Columns("ChiusuraCassa").Properties("NullAble") = True
  TBL.Columns.Append "Note", adLongVarWChar, 0
  TBL.Columns("Note").Properties("NullAble") = True
  TBL.Columns("Note").Properties("Jet OLEDB:Allow Zero Length") = True
  CAT.Tables.Append TBL
.
.
.
ecc... ecc...
Grazie per le risposte che vorrete darmi
Fabrizio
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Salve a tutti...
zac
Abbi pazienza ma io faccio diverso....pensiero laterale....
Controllo se c'è l'mdb.....
se non c'è copio un mdb vuoto (ha tutto quello che serve ma è vuoto e
lo chiamo default.mdb...e sta sul cd di installazione)
nella cartella e lo rinomino con il nome giusto....
Lascia stare quel porcaio di adox!!!

   TBL.Columns.Append "Note", adLongVarWChar, 0
Questo è il problema...
Alberto
-- 
Konrad Adenauer: All'intelligenza Dio ha posto limiti, alla stupidità 
no.

 Alberto
Nel DB č un campo memo... che valore mi consigli di usare???


 Nel DB è un campo memo... che valore mi consigli di usare???
Proverei con un altro nome...
Alberto
-- 
Ho spiegato a mio nipote cos'è il compromesso: se per le vacanze tua 
madre vuole andare al mare e tuo padre invece in montagna, il 
compromesso è che si va al mare, ma il papà può portarsi gli sci.

 Alberto
Non ti seguo più... pensi che il problema sia il tipo di dati assegnato al
campo, come l'ho chiamato o la dimensione assegnata?


 Proverei con un altro nome...
No, il problema del nome che corrisponde ad una parola chiave si porrebbe se
usasse "Note" all'interno di una query DDL, invece ADOX è molto tollerante.
Il vero motivo dell'errore è questa istruzione:
  TBL.Columns("ID_Bilancio").Properties("AutoIncrement") = -1 ' True
Correggendola in
  TBL.Columns("ID_Bilancio").Properties("AutoIncrement") = True
(come poi era in origine, suppongo) l'errore scompare.
Cmq, per Fabrizio Alba: basta commentare una riga alla volta ed eseguire il
codice finché non capisci qual è l'istruzione incriminata...
Bye
Raf
-----------------------------------------------------
Funk: cooler than the other side of the pillow.

 campo, come l'ho chiamato o la dimensione assegnata?
'Note' è una parola riservata in quasi tutti i db, quindi non andrebbe 
usata come nome di campo.
Tuttavia, racchiudendola fra parentesi quadre, è possibile inserirla 
negli statement SQL.
Via ADOX, invece, non potendo usare le quadre, ritenevo fosse un 
problema.
Ma Rafunk dice che Adox è 'buono' e la lascia passare, per cui prova a 
vedere il suo consiglio.
Ciao
Alberto
-- 
Friedrich Nietzsche: Un po' di salute ogni tanto è il miglior rimedio 
per l'ammalato.

 Raf

Innanzitutto vi ringrazio.
Allora... il codice in origine era così come l'ho postato, con il -1; la
procedura esce e da' errore proprio sulla riga 
CAT.Tables.Append TBL
e non prima, quindi, anche andando step by step con F8 non riuscivo a
prenderne testa!!! (scusate il dialettalismo).
Ora controllo e vi faccio sapere 
Grazie mille


 Fabrizio
Allora... mentre prima mi dava problemi già sulla creazione della prima
tabella, ora sulla prima va tutto bene, mentre esce con lo stesso errore
alla creazione della seconda, quando chiama la riga CAT.Tables.Append TBL.
Porzione di codice incriminato:
' ===[Create Table 'Clienti']===
  Set TBL = New ADOX.Table
  Set TBL.ParentCatalog = CAT
  TBL.Name = "Clienti"
  TBL.Columns.Append "ID_Cliente", adInteger, 0
  TBL.Columns("ID_Cliente").Properties("AutoIncrement") = True
  TBL.Columns("ID_Cliente").Properties("NullAble") = True
  TBL.Columns.Append "NomeCliente", adVarWChar, 50
  TBL.Columns("NomeCliente").Properties("NullAble") = True
  TBL.Columns("NomeCliente").Properties("Jet OLEDB:Allow Zero Length") =
True
  TBL.Columns.Append "CognomeCliente", adVarWChar, 50
  TBL.Columns("CognomeCliente").Properties("NullAble") = True
  TBL.Columns("CognomeCliente").Properties("Jet OLEDB:Allow Zero Length")
= True
  TBL.Columns.Append "RagioneSocialeCliente", adVarWChar, 50
  TBL.Columns("RagioneSocialeCliente").Properties("NullAble") = True
  TBL.Columns("RagioneSocialeCliente").Properties("Jet OLEDB:Allow Zero
Length") = True
  TBL.Columns.Append "PartitaIVACliente", adInteger, 0
  TBL.Columns("PartitaIVACliente").Properties("NullAble") = True
  TBL.Columns.Append "CodiceFiscaleCliente", adVarWChar, 50
  TBL.Columns("CodiceFiscaleCliente").Properties("NullAble") = True
  TBL.Columns("CodiceFiscaleCliente").Properties("Jet OLEDB:Allow Zero
Length") = True
  TBL.Columns.Append "ResidenzaCliente", adVarWChar, 50
  TBL.Columns("ResidenzaCliente").Properties("NullAble") = True
  TBL.Columns("ResidenzaCliente").Properties("Jet OLEDB:Allow Zero
Length") = True
  TBL.Columns.Append "NumeroTelefonoCliente", adVarWChar, 50
  TBL.Columns("NumeroTelefonoCliente").Properties("NullAble") = True
  TBL.Columns("NumeroTelefonoCliente").Properties("Jet OLEDB:Allow Zero
Length") = True
  TBL.Columns.Append "NumeroFaxCliente", adVarWChar, 50
  TBL.Columns("NumeroFaxCliente").Properties("NullAble") = True
  TBL.Columns("NumeroFaxCliente").Properties("Jet OLEDB:Allow Zero
Length") = True
  TBL.Columns.Append "EmailCliente", adVarWChar, 50
  TBL.Columns("EmailCliente").Properties("NullAble") = True
  TBL.Columns("EmailCliente").Properties("Jet OLEDB:Allow Zero Length") =
True
  TBL.Columns.Append "FatturatoCliente2005", adCurrency, 0
  TBL.Columns("FatturatoCliente2005").Properties("NullAble") = True
  TBL.Columns.Append "FatturatoCliente2006", adCurrency, 0
  TBL.Columns("FatturatoCliente2006").Properties("NullAble") = True
  TBL.Columns.Append "FatturatoCliente2007", adCurrency, 0
  TBL.Columns("FatturatoCliente2007").Properties("NullAble") = True
  TBL.Columns.Append "Privato", adBoolean, 2
  TBL.Columns("Privato").Properties("NullAble") = True
  TBL.Columns.Append "Azienda", adBoolean, 2
  TBL.Columns("Azienda").Properties("NullAble") = True
  TBL.Columns.Append "NoteCliente", adLongVarWChar, 0
  TBL.Columns("NoteCliente").Properties("NullAble") = True
  TBL.Columns("NoteCliente").Properties("Jet OLEDB:Allow Zero Length") =
True
  CAT.Tables.Append TBL
Che sarà mai? Io non riesco a vedere niente di strano sul codice...


Fabrizio Alba ha scritto:
zac
Dove è il problema a prepare un mdb vuoto e copiarlo?
Perchè vuoi creare "al volo"...oltretutto per farlo devi istanziare
una libreria in più ...quella di ADOX
Non ne vedo la ragione!
Se devo creare al volo un database...lo faccio tramite SQL...in altri
database...
MA in access...visto che è un solo file .....faccio prima a preparne
uno vuoto...e vare al limite degli aggiustamenti in corso d'opera
(quindi non su una vers. definitiva...con ALTER TABLE)
Ma se devo fare una cosa pulita e veloce.....
faccio in questo modo...che tra le altre cose funziona benissimo quando
vuoi fare qualcosa "multi-azienda" con access....ogni gestione "è" il
suo mdb!
Il vantaggio è anche che cambiando MOLTO sul database.....
distribuisco l'mdb vuoto NUOVO...ed una utility che travasa i dati dal
vecchi al nuovo....
insomma ...io trovo un sacco di vantaggi a fare in questo modo!

 insomma ...io trovo un sacco di vantaggi a fare in questo modo!
In effetti, guardando la cosa da questo punto di vista, se modifico la
struttura del DB non sono costretto a dovermi modificare anche questa
procedura... Mi sa che mi hai convinto, č solo che mi piaceva l'idea di
una procedura automatica che non richiedesse molto sforzo da parte
dell'utente finale (anche inserire il CD con il pacchetto originale
potrebbe essere un grosso sforzo in alcuni casi...).
Ora ci penso e vedro' cosa fare. Resta perň il fatto che non capisco
perchč mi restituisca errore. E la cosa mi urta alquanto.
Grazie


 Che sarà mai? Io non riesco a vedere niente di strano sul codice...
Come già detto, per scoprirlo prova a commentare un'istruzione del blocco che
inizia subito dopo
    TBL.Name = "Clienti"
poi 2, poi 3, 4, etc...
rieseguendo ogni volta tutto daccapo finché l'errore non sparisce.
A quel punto hai individuato l'istruzione che crea l'errore, evidentemente
impostando una proprietà di un oggetto ADOX ad un valore non corretto.
Ah, per le colonne con tipo non text, la lunghezza può anche essere omessa.
Es.:
TBL.Columns.Append "Privato", adBoolean
TBL.Columns.Append "FatturatoCliente2005", adCurrency


 potrebbe essere un grosso sforzo in alcuni casi...).zac
Meno roba installi meglio è!...una dll in meno istanziata...è una
pasticca di malox in meno ingurgitata!
E cmq...se l'mdb non è supercomplesso....c'è sempre l'SQL...e
l'oggetto ado.command...o il metodo execute

 potrebbe essere un grosso sforzo in alcuni casi...).
zac
Ripeto stamani....se l'mdb non è supercomplesso nel senso che hai
bisogno per forza di adox per gestire "particolari" caratteristiche di
access (che non so quali possono essere ...ne mi vengono in mente)
http://www.vb123.com/toolshed/99/createtables.htm
un bel CREATE TABLE...pur non essendo "potente" come in Oracle o
SQLserver-...c'è pure in Access2000 come comando SQL!!!
e per quello che sembra tu voglia fare...è più che sufficiente!