smanettone83 (Normal User)
Pro
Messaggi: 124
Iscritto: 20/10/2010
|
Buongiorno a tutti.
Premetto che con i database il mio livello di conoscenza e' pari a 0...
Dovrei realizzare un piccolo tool in grado di interrogare un database in oracle che mi restituisca determinati valori... ovviamente oltre che a leggere dovrei andare anche a scrivere su questi valori. Mi hanno parlato di stringhe di connessione etc etc... ma non ho la piu pallida idea di cosa voglia dire... c'e' in giro un piccolo codice sorgente da poter studiare e capire bene come funziona il tutto? Grazie mille a tutti.
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6403
Iscritto: 03/01/2010
|
No, l'argomento non è banale e non ci sono miracolose scorciatoie.
Libri, libri, tempo, tempo, studio e pazienza ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
Goblin (Member)
Expert
Messaggi: 375
Iscritto: 02/02/2011
|
Se usi una delle ultime versioni di delphi hai a disposizione il tool "FIREDAC" che ti semplificano molto la connessione con il server SQL, e l'interrogazione delle tabelle.
Se vuoi qualche esempio guarda quelli forniti con FIREDAC sono abbastanza esaustivi, ma tieni presente che tutto gira intorno al linguaggio SQL e nel tuo caso il dialetto SQL di ORACLE.
Se ti serve qualche info chiedi pure, se sono in grado ti rispondo.
G.
Ibis redibis non morieris in bello |
|
smanettone83 (Normal User)
Pro
Messaggi: 124
Iscritto: 20/10/2010
|
io uso ancora delphi 7 ma non credo ci sia il tool firedac. Diciamo che sto proprio agli inizi e sto cercando di capire un po il discorso tabelle etc etc... non saprei proprio dove mettere mano.. per questo chiedevo se c'era un piccolo sorgente cosi da poter cominciare a dare un occhiata e capire come funziona il tutto.. grazie ancora
|
|
Goblin (Member)
Expert
Messaggi: 375
Iscritto: 02/02/2011
|
No infatti con D7 FireDac non è disponibile se non ricordo male la versione per D7 si chiama(va) AnyDac (la quale è stata comprata da Embarcadero e rinominata in FireDac, forse trovi una versione di AnyDac sul sito Embarcadero).
Comunque a parte FireDac/AnyDac ci sono diversi tool per accedere ad oracle, puoi usare la libreria ADO ODBC per restare con i componenti standard di delphi o DBX Express (non mi ricordo se sono presenti in D7), oppure cercare in giro tool di terze parti come DevArt (https://www.devart.com/), per i vari esempi basta googlare e trovi abbastanza documentazione. Poi per la manipolazione dei dati devi conoscere la classe delphi TDataSet e i suoi discendenti, Table, Query.
PS: Se vuoi un semplice esempio di manipolazione dati puoi scaricarti uno dei miei esempi che sono sul sito, uno si chiama Agenda e l'altro Pressory, il primo usa come base dati un semplice file xml il secondo usa Access e i componenti ADO.
Ibis redibis non morieris in bello |
|
smanettone83 (Normal User)
Pro
Messaggi: 124
Iscritto: 20/10/2010
|
allora sono riuscito a far funzionare il tutto con oracle... una domanda. Quando mando un SQL il database mi restituisce la tabella all'interno della DBGRID. C'e' un modo da far visualizzare tutti i campi al di fuori della DBGrid? magari usando una variabile Tstring o simile? In poche parole vorrei non utilizzare il componente DBgrid o almeno non farlo visualizzare e richiamare i valori esternamente.
|
|
Goblin (Member)
Expert
Messaggi: 375
Iscritto: 02/02/2011
|
Personalmente non ho capito cosa vuoi fare.
Comunque la dbgrid è personalizzabile puoi far vedere solo i campi che desideri, hai 2 strade. La prima è inserire nella select sql solo i campi che voi far vedere es: "select campoA, campoB, campoC from tabella .....". La seconda è selezionare nella grid i campi da far vedere questo lo ottieni facendo un doppio click nella grid ed aggiungedo a mano i campi (colonne) che ti interessano, se hai legato un TDataSource alla griglia l'operazione la fai in modo visuale.
A parte tutto, il ritorno della tua Select SQL ti genera un oggetto TDataSet che puoi manipolare come meglio credi, scorrendo nelle varie property e metodi. L'oggetto TDataSet contiene tutte le informazioni di cui hai bisogno.
Oltre all'oggetto TDBGrid hai a disposizione altri oggetti TDB... con cui costruire una pagina, basta guardare nella "palette" data-controls ed in base alle necessità usi l'oggetto opportuno.
Se specifichi meglio le tue necessità, (forse) riesco a darti qualche dritta.
G.
Ibis redibis non morieris in bello |
|
smanettone83 (Normal User)
Pro
Messaggi: 124
Iscritto: 20/10/2010
|
perdonami sicuramente sono stato poco chiaro.. in pratico quello che intendevo io e' come leggere i singoli valori di ogni colonna e inserirli all'interno di variabili di tipo Tstring... dovrei aver risolto il problema... ti faccio un esempio... la mia tabella si chiama VATTELAPESCA ed ha 3 colonne: NOME, COGNOME, CITTA.. devo mandare una query e leggere nella colonna NOME il valore Antonio e di conseguenza tutti gli altri valori delle altre colonne... Sto usando questo codice e sembra funzionare... Se e' un metodo grezzo oppure conosci un modo piu pulito di fare questa cosa dimmi pure =)
Codice sorgente - presumibilmente Delphi |
var A,B,C:string; begin ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('select * from VATTELAPESCA where NOME= Antonio'); ADOQuery1.Open; if ADOQuery1.RecordCount = 0 then exit; A:= ADOQuery1.FieldByName('NOME').AsString; B:= ADOQuery1.FieldByName('COGNOME').AsString; C:= ADOQuery1.FieldByName('CITTA').AsString; Edit1.text:= A; Edit2.text:= B; Edit3.text:= C; end;
|
|
|
Goblin (Member)
Expert
Messaggi: 375
Iscritto: 02/02/2011
|
Considerando che è un frammento, tecnicamente il tuo codice è esatto, con delle piccole imperfezioni, nel caso di query vuota esci lasciando la query aperta e i campi edit non sono valorizzati, io (personalmente) avrei scritto in modo un po' diverso, ma queste sono mie fisime mentali:
Codice sorgente - presumibilmente Delphi |
var oSql: TAdoQuery; // oggetto sql locale begin oSql := TAdoQuery.Create; // non ho delphi sotto mano forse è : oSql := TAdoQuery.Create(nil); try oSql.connection := connection; // attacco la connection attiva per la select // select secca solo sui campi da leggere, è inutile portarsi dietro campi che non servono oSql.SQL.text := 'select NOME, COGNOME, CITTA from VATTELAPESCA where NOME= "Antonio"'; oSql.Open; if not (oSql.Bof and oSql.Eof) then // se il dataset risultante non è vuoto begin Edit1.text := oSql.FieldByName('NOME').AsString; Edit2.text := oSql.FieldByName('COGNOME').AsString; Edit3.text := oSql.FieldByName('CITTA').AsString; end else // dataset vuoto resetto i valori begin Edit1.text := ''; Edit2.text := ''; Edit3.text := ''; end; finally oSql.Close; // chiudo la query FreeAndNil(oSql); // libero l'oggetto TAdoQuery // oSql.free; // oSql := Nil; end; end;
|
Se devi solo visualizzare delle informazioni su un record ben preciso e identificabile direi che questa è la strada migliore e più veloce.
Il problema sorge se ti trovi davanti a più record che soddisfano la tua clausula WHERE, nel caso questo codice è da buttare, o almeno da modificare.
Altro problema, ma di minore impatto, nel caso devi fare delle modifiche, in questo caso al momento del salvataggio devi rifare una query di update con la stessa clausula WHERE usata nella Select e leggendo i valori dai vari edit.
Poi ovviamente se ti trovi nel caso di un dataset multirecod a cui devi fare delle modifiche, allora la gestione diventa problematica.
Io, sempre personalmente, nel caso del record singolo immodificabile avrei scritto la stessa cosa, ma nel caso in cui il tutto si trasforma in multirecord e modificabile allora mi affido ai componenti TDBText (e simili) legandoli ad un oggetto TDataSource, al momento della creazione della pagina imposto la query di apertura della tabella con un "select * from .." attacco al TDataSource la mia query e lascio la gestione delle modifche alla VCL di delphi, gestendo a mano solo i comandi di salvataggio (Post), di annulla modifiche (cancel) e di chiusura pagina chiedendo all'utente, nel caso ci sono state delle modifiche non salvate, cosa vuole fare se salvare o buttare via le modifiche.
G.
Ibis redibis non morieris in bello |
|