Gambas-it

Gambas3 => Programmazione => Topic aperto da: giob1642 - 25 Giugno 2013, 23:34:17

Titolo: mysql inseri into
Inserito da: giob1642 - 25 Giugno 2013, 23:34:17
 nella preparazione della    seguente query (mysql)  se a tipo_sezione  inserisco il values  "Unione Stati"   la query funziona
se invece pongo  "Unione Stati" in  una variabile  la query da errore.
qualcuno sa dirmi come fare per usare variabili del tipo nomevar="Unione Stati"

                query = "insert into AUsezioni__ (nome_sezione, tipo_sezione, sigla_sezione, attiva, id_variazione)" 
                query = query & "VALUES("
                query = query & "'Comunità Europea'" & "," & "'Unione Stati'" & "," & "'BN_ce'" & " ," & "'no'" & " ," & 1 & ")"
  grazie giob1642
Titolo: Re: mysql inseri into
Inserito da: allegfede - 26 Giugno 2013, 10:21:24
cosi' al volo penso sia un problema di apici ' e virgolette "
Titolo: Re: mysql inseri into
Inserito da: giob1642 - 26 Giugno 2013, 11:23:37
no non è una questione di apici,ma mysql mal digerisce gli spazi.
un metodo potrebbe essere sostituire gli spazi con un altro carattere  per es "_" e poi nel rileggere la frase falre l'operazione inversa.
La cosa mi sembra troppo artificiosa e quasi certamente ci sarà qualche funzione che permette d'inserire anche gli spazi interni ad una stringa, ma non riesco a trevarla.
Titolo: Re: mysql inseri into
Inserito da: md9327 - 26 Giugno 2013, 11:23:53
La variabile riporta la stringa così come l'hai inserita. Se l'hai inserita senza apici, allora li devi mettere nella query, altrimenti li puoi inserire direttamente nella stringa.
Gli apici devono sempre racchiudere stringhe nelle query.
Titolo: Re: mysql inseri into
Inserito da: Ceskho - 26 Giugno 2013, 12:51:07
Codice: [Seleziona]
tua_variabile = "'Unione Stati'"
query = "insert into AUsezioni__ (nome_sezione, tipo_sezione, sigla_sezione, attiva, id_variazione)" 
query &= "VALUES("
query &= "'Comunità Europea'" & "," & tua_variabile & "," & "'BN_ce'" & " ," & "'no'" & " ," & 1 & ")"
Titolo: Re: mysql inseri into
Inserito da: giob1642 - 26 Giugno 2013, 14:33:07
A mio avviso la cosa non è così banale, mi spiego:
lavorando in gambas ho una serie di linee  definite in :
dim alinee as string[]      ognuna di queste line  contiene :
                                      comune,regione,provincia; quindi
 dim bline[]                    utilizzando split , riempo bline di dati, per es:
                                    bline[0]="Milano"
                                    bline[1]="Lombardia"
                                    bline[2]="Milano"
ne scaturisce una quey= "insert into AUsezioni__ (nome_sezione, tipo_sezione, sigla_sezione, attiva,                   id_variazione)" 
                query = query & "VALUES("
                query = query & "'Comunità Europea'" & "," &  bline[0]& "," & bline[1]& " ," & bline[2]& " ," & 1 & ")"
tutto funziona
se però le varie bline contengono: bline[0]="Abano terme"
                                                   bline[1]="Friuli Venezia Giulia"
                                                   bline[2]="Padova"
allora la query risulta giusta ma il motore del database non riesce a fare la registrazione

grazie giob1642
Titolo: Re: mysql inseri into
Inserito da: md9327 - 26 Giugno 2013, 15:07:35
Perdona, ma da questo sembra che gli spazi gli diano fastidio. Ma è anche vero che l'ultimo elemento non li ha... boh?

Ad ogni modo, le stringhe devono passare entro singoli apici, i numeri senza apici, i float con il punto decimale.

Una domanda: ma non è che hai una configurazione, o la tabella, fatta in modo particolare?
Titolo: Re: mysql inseri into
Inserito da: giob1642 - 26 Giugno 2013, 16:11:05

riporto un pezzo file txt da cui estraggo comuni, province,regioni che ho intenzione d'archiviare in una tabella da utilizzare alla bisogna; va rilevato che lo stesso problema lo ritrovo nel fare un agenda  dove archivio piccoli brani di testo che ovviamente possono contenere numerose parole,apostrofi,indirizzi e mail..............

028001;Abano Terme;PD;VEN;049;35031;A001;19726;http://www.comuni-italiani.it/028/001/
098001;Abbadia Cerreto;LO;LOM;0371;26834;A004;293;http://www.comuni-italiani.it/098/001/
097001;Abbadia Lariana;LC;LOM;0341;23821;A005;3305;http://www.comuni-italiani.it/097/001/
052001;Abbadia San Salvatore;SI;TOS;0577;53021;A006;6722;http://www.comuni-italiani.it/052/001/
095001;Abbasanta;OR;SAR;0785;09071;A007;2872;http://www.comuni-italiani.it/095/001/
068001;Abbateggio;PE;ABR;085;65020;A008;443;http://www.comuni-italiani.it/068/001/
015002;Abbiategrasso;MI;LOM;02;20081;A010;32035;http://www.comuni-italiani.it/015/002/
047001;Abetone;PT;TOS;0573;51021;A012;697;http://www.comuni-italiani.it/047/001/
076001;Abriola;PZ;BAS;0971;85010;A013;1599;http://www.comuni-italiani.it/076/001/
088001;Acate;RG;SIC;0932;97011;A014;9793;http://www.comuni-italiani.it/088/001/
071001;Accadia;FG;PUG;0881;71021;A015;2481;http://www.comuni-italiani.it/071/001/
004001;Acceglio;CN;PIE;0171;12021;A016;177;http://www.comuni-italiani.it/004/001/
077001;Accettura;MT;BAS;0835;75011;A017;2019;http://www.comuni-italiani.it/077/001/
066001;Acciano;AQ;ABR;0864;67020;A018;368;http://www.comuni-italiani.it/066/001/
057001;Accumoli;RI;LAZ;0746;02011;A019;708;http://www.comuni-italiani.it/057/001/
076002;Acerenza;PZ;BAS;0971;85011;A020;2595;http://www.comuni-italiani.it/076/002/
065001;Acerno;SA;CAM;089;84042;A023;2877;http://www.comuni-italiani.it/065/001/
063001;Acerra;NA;CAM;081;80011;A024;56177;http://www.comuni-italiani.it/063/001/
087001;Aci Bonaccorsi;CT;SIC;095;95020;A025;3223;http://www.comuni-italiani.it/087/001/
087002;Aci Castello;CT;SIC;095;95021;A026;18031;http://www.comuni-italiani.it/087/002/
087003;Aci Catena;CT;SIC;095;95022;A027;28920;http://www.comuni-italiani.it/087/003/
087005;Aci Sant'Antonio;CT;SIC;095;95025;A029;17610;http://www.comuni-italiani.it/087/005/
087004;Acireale;CT;SIC;095;95024;A028;53122;http://www.comuni-italiani.it/087/004/

In tal caso converrebbe assegnare la frase o il piccolo testo ad una variabile e registrarla tramite mysql; ciò sarebbe interessante farlo con la stessa facilità di archiviazione d'un immagine, ma se leghi tuttto ad una variabile come fare?
Potrei usare una variabile  e porlo in un campo blob  ma cosa costa in termini di risorse?
C'è quualche altro modo per farlo?

Atro problema dalla tabella txt su riportata vorrei ricavare per es una lista con tutte le province italiane.
E' possibile farlo direttamente con insert into  ( usando un distinct  solo per un dato ???) senza utilizzare un tabella temporanea?
grazie giob1642
Titolo: Re: mysql inseri into
Inserito da: md9327 - 27 Giugno 2013, 10:54:40
Quello che hai postato è un CSV, separato da punti e virgola.
Se le righe contengono apici, questi devono essere controllati, in quanto potrebbero causare troncamenti, in particolare nell'inserimento nel database.
Tra le librerie presenti nel sito, ce nè una per la lettura/scrittura dei CSV, che potresti usare benissimo. Durante il caricamento delle righe, nella classe di lettura, hai a disposizione un array di valori, splittati appunto a seconda del carattere separatore. Ovviamente, trattandosi poi di inserirle in una sintassi sql, le stringhe vanno epurate dei caratteri che possono interferire nella costruzione (vedi apici), o modificarle in modo che vengano recepite da MySQL come semplici parti della stringa, e quindi non interpretate.
Titolo: Re: mysql inseri into
Inserito da: giob1642 - 27 Giugno 2013, 16:57:30
Concettualmente il tuo ragionamento è perfetto, ed io,riferendomi allo stalcio di codice su riportato lo  applicavo così:

         Dim zline As New String[]
         Dim bline As New String[]
         Dim cline As New String[]
         dim i as integer
.......................................................
......................................................

  myfile = "/listacomuni.txt"
               zline = b.LoadObjectList(myfile)
                db_name = "text"
                D.DBConnect(db_name)
               i = 0
              While zline <> ""
                 bline.clear
                 cline.clear
                  bLine = Split(zline, ";")
                  cline.Add("'" & bline[1] & "'")
                  cline.Add("'" & bline[2] & "'")
                  cline.Add("'" & bline[3] & "'")

               '  bline[1] = mysql_real_escape_string(bline[1]);

                   query = "insert into table1(comune, provincia, regione)" 
                   query = query & "VALUES("
                   query = query & cline[1] & ", " cline[2] & ", " & cline[3] & ")" ""
                    D.MyRS = D.MyConn.Exec(query)
                    Inc i
                Wend

purtroppo non funziona almeno con gambas  ben diverso è se utilizzi php (nota la linea di commento ) od altri linguaggi e poi cosa devo fare per inserire in una colonna  un testo formattato?
Titolo: Re: mysql inseri into
Inserito da: Top Fuel - 27 Giugno 2013, 19:06:48
L'assegnazione di query non funziona se fai così?

query = "insert into table1(comune, provincia, regione)"  & "VALUES(" & cline[1] & ", " & cline[2] & ", " & cline[3] & ")" ""

Meno linee da scrivere. :)
Titolo: Re: mysql inseri into
Inserito da: giob1642 - 27 Giugno 2013, 20:55:56
hai ragione solo in parte, come tu dici è possibile non considerare gli spazi vuoti interni,però un apostrofo, un simbolo od altro gli apici inseriti danno errore sulla query.
Questo è grave perchè non è possibile automatizzare la query come invece avviene in altri linguaggi.
Titolo: Re: mysql inseri into
Inserito da: simo97 - 27 Giugno 2013, 21:15:02
puoi sostituire l'apostrofo con un altro carattere che non chrea problemi e non viene usato e poi quando rivai a leggere risostituisci il carattere prescelto con lapostrofo....
Titolo: Re: mysql inseri into
Inserito da: giob1642 - 27 Giugno 2013, 22:32:42
certo che posso farlo, ma significa mettere un filtro che penalizza fortemente i tempi della query che non può essere automomatica cosa che avviene in altri linguaggi.
Titolo: Re: mysql inseri into
Inserito da: md9327 - 01 Luglio 2013, 11:21:23
Concettualmente il tuo ragionamento è perfetto, ed io,riferendomi allo stalcio di codice su riportato lo  applicavo così:

         Dim zline As New String[]
         Dim bline As New String[]
         Dim cline As New String[]
         dim i as integer
.......................................................
......................................................

  myfile = "/listacomuni.txt"
               zline = b.LoadObjectList(myfile)
                db_name = "text"
                D.DBConnect(db_name)
               i = 0
              While zline <> ""
                 bline.clear
                 cline.clear
                  bLine = Split(zline, ";")
                  cline.Add("'" & bline[1] & "'")
                  cline.Add("'" & bline[2] & "'")
                  cline.Add("'" & bline[3] & "'")

               '  bline[1] = mysql_real_escape_string(bline[1]);

                   query = "insert into table1(comune, provincia, regione)" 
                   query = query & "VALUES("
                   query = query & cline[1] & ", " cline[2] & ", " & cline[3] & ")" ""
                    D.MyRS = D.MyConn.Exec(query)
                    Inc i
                Wend

purtroppo non funziona almeno con gambas  ben diverso è se utilizzi php (nota la linea di commento ) od altri linguaggi e poi cosa devo fare per inserire in una colonna  un testo formattato?
Io però vedo un errore nella sintassi sull'ultima assegnazione di "query =", dove vedo un doppio apice spurio, senza concatenatore...
Titolo: Re: mysql inseri into
Inserito da: Top Fuel - 01 Luglio 2013, 15:36:56
L'avevo visto anche io, ma non conoscendo l'sql ho preferito non dire nulla.
Che sia li la gabola?
Titolo: Re: mysql inseri into
Inserito da: giob1642 - 02 Luglio 2013, 12:16:57
hai ragione è unerore di battitura ma quanto detto è giusto.
La realtà è che mysql  registra solo certi caratteri a meno che non registri una tabella di caratteri asci.
Quindi se devi registrare una tabella dove n una colonna c'è un apostrofo,un accento od altro devi registrare tutta la tabella in asci e poi riconvertirla se la frase è breve riesci a farlo agevolmente con gli operatori sulle stringhe "html" e "replace", ma ciò impone maggior attenzione nel trattamento di tutti i dati della tabella e ciò è scomodo.
Quello che m'inquieta però è che  altri linguaggi perl,python,v basic risolvono il problema agevolmente, gambas no, almeno io non ci sono riuscito.
Il problema a mio avviso è rilevante, supponi di dover introdurre in mysql decine o centinaia di tabelle che hai in acces od in msqlite.
 giob1642
Titolo: Re: mysql inseri into
Inserito da: md9327 - 03 Luglio 2013, 10:49:17
In realtà la cosa strana è che quello è un errore che doveva essere evidenziato dal compilatore gmbas.
Se non l'ha fatto, vuol dire che è presente un'anomali, una sintassi non prevista.

Riguardo a MySQL, le stringhe le puoi passare tranquillamente, basta che usi una funzione di conversione, che ti slasha i caratteri di apice.
Altri caratteri, se sono di controllo è necessario fare altrettanto, mentre per gli ascii, che non siano nella tabella standard, ovvero nei prini 128, la loro memorizzazione negli archivi del database dipende dalla codifica utilizzata. Mediamente si usa utf8, che in qualche modo unifica i caratteri a livello universale, ma il suo utilizzo potrebbe non essere necessario se il tuo programma viene usato solo in Italia, o i dati provengono solo da fonti italiane.

Comunque, in ogni ambiente, in cui lo scambio dati è eterogeneo, è opportuno sempre fare molta attenzione ai flussi che passano, e intervenire con i giusti strumenti.
Titolo: Re: mysql inseri into
Inserito da: giob1642 - 03 Luglio 2013, 15:10:27
Osservazioni più che giuste, quello che è strano che mentre linguaggi come perl,python,visaul basic ed altri sono predisposti per ovviare od attutire tali inconvenient gambas no perchè?
giob1642
Titolo: Re: mysql inseri into
Inserito da: md9327 - 03 Luglio 2013, 16:49:50
Per il solito e comune motivo, che le persone che ci lavorano sono molto meno, come anche dal minor numero di feedback da parte di un'esiguo numero di utilizzatori.

Tutte queste osservazioni vanno fatte direttamente nella mail list, in modo che siano direttamente visibili ai gestori del progetto. Ovviamente, da qui a metterle in campo è un'altro paio di maniche, in particolare per un discorso legato al tempo, sia delle modifiche che dai test.
Titolo: Re: mysql inseri into
Inserito da: pastrank - 03 Luglio 2013, 21:14:57
La realtà è che mysql  registra solo certi caratteri a meno che non registri una tabella di caratteri asci.

Ma i test escapando la stringa, aggiungendo un apice singolo, circondando la stringa con apici doppi, li hai fatti? Io evito i database come la peste, ma vedo che gli stessi problemi sono con tutti i linguaggi...