Newsgroup: it.comp.lang.delphi
Titolo: System Dsn

Salve a tutti!
 
 ho un grande problema con una connessione odbc utilizzando un dsn di
sistema.
Nella mia applicazione ho un oggetto TADOConnection con la stringa di
connessione impostata a questo valore:
Provider=MSDASQL.1;Persist Security Info=False;Extended
Properties="DSN=NomeDSN;DBQ=Percorso/NomeDB.mdb;DriverId=25;FIL=MS
Access;MaxBufferSize=2048;PageTimeout=5;UID=admin;"
 
Premetto che in Visual Basic o anche in ASP per connettermi ad un DSN
di sistema mi è sufficiente scrivere: "DSN=NomeDsn" e assegnare questo
valore alla proprietà ConnectionString dell'oggetto Connection.
Poiché la tecnologia usata è sempre ADO, dovrebbe essere lo stesso
anche con Delphi (Io sto utilizzando Delphi 7).
 
Io ho creato un oggetto Connection con questa stringa di connessione,
quando vado a lanciare la query, questa funziona solo se non metto la
clausola "WHERE": "SELECT [elenco campi] FROM [nome tabella]".
Se voglio lanciare una query di questo tipo:
"SELECT [elenco campi] FROM [nome tabella] WHERE [condizioni]".
Per esempio se faccio: 'SELECT * FROM Clienti WHERE cognome =
"cognome"'
Mi ritorna l'errore: "[ODBC][Microsoft ODBC Microsoft Access]
Parametri insufficienti. Previsto 1."
La query non è sbagliata perché se la provo dentro access funziona
perfettamente. Fino ad ora ho usato una connessione locale e
funzionava benissimo quindi non dipende dalla sintassi della query.
Però questa applicazione dovrà connettersi ad un database residente
sul server e voglio utilizzare un dsn di sistema per permettere agli
utenti di quel sistema di lavorare su quel db.
Probabilmente sbaglio qualcosa io perché non è molto che uso Delphi e
sono ancora molto inesperta. Grazie a tutti quelli che vorranno
aiutarmi.
Saluti
Sharon

 perfettamente.
Non č detto: Access, ad esempio, usa come carattere jolly l'asterisco '*',
mentre lo standard SQL indica che il carattere jolly č il punto
interrogativo '?': se tu esegui una query tipo
    select *
    from CLIENTI
    where cognome like 'PI*'
all'interno dell'ambiente Access questa ti ritorna tutti i record il cui
cognome inizia con 'PI', mentre se la lanci da Delphi non ti ritorna
alcunchč. La cosa da fare in questi casi č usare i caratteri jolly standard
e non quelli di Access:
    select *
    from CLIENTI
    where cognome like 'PI?'
Venendo al problema specifico, mi manca qualcosa. Vediamo se ho capito: se
esegui la query senza clausola where questa funziona, altrimenti no. Quindi
mi pare che il problema sia nella clausola where.
Prova cosě:
    ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('select * from CLIENTI');
    ADOQuery1.SQL.Add('where cliente = :cliente');
    ADOQuery1.Parameters.ParamByName('cliente').Value := Edit1.Text;
    ADOQuery1.Open;
Questa sono sicuro che va, altrimenti posta l'eventuale errore.
Saluti
        Marco Bortolani
        info @ 
marcobortolani.it

     where cognome like 'PI?'        <--- AAARGH!!!!
Rettifico
     select *
     from CLIENTI
     where cognome like 'PI%'
e mi autopunisco.
Sorry

...

Grazie mille Marco. E' vero, se creo dei parametri nella query e poi
li passo dentro l'istruzione SQL, questa funziona. Ma se faccio una
cosa così:
ADOQuery.SQL.Text := 'SELECT * FROM Clienti WHERE cognome like "%' +
Edit1.Text + '%"'
ADOQuery.Open
la query mi restituisce quell'errore dei parametri insufficienti.
Io sono nuova del linguaggio e la cosa mi spiazza un po'. Io so che
una volta determinata la stringa di connessione, qualsiasi istruzione
passata deve essere eseguita sul db al quale punta la connessione.
Comunque visto che passando i parametri funziona mi adeguerò. Grazie
di tutto.


Uhm: ho effettuato una prova al volo e la cosa mi incuriosisce. Infatti, se
scrivo:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
        ADOQuery1.Close;
        ADOQuery1.SQL.Clear;
        ADOQuery1.SQL.Add('select * from CLIENTI');
        ADOQuery1.SQL.Add('where cognome like ''%' + Edit1.Text + '%''');
        ADOQuery1.Open
    end;
il tutto viene eseguito senza eccezioni.
Mentre provavo questa cosa, però, sono incappato in una distrazione, cioè ho
compilato il testo della query effettuando il test su un campo inesistente:
        ADOQuery1.Close;
        ADOQuery1.SQL.Clear;
        ADOQuery1.SQL.Add('select * from CLIENTI');
        ADOQuery1.SQL.Add('where descrizione like ''%' + Edit1.Text +
'%''');
                                                        ^^^^^^^^^
        ADOQuery1.Open
Al momento dell'esecuzione, Delphi mi ha sollevato esattamente l'exception
che dici tu, quella dei parametri insufficienti --> magari non hai scritto a
modo il campo sul quale effettui la selezione.


...

Grazie ancora per l'aiuto. Ho capito perché non andava. Il problema
non stava nella query: i campi che elencavo erano giusti. Il problema
stava nelle virgolette: se uso i doppi apici (") per indicare un campo
di tipo testo (es. : 'SELECT * FROM Clienti WHERE cognome like "%' +
edit1.text + '%"') mi ritorna quell'errore. Se invece uso gli apici
singoli come hai fatto tu nell'esempio fila tutto liscio. Però è
strano perché se uso il doppio apice senza dsn funziona. Non so darmi
una spiegazione ....
Un saluto.