Newsgroup: it.comp.lang.visual-basic
Titolo: [CHE PALLE!!!] MA MySQL non supporta un cazzo?!?!?!

 
Ormai più che una richiesta di aiuto è uno sfogo!!!
Faccio il mio bel programmetto che lavora su ACCESS con DAO e va una
meraviglia. Nasce la necessità di lavorare con MySQL e mi dico: basta
cambiare DAO con ADO e sono a posto. Provo ADO con ACCESS e va una
meraviglia. Provo con MySQL e nascono una marea di problemi:
a) non supporta ADOX per la creazione di tabelle: ho copiato dalla giuda e
funziona benissimo con Access. Sono dovuto ricorrere al CREATE TABLE, ma non
ho ancora trovato la maniera di creare gli indici.
b) usa solo nomi tabella in minuscolo: faccio CREATE TABLE MiaTabella e la
tabella si crea col nome "miatabella". Ovviamente quando cerco di aprirla ci
riesco solo se faccio la open di "miatabella", e non di "MiaTabella".
c) non supporta AddNew. Dovrò fare Con un INSERT INTO....
CHE PALLE!!!!!!!
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/


Imho (Con il supporto del Balena)
In teoria dovrebbe essere così sempre, cioè un programma fatto a regola
d'arte dovrebbe usare istruzioni SQL "INSERT INTO NOMETABELLA" "UPDATE
NOMETABELLA SET..." "DELETE FROM NOMETABELLA...."
I metodi addnew update e delete di ADO o di qualunque altra libreria di
oggetti per database non ti assicurano alcun tipo di scalabilità e
compatibilità.
ciao

 ciao
Mò l'ho capito: sono un programmatore "fai da te"! Sto imparando piano
piano, e con AddNew mi pareva decisamente più pulito il codice.... :-(
Ciao!


 
Sei proprio sicuro ???
questo codice è funzionante :
Set rsImmagini = New ADODB.Recordset
Set myStream = New ADODB.Stream
myStream.Type = adTypeBinary
rsImmagini.Open "SELECT * FROM tb_immagini WHERE 1=0",   _
     gnMySQL,adOpenStatic,
rsImmagini.AddNew
myStream.Open
myStream.LoadFromFile App.Path & "\ImgTmp.jpg"
rsImmagini!id_regft = liIdRegft
rsImmagini!tipoDoc = lsTipoDoc
rsImmagini!numPagina = lFrame 'liPagina
rsImmagini!documento = myStream.Read
rsImmagini!idfornit = liIdForn
rsImmagini!datadoc = Format(ldDataDoc, "yyyy-mm-dd")
rsImmagini!numdoc = lsNumDoc
rsImmagini.Update
myStream.Close
rsImmagini.Close
Set myStream = Nothing
Set rsImmagini = Nothing
'================================================
MySql vers. 4.0.20a-nt
+ ODBC 3.51
Ciao
Paolo Ardissone

 + ODBC 3.51
Io non sto usando l'ODBC (mi aveva dato errori svariati e una lentezza
paurosa), ma l'OLE DB.
Può essere qui la differenza?


 c) non supporta AddNew. Dovrò fare Con un INSERT INTO....
Mai avuto problemi ad utilizzare i recordset e tantomento l'addnew: semmai i
veri problemi di scrivere un programma che utilizzi diversi DBMS derivano
dai differenti dialetti SQL! ;)

 dai differenti dialetti SQL! ;)
Che ti devo dì: sull'AddNew mi sono beccato un "metodo non supportato"!
Ciao


 supportato"!
Dal provider _non_ da mysql... uffa!

 Dal provider _non_ da mysql... uffa!
E dai, non te la prendere, sono un po' alle prime armi... Ma quanti Provider
posso trovare (e dove) per MySQL? Cioè, volendo evitare l'ODBC, io, dopo
ampia navigazione su Google ho scaricato da 
www.mysql.com
 MyOLEDB3.exe e ho
usato come provider nella stringa di connessione "mysqlprov": ci sono
alternative?


>
CUT
Allora....3 regole fondamentali!
a) Quando fai un prog...accertati di quel che vuoi fare
b) Quando fai un prog...accertati di quello che sai fare
c) Quando fai un prog...accertati di sapere quello che vuoi fare
se le rispettavi....
-) Sapevi che mySql è "quel coso lì" e non un clone di access
-) Sapevi che tecnologia usare
-) Sapevi che cosa consigliare
adesso... ti arrangi
Nel senso che un OLEDB su mysql te lo scordi....
MA
come ti han detto è mooooolto comodo impararsi un po di sql
ti rimarrà mooolto utile ...se non con mysql...con un altro DB!
MySQL non nasce per windowwwwssss....
nasce per linux come progetto gnu.....
i porting son "porting"...alcune cose le fanno bene...altre così così!
personalmente mi piace più postgresql....ma parlo di altri SO....
per questo coso.....chiamato windowwws...io uso a cess....talvolta
smadonnando MSDE....raramente SQLsrv
però ora arriva il nEt....msde incalza....è "gratisse"....perchè non usi
quello???...sempre rimanendo dentro windowwwsssss....troveresti meno
problemi per quanto riguarda il provider.
perchè vuole mySQL il tuo cliente? c'è una ragione specifica?
MSDE è "gratisse" pure quello
Ciao!
"
Un wodka che pensa che usare un elefante con le bombole per pescare acciughe
non sia come usare una foca ammaestrata.
Ossia
Ogni ambiente ha le sue bestie predilette!
"

 una tabella col nume X
[snip]
Questo credo di poterlo spiegare, se ho capito la procedura.
Tu fai:
- Apro connessione A
- Apro Connessione B (la tabella X già esiste)
- A cancella e ricrea X
- B non trova più X
Beh, non posso biasimare la connessione B, anzi, è buona che non vada in
errore.
B dovrebbe rileggersi la struttura del DB per conoscere X che nel frattempo
è cambiata.
Riconnetti B e tutto dovrebbe andare a posto.
Cosucce così ce le piantava dentro anche Access di tanto in tanto.
Per il discorso AddNew, ma tu usi la CreateObject o referenzi l'OLEDB di
MySql?
Mi pare davvero strano che manchi l'AddNew.
Ciao
--
NeoDataType : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 Riconnetti B e tutto dovrebbe andare a posto.
ma perchè la connessione carica in memoria tutta la struttura del DB?
secondo me dovrebbe funzionare in questo modo
1-Apro connessione A
2-Apro connessione B
3-Invio un comando di drop e di create tramite A.
4-Invio un comando di select tramite B.
se invio il comando 4 prima della fine di 3 ho sicuramente dei problemi ...
altrimenti mi aspetto che il 4 legga tranquillamente la tabella.

 - B non trova più X
NO, faccio:
 - Apro connessione A
 - se la tabella X già esiste la cancello
 - A crea X
 - Chiudo connessione A
 - Apro Connessione B (la tabella X già esiste)
 - B non trova più X, ma solo se è stata cancellata al punto 2. Se non
esisteva ed è solo stata creata al punto 3, tutto ok!!!!
Io non ci ho capito una mazza.... :-(


 Ciao!
Sotto certi aspetti, sono io il mio cliente, ma MySQL me lo sono trovato
lě...
In conclusione, grazie per l'incoraggiamento (scherzo!!!), ma sono testone,
e penso che continuerň la mia avventura per vedere di lavorare oggi e farlo
un po' meno domani quando avrň automatizzato le mie procedure!!!
Ciao



Curiosita' mia. Chi hascritto il data provider per ADO verso MySQL?
--
Ciao!
Luca Menegotto

 Curiosita' mia. Chi hascritto il data provider per ADO verso MySQL?
Ah, non chiederlo a me: come hai potuto appurare è già qualcosa che riesca a
farlo funzionare ADO.... ;-)


 "tabella non esistente".
Ciao, che versione di MySql usi ?
se nella tua versione è previsto, puoi usare :
'*************************************************
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
     [(create_definition,...)]
     [table_options] [select_statement]
Or:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
     [(] LIKE old_tbl_name [)];
create_definition:
     column_definition
   | [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)
   | KEY [index_name] [index_type] (index_col_name,...)
   | INDEX [index_name] [index_type] (index_col_name,...)
   | [CONSTRAINT [symbol]] UNIQUE [INDEX]
         [index_name] [index_type] (index_col_name,...)
   | [FULLTEXT|SPATIAL] [INDEX] [index_name] (index_col_name,...)
   | [CONSTRAINT [symbol]] FOREIGN KEY
         [index_name] (index_col_name,...) [reference_definition]
   | CHECK (expr)
column_definition:
     col_name type [NOT NULL | NULL] [DEFAULT default_value]
         [AUTO_INCREMENT] [[PRIMARY] KEY] [COMMENT 'string']
         [reference_definition]
type:
     TINYINT[(length)] [UNSIGNED] [ZEROFILL]
   | SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
   | MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]
   | INT[(length)] [UNSIGNED] [ZEROFILL]
   | INTEGER[(length)] [UNSIGNED] [ZEROFILL]
   | BIGINT[(length)] [UNSIGNED] [ZEROFILL]
   | REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
   | DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
   | FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
   | DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL]
   | NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL]
   | DATE
   | TIME
   | TIMESTAMP
   | DATETIME
   | CHAR(length) [BINARY | ASCII | UNICODE]
   | VARCHAR(length) [BINARY]
   | TINYBLOB
   | BLOB
   | MEDIUMBLOB
   | LONGBLOB
   | TINYTEXT
   | TEXT
   | MEDIUMTEXT
   | LONGTEXT
   | ENUM(value1,value2,value3,...)
   | SET(value1,value2,value3,...)
   | spatial_type
index_col_name:
     col_name [(length)] [ASC | DESC]
reference_definition:
     REFERENCES tbl_name [(index_col_name,...)]
                [MATCH FULL | MATCH PARTIAL]
                [ON DELETE reference_option]
                [ON UPDATE reference_option]
reference_option:
     RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT
table_options: table_option [table_option] ...
table_option:
     {ENGINE|TYPE} = {BDB|HEAP|ISAM|InnoDB|MERGE|MRG_MYISAM|MYISAM}
   | AUTO_INCREMENT = value
   | AVG_ROW_LENGTH = value
   | CHECKSUM = {0 | 1}
   | COMMENT = 'string'
   | MAX_ROWS = value
   | MIN_ROWS = value
   | PACK_KEYS = {0 | 1 | DEFAULT}
   | PASSWORD = 'string'
   | DELAY_KEY_WRITE = {0 | 1}
   | ROW_FORMAT = { DEFAULT | DYNAMIC | FIXED | COMPRESSED }
   | RAID_TYPE = { 1 | STRIPED | RAID0 }
         RAID_CHUNKS = value
         RAID_CHUNKSIZE = value
   | UNION = (tbl_name[,tbl_name]...)
   | INSERT_METHOD = { NO | FIRST | LAST }
   | DATA DIRECTORY = 'absolute path to directory'
   | INDEX DIRECTORY = 'absolute path to directory'
   | [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name]
select_statement:
     [IGNORE | REPLACE] [AS] SELECT ...   (Some legal select statement)
*===================================================
Non ho mai dovuto usarla, ma ti direi di provare.
Ciao
Paolo Ardissone

 [(] LIKE old_tbl_name [)];
Senza entrare nel dettaglio delle varie definizioni (ca@@o, perň, sei un
grande....), una istruzione cosě, se ho capito bene, fa la verifica di
esistenza della tabella, e solo se la risposta č negativa, crea la nuova. Il
mio problema, perň, č che essendo una tabella di appoggio, la struttura
potrebbe non essere la stessa usata al giro prima, quindi una CREATE del
genere potrebbe fregarmi: se la tabella esiste ma con truttura differente,
non viene ricreata e al momento di popolarla sono fregato!
Ps: ma definire una tabella TEMPORARY cosa comporta?


 limitando a crearmi uno strumento che mi aiuti un po' nel lavoro.
Per sapere che versione di MySql usi devi dare questo comando :
  SELECT VERSION()
Prova questo codice buttato giù al volo :
Dim rsTmp As ADODB.Recordset
Dim lsSQL as string
lsSQL = "SELECT VERSION() ;"
Set rsTmp = New ADODB.Recordset
Set rsTmp = gnMySQL.Execute(lsSQL) ' gnMysql sarà la tua connection
If rsTmp.RecordCount > 0 Then
     MsgBox rsTmp.Fields(0).Value
End If
rsTmp.Close
Set rsTmp = Nothing
Poi, se mi mandi un esempio delle 2 tabelle diverse che vuoi creare,
posso fare delle prove.
Quello che non ho capito è se ti trovi nella necessità di aprire
più tabelle con lo stesso nome in contemporanea da due utenti diversi,
ma mi pare di capire che non sia così in quanto se trovi la tabella,
la cancelli.
Anche io avevo avuto dei problemi di lentezza con ODBC, ma poi avevo 
visto che derivava dal fatto che era abilitato il log ODBC; 
disabilitandolo non ho avuto puù il problema della lentezza.
Tieni conto comunque che devi costruirti il programma anche in 
previsione di gestire tabelle con molti records, e quindi ti conviene 
effettuare delle query mirate con gli opportuni filtri e/o la clausola 
LIMIT che ti permettano di diminuire il traffico di rete e di aumentare 
la velocità di risposta del database.
Fammi sapere l'esatta sequenza delle operazioni.
Ciao
Paolo Ardissone

 visto che derivava dal fatto che era abilitato il log ODBC;
Come lo disabilito, così provo?
In realtà facendo l'aperura su un Recordset di una SELECT un po' grande
(~6000 record e 195 campi) a parte la lentezza paurosa, mi crashava sempre,
mentre con OLE DB andava una meraviglia!
Non potrei fare una cosa mista, se no: uso L'ODBC quando devo creare o
modificare tabelle, e OLE DB nella apertura di Recordset grandi.


 modificare tabelle, e OLE DB nella apertura di Recordset grandi.
Ho riprovato a portarmi su ODBC: risolvo tutti i problemi, ma la lentezza è
insostenibile....
Chi mi sa dire qualcosa in più su questa storia dei LOG?

 
Se ben ricordo ( parlo di 3 anni fa circa ) nella scheda dei drivers 
ODBC nel pannello di controllo c'è una voce "Analisi", ed la possibilità 
di scelta di un file di log sul quale registrare tutta l'attività delle 
chiamate ai driver ODBC, è quello che io avevo dovuto disabilitare per 
problemi di lentezza. Devo comunque dire che all'epoca i driver ODBC 
erano la versione 2.50, e da quando ho installato la 3.51 sulle 19 
macchine della mia rete, ( con S.O. da w95 a XP Pro ), non mi è mai 
successo di dover modificare quel settaggio.
Ciao
Paolo Ardissone