delphi "Uso non valido della parola chiave" in TQuery
Domanda
Sto cercando di popolare un TDBGrid con i risultati del seguente TQuery rispetto al file Journal.db:
select * from Journal
where Journal.where = "RainPump"
Ho provato sia Journal. " Where "
che Journal. [Where]
senza alcun risultato.
Ho anche provato: seleziona Journal. [Where] come " Location "
con lo stesso risultato.
Journal.db è un file creato da una terza parte e non riesco a modificare i nomi dei campi.
Il problema è che il campo che mi interessa si chiama 'dove' e comprensibilmente causa l'errore sopra. Come faccio a fare riferimento a questo campo senza far esplodere il BDE (presumibilmente)? ??
Soluzione
Puoi inserire il set di risultati in una nuova tabella con " valori " (specificando nessun nome di colonna) dove hai dato i tuoi nomi di colonna nella nuova tabella e poi fai una selezione da quella tabella, Usando una TQuery, qualcosa del tipo:
Query1.sql.clear;
query1,sql.add('Insert into newtable values (select * from Journal);');
query1.sql.add('Select * from newtable where newcolumn = "Rainpump";');
query1.open;
Altri suggerimenti
Aah, adoro Delphi di nuovo ... Ho trovato una soluzione alternativa. Il componente TQuery ha la proprietà Filter :-)
Ho omesso " Where = " dove clausola dalla query mantenendo comunque tutte le altre condizioni "e".
Ho impostato la proprietà Filter su " Where = 'RainPump' " ;.
Ho impostato la proprietà Filtered su True e la vita è di nuovo buona.
Mi sto ancora chiedendo se esiste un modo più intelligente di farlo usando questa vecchia tecnologia, ma se è stupido e funziona, allora non è stupido.
Temo che qualcuno che legge questo thread avrà l'impressione che il motore SQL BDE non sia in grado di gestire la query:
select * from Journal where Journal."Where" = "RainPump"
e perderà il loro tempo inutilmente circoscrivendolo.
In effetti questa costruzione funziona benissimo. Le virgolette intorno a " Where " impedisce a BDE di interpretarlo come parola chiave, proprio come ci si aspetterebbe.
Non so cosa sia sbagliato nella particolare situazione di Baldric, o cosa abbia provato in quale ordine. Descrive il problema come l'interrogazione di una tabella * .db, ma il suo errore SQL assomiglia di più a qualcosa che si otterrebbe in modalità passthrough. O, forse, ha semplificato il suo codice per l'invio, eliminando così la vera causa dell'errore.
I miei test sono stati eseguiti con: BDE v.5.2 (5.2.0.2) Paradox per Windows v. 7 (32b) Delphi 5.0 (5.62)
Varie versioni dell'istruzione che hanno avuto esito positivo:
select * from Journal D0 where D0."Where" = "RainPump"
select * from Journal where Journal."Where" = "RainPump"
select * from ":common:Journal" D0 where D0."Where" = "RainPump"
select * from ":common:Journal" where ":common:Journal"."Where" = "RainPump"
select * from :common:Journal where Journal."Where" = "RainPump"
select * from ":common:Journal" D0 where D0."GUMPIK" = 3
select * from ":common:Journal" where ":common:Journal"."GUMPIK" = 3
select * from :common:Journal where Journal."GUMPIK" = 3
Versioni dell'istruzione che sembrano corrette ma non funzionano con " Uso non valido della parola chiave " ;:
select * from ":common:Journal" where :common:Journal."Where" = "RainPump"
select * from :common:Journal where :common:Journal."Where" = "RainPump"
select * from ":common:Journal" where :common:Journal."GUMPIK" = 3
select * from :common:Journal where :common:Journal."GUMPIK" = 3
-Al.
Riscriverlo in questo modo, dovrebbe funzionare:
select * from Journal where Journal.[where] = "RainPump"
Io, rinominerei la colonna scomoda.
In MySQL, i nomi di tabella / colonna possono essere racchiusi tra `` (le virgolette singole angolate). Non sono sicuro di ciò che consente BDE, ma potresti provare a sostituire [where] con `where`
select * from Journal where Journal."where" = "RainPump"
Ok, quindi nominare le colonne dopo le tastiere è male in QUALSIASI sistema SQL. Vuoi nominare una colonna " seleziona " o "contare" o " alter " o "tabella" o forse solo per divertimento "troncare" o " drop " ;? Spero di no.
Anche se costruisci una soluzione per questa istanza, stai creando un campo minato per chi viene dopo di te. Fai quello che ha detto mj2008 e rinomina la colonna sanguinante.
Permettere a questo nome di colonna di persistere è il peggior esempio di qualcuno che sta costruendo un sistema e ti porterebbe nella lista di cacca per qualsiasi project manager.