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)? ??

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top