Autore Topic: [Risolto]query con variabili e stringhe conctenate  (Letto 853 volte)

Offline giob1642

  • Grande Gambero
  • ***
  • Post: 159
    • Mostra profilo
[Risolto]query con variabili e stringhe conctenate
« il: 03 Agosto 2013, 19:20:44 »


Preparare una query (io uso mysql) non è un grosso problema, può diventarlo se la query è lunga e complessa; in tal caso conviene fare numerose stringhe  e poi concatenarle.
non è facile trovare dei doc che chiariscono l'uso degli apici singoli è doppi.
ce' della documentazione in merito?
a titolo d'esempio riporto una query fatta con delle variabili (funziona)
sotto come commento riporto la stessa query segmenta i varie stringhe e poi assemblata
 (non funziona)
 db_name=  name database
 tb_name= nome tabella
 cwt_where= nome del campo1
 cwu_where= nome del campo2
 ct_valore= valore noto passato alla routine
 cu_valore= valore noto passato alla routine

 DD.DBConnect(db_name)
    If cu_valore <> "" Then
      query = "SELECT * FROM " & tb_name &
      " WHERE " & cwt_where & " = '" & ct_valore & "'"  
       " and " & cwu_where & " ='" & cu_valore & "'"    
      Else
     query = "SELECT * FROM " & tb_name &
      " WHERE " & cwt_where & " = '" & ct_valore & "'"  
    Endif
      
     ' bqe.Clear
     ' bqe.Add("SELECT * FROM " & tb_name)
     ' bqe.Add(" WHERE " & cwt_where & "='" & ct_valore "'")
     ' bqe.Add(" and " & cwu_where & " ='" & cu_valore "'")
    
     ' query = ""
     ' query &= bqe[0]
     ' query &= bqe[1]
     ' If cu_valore <> "" Then  
     ' query &= bqe[2]
     '  Endif
« Ultima modifica: 17 Agosto 2013, 00:57:22 da giob1642 »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: query con variabili e stringhe conctenate
« Risposta #1 il: 06 Agosto 2013, 19:26:01 »
Come si sà il percorso più corto è una linea retta.

Nel tuo secondo esempio, a parte errori di sintassi (se ci sono, non ho verificato sul campo), fai uso di un array di cui non mostri come è definito, per cui non ho modo di aiutarti.

Comunque, seppure fosse, se hai creato un array "String[]" (il che và pure bene), questo deve prima essere inizializzato con
Codice: [Seleziona]
Dim bqe = New String[]
dopodichè puoi utilizzarlo, altrimenti resta solo una definizione di variabile che punta a nulla (nessuno spazio in memoria, e quindi nessun puntatore all'array ritornato).

Dopodichè, concatenare un array è piuttosto semplice, ed è possibile farlo in diversi modi, uno dei quali è quello che tu hai usato "query &= bqe[0]".
Anche se nei tuoi esempi vedo inutile usare un array, ad ogni modo il tuo sistema diventa complesso se si vanno a trattare array con numerosi item. Se non ci sono particolari condizioni, una volta riempito l'array può essere concatenato in una semplice stringa con il metodo "Join(<carattere separatore>)", rendendo così molto semplice la codifica, in quanto fatta con un unico comando.

Sul fatto degli apici, credo tu sappia (e si vede dall'esempio) che il singolo apice per gambas significa una nota. Se inserito all'interno di una coppia di doppi apici, allora questo diventa un carattere, e farà parte della stringa inclusa nei doppi apici.

Così su due piedi, e con il trancio di esempio che hai mostrato, a meno di errori prima o dopo (o anche durante nelle parti omesse), non può darti errore, nè interpretare erroneamente le stringhe.

Forse è il caso che posti tutta la funzione/metodo che dà errore, ivi compresa la definizione delle variabili esterne (della classe, publiche e fuori funzione) utilizzate dal metodo/funzione.

Offline giob1642

  • Grande Gambero
  • ***
  • Post: 159
    • Mostra profilo
Re: query con variabili e stringhe conctenate
« Risposta #2 il: 07 Agosto 2013, 16:43:40 »
grazie per il coropso intervento;
in realtà molte linee di codice non l'avevo riportate,ipotizzando che un eventuale lettore  ne intuisse la presenza; ed era proprio così.
Scopo della domanda era un altra:
nel fare una query, ovviamente in line, uso per es :
query = "SELECT * FROM " & tb_name &  " WHERE " & cwt_where & " = '" & ct_valore & "'"  ove le " " scandiscono la stringa  mentre & le variabili e ciò è giusto; anche ct_valore è una variabil e, perchè devo usare '  e qual'è secondo gambas il suo intimo significato?
esiste un documentazione in grado di chiarire i miei dubbi?
grazie giorgio

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: query con variabili e stringhe conctenate
« Risposta #3 il: 07 Agosto 2013, 20:54:13 »
Sai che trovo difficoltà a capire cosa scrivi?  :D

Il singolo apice, all'interno del codice, delimita una nota che gambas non interpreta in fase di runtime.
Se questo, però, viene inserito all'interno di una stringa, e quindi delimitato tra due doppi apici, diventa uno dei caratteri della stessa stringa e quindi lavorato come deve.

Offline giob1642

  • Grande Gambero
  • ***
  • Post: 159
    • Mostra profilo
Re: query con variabili e stringhe conctenate
« Risposta #4 il: 08 Agosto 2013, 10:51:29 »
hai ragione la mia penna è molto incerta.
vedi detto pippo="paese"  (colonna di database)
                  pappa="italia"
nell'ambito di una query  io scrivo:
query="select ........................ where"& pippo & "='"& pappa &"'"
questa riga dovrebbe funzionare anche così:
query="select ........................ where"& pippo & "="& pappa
le due query sono formalmente uguali ma..................
ecco non capisco perchè si debba fare un diverso modo di interpretare una variabile  e chiedevo se c'era qualche documentazione in merito.

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: query con variabili e stringhe conctenate
« Risposta #5 il: 08 Agosto 2013, 12:44:52 »
hai ragione la mia penna è molto incerta.
vedi detto pippo="paese"  (colonna di database)
                  pappa="italia"
nell'ambito di una query  io scrivo:
query="select ........................ where"& pippo & "='"& pappa &"'"
questa riga dovrebbe funzionare anche così:
query="select ........................ where"& pippo & "="& pappa
le due query sono formalmente uguali ma..................
ecco non capisco perchè si debba fare un diverso modo di interpretare una variabile  e chiedevo se c'era qualche documentazione in merito.

Questa è una questione che riguarda la sintassi SQL. Le stringhe devono essere delimitate da singoli apici per poter essere interpretate dal motore del db. Allo stesso modo i numeri in virfola mobile (es. float) devono avere il punto come separatore (non la virgola), perchè è il punto il separatore usato in matematica, mentre la virgola (o la combinazione dei due caratteri) è dipendente dalla rappresentazione a video della lingua usata (es Italiano contro Usa). Tutte queste informazioni le trovi sui siti ufficiali del db usato, e non in gambas.
I nomi dei campi devono essere parte della stringa, ovvero scritti in chiaro, a meno che "pippo" non contenga il nome ed è quindi trattato come una normale stringa. Tutti i valori passati tramite sql devono seguire un certa forma sintattica, dipendente dal motore. Nell'sql standard è così. In alcuni casi, in alcuni motori, vengono adottate, aggiunte, ulteriori forme sintattiche, ma questo è un'altro discorso.
Devi separare i due ambienti: sql e linguaggio, perchè seguono due logiche diverse. Il linguaggio, in questo caso, è il trasporto dei comandi che vanno al db, e non ne controlla il contenuto. Per esso è tutto sottoforma di stringa, ed è così che viene trattata. Una volta inviata al db, la stringa invece viene interpretata dal motore del database, ritornando l'esito positivo o negativo del controllo sintattico, e se positivo, il risultato della query.
Per verificare quanto dico, ti consiglio di usare direttamente un client diretto verso il db. Con i db ne viene fornito uno di default, normalmente a riga di comando. Una volta avuto l'accesso al db, i comandi che poni attraverso il client sono come i comandi che dai a gambas nella sua sintassi, ovvero vengono subito interpretati come tali e non come stringhe.