Italian community of Lazarus and Free Pascal
Programmazione => Databases => Topic aperto da: nicholas77 - Febbraio 20, 2017, 08:57:47 am
-
Salve,
Utilizzo la libreria Zeos per accedere al database Sqlite.
Scrivendo il seguente codice :
with datamodule1.ZQuery1 do
begin
open;
append;
fieldbyname('cognome').asstring:=edit1.text;
post;
close;
end;
dopo aver eseguito l'istruzione 'post' si genera il seguente errore :
"Sql error : constraint failed: routine called out of sequence"
"raise EZSQLExcption.CreateWithCode(ErrorCode,Format(SSQLError1,[error]));"
Ho cercarto e provato diverse soluzioni, ma non riesco a risolvere l'errore.
Ho utilizzato,sempre, questa modalità d'inserimento del nuovo record in Delphi, mai avuto problemi.
Qualcuno potrebbe aiutarmi.
Grazie.
-
Due domande:
Perché "append" e non "insert" ?
Cosa sono "open" e "close" ? Attivano e disattivano una zquery?
Anche io uso zeoslib e sqlite e non riscontro problemi, almeno finora -uso le table, sono piu' semplici da gestire- :
...
ztable4.Insert;
ztable4data1.AsString:=FormatDateTime('YYYY-MM-DD',incmonth(date,i));
ztable4.post;
...
Facci sapere
ciao
-
nella zquery, scrivo :
SELECT * FROM nometabella
Poi con "open", apro la query; poi aggiungo il record poi lo riempo ed infine faccio "post".
Ho provato ad utilizzare "insert" mi da l'errore di sopra.
invece usando "edit" riesco a modificare il record senza problemi.
Proverò, con ztable.
Vi faccio sapere.
-
Non è che puoi postare qualche riga di codice in piu' ?
Io faccio così:
metto la connessione,
collego zquery e data source
attivo la conenssione
metto zquery.active:=true (dall' ispettore degli oggetti)
collego il dbnavigator al data source e lo uso per le varie operazioni (post, edit, prior etc)
oppure con un menu pop up prevedo un comando "save"
... if zquery1.State in [dsinsert,dsedit] then
zquery1.post;
...
le query e le table hanno comportamenti simili, ma le query sono piu' flessibili se si vuole usare l'sql
magari verifica che tutto quadri: che il driver per sqlite sia quello giusto - 32 o 64 bit - , che tutto sia connesso e collegato corretamente (zquery, zconnesion, datasoruce, etc ) , che i campi ci siano nella zquery etc etc
Magari prova ad usare un software per sqlite (es. https://sqlitestudio.pl/index.rvt ) e vedi se la query di inserimento funziona per davvero su sqlite (caso mai c'è un errore di sintassi o qualcosa del genere - vedi il caso di chiamare un campo "data" che è una parola riservata di sql) .
Avevo iniziato ad usare il driver per odbc per collegarmi a un data base in access; usavo le query di lazarus e testavo il codice sql prima su access e poi lo implementavo. Il programmino per la gestione di un reagentario che avevo fatto diversi anni fa gira ancora benissimo; l' unica rottura è che windows cambia sempre le carte in tavola e ho trovato problemi di configurazione dell'obdc se l' hardware è 64 bit, ragion per cui sono passato ad sqlite, che non devi configurare niente ( o quasi) , metti il software, dati compresi, su una pennina e lo fa girare dove vuoi .
Facci sapere
Ciao
-
Giusto per scambaire 4 chiacchere.
Allora, l' uso delle query aumenta la flessibilità perché è possibile usare l'sql, un esempio:
...
if prod_isinsert then begin
SQLQuery4.SQL.Clear;
SQLQuery4.SQL.add('insert into PROD (Prog, DEN, IND, CAP, Comune, Prov, PAR_IVA, COD_FIS, FAX, TEL, REF)');
SQLQuery4.SQL.add('values ('+inttostr(max_prog_prod+1)+','
+chr(39)+SQLQuery1DEN.Asstring+chr(39)+','
+chr(39)+SQLQuery1IND.Asstring+chr(39)+','
+chr(39)+SQLQuery1CAP.Asstring+chr(39)+','
+chr(39)+SQLQuery1Comune.Asstring+chr(39)+','
+chr(39)+SQLQuery1Prov.Asstring+chr(39)+','
+chr(39)+SQLQuery1PAR_IVA.Asstring+chr(39)+','
+chr(39)+SQLQuery1COD_FIS.Asstring+chr(39)+','
+chr(39)+SQLQuery1FAX.Asstring+chr(39)+','
+chr(39)+SQLQuery1TEL.Asstring+chr(39)+','
+chr(39)+SQLQuery1REF.Asstring+chr(39)+')'
);
{form2.Memo1.Lines.Clear;
form2.Memo1.Lines.add('insert into PROD (Prog, DEN, IND, CAP, Comune, Prov, PAR_IVA, COD_FIS, FAX, TEL, REF)');
form2.Memo1.Lines.add('values ('+inttostr(max_prog_prod+1)+','
+chr(39)+SQLQuery1DEN.Asstring+chr(39)+','
+chr(39)+SQLQuery1IND.Asstring+chr(39)+','
+chr(39)+SQLQuery1CAP.Asstring+chr(39)+','
+chr(39)+SQLQuery1Comune.Asstring+chr(39)+','
+chr(39)+SQLQuery1Prov.Asstring+chr(39)+','
+chr(39)+SQLQuery1PAR_IVA.Asstring+chr(39)+','
+chr(39)+SQLQuery1COD_FIS.Asstring+chr(39)+','
+chr(39)+SQLQuery1FAX.Asstring+chr(39)+','
+chr(39)+SQLQuery1TEL.Asstring+chr(39)+','
+chr(39)+SQLQuery1REF.Asstring+chr(39)+')'
); }
{form2.ShowModal;}
SQLQuery4.UsePrimaryKeyAsKey:=false;
SQLQuery4.ExecSQL;
sqltransaction1.Commit;
...
Ci sono poi tante varianti che lazarus consente (in pratica puo impostare le query sql di insert, delete etc come proprietà dell' oggetto query ma non solo) .
Il punto è vedere se il gioco vale la candela: se l'applicazione è sofisticat e lo richiede, bene, ben venga il poter gestire l'sql direttamente; se l'applicazione non è complessa il classico approccio "borland database engine " va piu' che bene (mi pare che zeoslib questo voglia fare alla fine - l'essere l'engine di una banca dati non importa se sqllite o firebird o altro ancora - ; al limite puo' andare bene anche l'approccio piu' classico "dbf" anche se deprecato (se la mole di dati non è eccesiva - ho provato a scorrere 10 mila record, è lento - ) la sua semplicità d'uso ripaga tutto .
Saluti.
-
Con zeos si possono definire delle "prepared statement".
Passare i parametri. Eseguire.
Lo faresti senza usare i componenti grafici.
Devi partire dalla connessione .
Tempo fa scrissi un articolo su come interrogare direttamente i database senza passare per i componenti grafici.
EDIT
http://www.lazaruspascal.it/index.php?page=111 (http://www.lazaruspascal.it/index.php?page=111)
-
Un approccio interessante.
Il problema che risontrato con zeoslib è la documentazione; quando h'ho installato ho usato una guida trovata da qualche parte sul web che diceva come usarlo con firebird.
C'è una una pagina web dedicata a zeoslib ma non vi ho trovato granché dentro.
Quindi dei link a dei manuali , a degli esempi etc sono i benvenuti.
Saluti
-
Devi cercare la documentazione per jdbc.
Hanno fatto il porting dell'intelaiatura java per i database. 😉
-
Ciao nicholas
per quel poco che uso zeos ho sempre fatto cosi
ZQuery1.Active:=False;
ZQuery1.SQL.Text:='SELECT * FROM tabella';
ZQuery1.Active:=True;
a questo punto
Zquery1.Inert;
ZQuery1.FieldByName('nomecolonna').Asinteger(a seconda del tipo di colonna):= valore da inserire
ZQuery.post;
e se hai posto a True la proprietà CacheUpdate
zquery1.applyupadate;
Attento che se però la tua query coinvolge piu tabelle allora la vita si complica
ciao