* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Novembre 21, 2024, 11:37:29 pm

Inserisci il nome utente, la password e la durata della sessione.

106 Visitatori, 0 Utenti

Autore Topic: [Risolto] Sqlite3 errore nelle ricerche  (Letto 4684 volte)

sergio

  • Full Member
  • ***
  • Post: 146
  • Karma: +1/-0
[Risolto] Sqlite3 errore nelle ricerche
« il: Aprile 17, 2021, 07:31:18 pm »
Buonasera a tutti , spero che possiate aiutarmi .Nel programma che sto preparando  utilizzo Sqlite3 . Mi sorge un problema , quando vado a  eseguire  una ricerca :   
SQLQuery1.SQL.Text:= 'SELECT * FROM '+Archivio+' WHERE Intest ='''+ Edit2.Text + ''';';
 SQLQuery1.Open;
mi si blocca il programma se Edit2.Text contiene un ( ' )  Apostrofo .
Sapete come poter aggirare il problema ?  La variabile  nel database è una Varchar().
Vi ringrazio anticipatamente ! :)
« Ultima modifica: Aprile 24, 2021, 01:19:48 pm da sergio »
Programmo per passione !

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:Sqlite3 errore nelle ricerche
« Risposta #1 il: Aprile 17, 2021, 07:54:01 pm »
Se nel testo della query c'è un apostrofo, per usarlo lo devi duplicare.

Quindi devi cercare gli apostrofi in Edit2.text e per ogni apostrofo devi inserirne un altro.

Ciao
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

sergio

  • Full Member
  • ***
  • Post: 146
  • Karma: +1/-0
Re:Sqlite3 errore nelle ricerche
« Risposta #2 il: Aprile 17, 2021, 08:19:11 pm »
ciao , scusa ma io ho provato a usare Replace( miastringa, '' ' '' , '' ' ' '' ) ma  mi da l'errore perche '' ' '' non me lo prende . sai come fare ? Grazie
Programmo per passione !

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2921
  • Karma: +20/-4
Re:Sqlite3 errore nelle ricerche
« Risposta #3 il: Aprile 17, 2021, 08:26:38 pm »
non l'h oprovato ma così dovrebbe andare

Codice: [Seleziona]
 Replace( miastringa, '''', '''''')
Imagination is more important than knowledge (A.Einstein)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:Sqlite3 errore nelle ricerche
« Risposta #4 il: Aprile 17, 2021, 09:49:48 pm »
Un consiglio:

quando lavorate con il carattere apostrofo, a codice è meglio che non compaia.

Semplicemente usa questa forma:

Codice: [Seleziona]
ReplaceStr(miastringa, #39, #39#39);

Semplice, visibile e non crea problema alcuno.

Ciao

P.S.: ovvio che come delimitatore di stringa deve essere usato !!!  ;D
« Ultima modifica: Aprile 17, 2021, 09:59:54 pm da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

brunello

  • Jr. Member
  • **
  • Post: 83
  • Karma: +0/-0
Re:Sqlite3 errore nelle ricerche
« Risposta #5 il: Aprile 17, 2021, 10:14:43 pm »
ma non è più semplice con
Codice: [Seleziona]
quotedstr(testo)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:Sqlite3 errore nelle ricerche
« Risposta #6 il: Aprile 17, 2021, 10:24:19 pm »
(?? Si, quello è ancora più veloce ??).

In effetti non usavo quella funzione da tanto tempo, me ne ero dimenticato completamente.  ;)

P.S.:
ma non è più semplice con
Codice: [Seleziona]
quotedstr(testo)

Ahhhh, ecco perchè non la usavo: inserisce i caratteri apostrofo anche in testa ed in coda alla stringa .......


Può essere usata direttamente così:

Codice: [Seleziona]
SQLQuery1.SQL.Text:= 'SELECT * FROM '+Archivio+' WHERE Intest = '+QuotedStr(Edit2.Text)+';';
« Ultima modifica: Aprile 17, 2021, 10:49:08 pm da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

SB

  • Scrittore
  • Sr. Member
  • *****
  • Post: 283
  • Karma: +1/-0
Re:Sqlite3 errore nelle ricerche
« Risposta #7 il: Aprile 18, 2021, 10:44:09 am »
Ti sconsiglio vivamente di usare l'input dell'utente per costruire una query SQL
L'apostrofo potrebbe essere l'ultimo dei problemi
Usa piuttosto le query parametriche
Se proprio vuoi costruire la query usando l'input, ripuliscilo da tutti i caratteri che non siano lettere, cifre e pochi altri
Non lasciare alcun carattere che possa avere un qualche significato per SQL


SQLQuery1.SQL.Text:= 'SELECT * FROM '+Archivio+' WHERE Intest ='''+ Edit2.Text + ''';';

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2921
  • Karma: +20/-4
Re:Sqlite3 errore nelle ricerche
« Risposta #8 il: Aprile 18, 2021, 11:40:12 am »
visto che ci siamo io spesso utilizzo questo modo
soprattutto quando voglio costruire una stringa con molti parametri
rimane piuttosto manutenibile anche quando un parametro stringa deve diventare numero  o viceversa

Esempio stringa -> integer: '... ''%s'' ...'
diventa '... %d ...'


Codice: [Seleziona]
SQLQuery1.SQL.Text:= Format('SELECT * FROM Archivio WHERE Intest =''%s'';', [ Edit2.Text ]');
« Ultima modifica: Aprile 18, 2021, 11:42:10 am da nomorelogic »
Imagination is more important than knowledge (A.Einstein)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:Sqlite3 errore nelle ricerche
« Risposta #9 il: Aprile 18, 2021, 12:26:48 pm »
visto che ci siamo io spesso utilizzo questo modo
soprattutto quando voglio costruire una stringa con molti parametri
rimane piuttosto manutenibile anche quando un parametro stringa deve diventare numero  o viceversa

Esempio stringa -> integer: '... ''%s'' ...'
diventa '... %d ...'


Codice: [Seleziona]
SQLQuery1.SQL.Text:= Format('SELECT * FROM Archivio WHERE Intest =''%s'';', [ Edit2.Text ]');

Uhmmm, non sono convinto che funzioni ... ciò che hai scritto, nel caso Edit2 contenga caratteri "speciali" in primis l'apostrofo ritorniamo all'argomento del topic. Non ho provato e forse mi sbaglio.

Io sono abituato, ma è questione di stile e di necessità, intanto a filtrare come dice @SB il contenuto degli input utenti (è per questo che uso sempre replacestr e non qutoedstr). I filtri in genere applicati sono l'inserimento degli escape (carattere che dipende dal database ma che generalmente è il "\") davanti a tutti i caratteri "_" e "%" (che hanno un particolare significato sopratutto nel LIKE), il carattere apostrofo come indicato in questi post, e alle volte anche altri caratteri o parole intere (faccio un esempio di ',' o JOIN, GROUP, ALTER, ESCAPE, etc...) dipendente dal contesto.

In genere poi non uso a codice i caratteri "da tastiera" ma uso i codici letterali (ad esempio non ' ma bensi #39)

Quanto sopra è stato necessario perchè in diversi grossi gruppi, alcuni software che ho fornito sono stati testati contro l'SQL INJECTION e quindi applicare quelle accortezze era il minimo indispensabile.

Diciamo che in genere queste accortezze sono sovraabbondanti, ma dipende sempre dal contesto d'uso.

Saluti
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2921
  • Karma: +20/-4
Re:Sqlite3 errore nelle ricerche
« Risposta #10 il: Aprile 18, 2021, 12:50:24 pm »
la formattazione avviene nell'array dei parametri
la stringa con la select sql rimane pulita e senza concatenazioni


Edit:
da provare ma con la quote dovrebbe diventare
Codice: [Seleziona]
SQLQuery1.SQL.Text:= Format('SELECT * FROM Archivio WHERE Intest = %s;', [ QuotedStr(Edit2.Text) ]');
« Ultima modifica: Aprile 18, 2021, 01:51:15 pm da nomorelogic »
Imagination is more important than knowledge (A.Einstein)

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2921
  • Karma: +20/-4
Re:Sqlite3 errore nelle ricerche
« Risposta #11 il: Aprile 18, 2021, 03:07:41 pm »
Non vorrei che ne uscisse della confusione.
Format non sostituisce gli apostrofi ma utilizzata come ho scritto in "Edit" del post precedente (e cioè con QuoteStr nell'array dei parametri) può essere utile per scrivere in modo chiaro e manutenibile anche una sql complessa con i quote.
Imagination is more important than knowledge (A.Einstein)

brunello

  • Jr. Member
  • **
  • Post: 83
  • Karma: +0/-0
Re:Sqlite3 errore nelle ricerche
« Risposta #12 il: Aprile 18, 2021, 03:26:00 pm »
per me la soluzione più pulita è questa
Codice: [Seleziona]
SQLQuery1.SQL.Text:= 'SELECT * FROM Archivio WHERE Intest =:par1';
SQLQuery1.ParamByName('par1').Value := Edit1.text;

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:Sqlite3 errore nelle ricerche
« Risposta #13 il: Aprile 18, 2021, 04:01:00 pm »
@nomorelogic
Ho eliminato l'ultimo mio post che poteva creare assoluta confusione e si basava su una "deduzione" non verificata.
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

sergio

  • Full Member
  • ***
  • Post: 146
  • Karma: +1/-0
Re:Sqlite3 errore nelle ricerche
« Risposta #14 il: Aprile 18, 2021, 06:20:41 pm »
Ragazzi , vi ringrazio , ho provato tutte el soluzioni da voi proposte , ma purtroppo quando arrivo all'esecuzione di SQLQuery.Open mi va in errore .
Posto il pezzo di programma , se qualcuno riesce a capire come mai . evidenzio in rosso la Query dove si blocca , vi ringrazio anticipatamente !
 VAR
  Archivio : Ansistring ;
  begin
  if ComboBox1.Text = 'Clienti' Then
  begin
  Archivio := 'Clienti' ;
  SQLite3Connection1.Connected:= False;
 SQLite3Connection1.DatabaseName:= Application.Location + 'archivi'+System.DirectorySeparator+'Clienti.db';
 SQLite3Connection1.Connected:= True ;
  end;
  If ComboBox1.Text = 'Fornitori' Then
  begin
  Archivio := 'Fornitori' ;
  SQLite3Connection1.Connected:= False;
 SQLite3Connection1.DatabaseName:= Application.Location + 'archivi'+System.DirectorySeparator+'Fornitori.db';
 SQLite3Connection1.Connected:= True ;
  end;
  If Edit1.Text = '' then
  if (Edit2.Text <> '')THEN       //and(Edit1.Text = '') then
    Begin
    SQLQuery1.SQL.Text:= 'SELECT * FROM "'+Archivio+'" WHERE Intest = QuotedStr(Edit2.Text) ';
    //   '+ComboBox1.Text+'AND codice = '+Edit1.Text+';' ;
  //  StringGrid1.RowCount:=1;

    SQLQuery1.Open;
      while not SQLQuery1.EOF do
      begin
      if SQLQuery1.Fields[1].Text = Edit2.Text then
       begin
       Edit1.Text:= SQLQuery1.Fields[0].Text;     // codice
       Edit3.Text:= SQLQuery1.Fields[2].Text;     //indirizzo
       Edit4.Text:= SQLQuery1.Fields[3].Text;     // cap
       Edit5.Text:= SQLQuery1.Fields[4].Text;     // citta
       Edit6.Text:= SQLQuery1.Fields[5].Text;    // Nazione
       Edit7.Text:= SQLQuery1.Fields[6].Text;     // telefono1
       Edit8.Text:= SQLQuery1.Fields[7].Text;     // telefono2
       Edit9.Text:= SQLQuery1.Fields[8].Text;      //p.iva
       Edit10.Text:= SQLQuery1.Fields[9].Text;    //cod fisc.
       Edit11.Text:= SQLQuery1.Fields[10].Text;   //  pec
       Edit12.Text:= SQLQuery1.Fields[11].Text;    //codice sdi
       Edit13.Text:= SQLQuery1.Fields[12].Text;   // Provincia

    //    StringGrid1.RowCount:=StringGrid1.RowCount+1;
    //    StringGrid1.Cells[2, StringGrid1.RowCount-1]:=SQLQuery1.Fields[2].Text;
    //    StringGrid1.Cells[3, StringGrid1.RowCount-1]:=SQLQuery1.Fields[0].Text;
    //    StringGrid1.Cells[1, StringGrid1.RowCount-1]:=SQLQuery1.Fields[1].Text;
    //    StringGrid1.Cells[4, StringGrid1.RowCount-1]:=SQLQuery1.Fields[5].Text;
        SQLQuery1.Next;
        end ;
      end;
Programmo per passione !

 

Recenti

How To

Utenti
  • Utenti in totale: 803
  • Latest: maXim.FI
Stats
  • Post in totale: 19169
  • Topic in totale: 2286
  • Online Today: 123
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 106
Total: 106

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.