Problemi query con MS Access

lunedì 19 febbraio 2007 - 17.12

Olin Profilo | Newbie

Ciao a tutti.. è la prima volta che posto su questo forum quindi mi presento.. sono Olin una new entry del sito... xD

Il problema che ho riscontrato è il seguente:
Quando tento di inserire dei valori in una tabella (nel mio caso nella tabella "utenti" che ha come campi 'id_utente', 'nome', 'username', 'password', 'email') se creo una query del tipo " INSERT INTO utenti(nome,username) VALUES('" + nome + "','" + user + "'''); " i due campi me li inserisce senza problemi.. mentre se provo ad inserirne più di due contemporaneamente mi genera un errore.. (vi ho allegato l'img dell'errore al thread) di seguito posto uno dei tanti codici che ho usato per tentare di far funzionare il programma..

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
questa funzione fa parte di una classe appartenente ad una libreria, che poi richiamerò nel programma principale.. passandogli i rispettivi valori delle variabili.

spero che mi possiate aiutare, grazie in anticipo!

lbenaglia Profilo | Guru

>string sql = "INSERT INTO utenti(nome,username,password,email)
>VALUES('" + nome + "','" + user + "','" + pas + "','" + mail
>+ "');";
>OleDbCommand cmd = new OleDbCommand(sql, conn);
> OleDbDataReader dr = cmd.ExecuteReader();

Ciao Olin,

Un comando di INSERT non produrrà in output un reultset pertanto non ha senso richiamare il metodo ExecuteReader() di un oggetto OleDbCommand, piuttosto dovrai utilizzare il metodo ExecuteNonQuery:
http://msdn2.microsoft.com/en-us/library/system.data.oledb.oledbcommand.executenonquery.aspx

Inoltre ti suggerisco di definire in Access una Query parametrica che andrai a richiamare tramite un oggetto OleDbCommand valorizzando la collection Parameters con i vari parametri della query ed eseguendo il tutto tramite il metodo ExecuteNonQuery.

Questo esempio è basato su ADO "standard" ma ti mostra concettualmente come fare:
http://groups.google.it/group/microsoft.public.it.sql/browse_thread/thread/8cffa517474e4df/

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Olin Profilo | Newbie

ti ringrazio innanzitutto per la tua risposta, ho dato un occhiata alla documentazione riguardante il comando executeNonQuery ed ho modificato il codice nel seguente modo:


Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

la variabile strAccessConn viene settata quando richiamo la classe nel codice della form tramite il costruttore a cui passo il nome del database.
L'errore che mi viene generato è sempre lo stesso (vi ho ripostato l'immagine xk quella del primo post era del vecchio progetto..che poi è stato modificato).

Riguardo al secondo link che mi hai gentilmente suggerito di consultare .. beh dopo aver letto mh non ci ho capito niente X_X è la prima volta che lavoro con i database in c# e quindi non ho molta praticità.
Potresti gentilmente spiegarmi il significato di "Query parametrica che andrai a richiamare tramite un oggetto OleDbCommand valorizzando la collection Parameters con i vari parametri della query ed eseguendo il tutto tramite il metodo ExecuteNonQuery."
che cosa sarebbe una query parametrica? ed a che cosa serve?
Grazie, Olin.

lbenaglia Profilo | Guru

>Riguardo al secondo link che mi hai gentilmente suggerito di
>consultare .. beh dopo aver letto mh non ci ho capito niente
>X_X è la prima volta che lavoro con i database in c# e quindi
>non ho molta praticità.
>Potresti gentilmente spiegarmi il significato di "Query parametrica
>che andrai a richiamare tramite un oggetto OleDbCommand valorizzando
>la collection Parameters con i vari parametri della query ed
>eseguendo il tutto tramite il metodo ExecuteNonQuery."
>che cosa sarebbe una query parametrica? ed a che cosa serve?

Ciao Olin,

Allora, procediamo con calma.
Come saprai Microsoft Access fin dalla versione 1.0 permette di definire delle Query costituite da comandi SQL come oggetti persistenti nel database.
Tali oggetti permettono di incapsulare tutti i comandi di selezione, modifica, inserimento e cancellazione che possono essere richiamati da altre Query oppure direttamente dalle applicazioni client che ne fanno uso, ottenendo in questo modo uno "strato di interfacciamento" tra applicazioni e db.
Grazie alla tecnologia Rushmore introdotta in Access grazie all'acquisizione di FoxPro, gli oggetti Query saranno precompilati al loro salvataggio, offrendo prestazioni superiori rispetto alle classiche stringhe SQL "sparate" dai client.
Una Query parametrica non è altro che una normalissima query che accetta in input 1 o più parametri (esattamente come una procedura parametrica in VB).

OK, supponiamo di definire in Access i seguenti oggetti:

Tabella Students

Field Data Type ---------- ----------- StudentID AutoNumber FirstName Text(10) LastName Text(10)

Query qrySetStudent

PARAMETERS [FirstName] Text (10), [LastName] Text (10); INSERT INTO Students ( FirstName, LastName ) VALUES ([FirstName], [LastName]);

Se volessi richiamare la query parametrica qrySetStudent da un client scritto in Visual C# dovrei fare qualcosa del genere:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Come vedi la logica è veramente semplice:

1) Definisco una connessione al database Access;
2) Definisco un oggetto Command mappato sulla Query definita in precedenza;
3) Valorizzo i parametri della query;
4) Eseguo il Command;
5) Chiudo la connessione.

Per maggiori informazioni consulta l'help in linea di Access ed MSDN.

>Grazie, Olin.
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Olin Profilo | Newbie

Funziona tutto alla perfezione..
Geniale ;-) Grazie 1000

dyd666 Profilo | Junior Member

Uppo questo topic dato che il problema che ho è analogo.
Devo gestire una Login di un sito , solo che non ho ben capito come fare per controllare i valori.

In questa parte

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Vedo che si utilizzano i parametri in modo fisso (Lorenzo , Benaglia).
Se io volessi fare un qualcosa di dinamico invece?
Con username e password dati in ingresso?
La query di selezione utente e password dovrà essere definita all'interno di qrySetStudent?
Scusate se faccio tante domande , sono poco pratico...

Grazie arrivederci

lbenaglia Profilo | Guru

>Vedo che si utilizzano i parametri in modo fisso (Lorenzo , Benaglia).
>Se io volessi fare un qualcosa di dinamico invece?
>Con username e password dati in ingresso?
Sostituisci quei due valori costanti con il contenuto dei controlli compilati dall'utente.

>La query di selezione utente e password dovrà essere definita
>all'interno di qrySetStudent?
Che significa?

>Grazie arrivederci
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

dyd666 Profilo | Junior Member

>>Vedo che si utilizzano i parametri in modo fisso (Lorenzo , Benaglia).
>>Se io volessi fare un qualcosa di dinamico invece?
>>Con username e password dati in ingresso?
>Sostituisci quei due valori costanti con il contenuto dei controlli
>compilati dall'utente.
>

Controlli compilati?
Se dovessi gestire due caselle di testo?

>>La query di selezione utente e password dovrà essere definita
>>all'interno di qrySetStudent?
>Che significa?
>

Nel senso , qrySetStudent conterrà la query che intendo preservare da queryinjection?

Rinnovo i ringraziamenti ed i saluti :)

lbenaglia Profilo | Guru

>>>Vedo che si utilizzano i parametri in modo fisso (Lorenzo , Benaglia).
>>>Se io volessi fare un qualcosa di dinamico invece?
>>>Con username e password dati in ingresso?
>>Sostituisci quei due valori costanti con il contenuto dei controlli
>>compilati dall'utente.
>>
>
>Controlli compilati?
>Se dovessi gestire due caselle di testo?
Sostituisci le costanti con txtNome.Text o equivalente.

>Nel senso , qrySetStudent conterrà la query che intendo preservare
>da queryinjection?
Si.

>Rinnovo i ringraziamenti ed i saluti :)
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

dyd666 Profilo | Junior Member

Ho inserito nel mio pulsante di login questo codice

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Mi dà quest'errore in uscita

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

La domanda che pongo ora: è corretto agire in questo modo per controllare un login?
Oppure no?

Grazie ancora , saluti

lbenaglia Profilo | Guru

>Ho inserito nel mio pulsante di login questo codice
>
>qrylogin = "SELECT Password FROM Utenti WHERE Username = '" +
>User.Text + "'";
...

> /* Definisco i parametri di input */
>cmd.Parameters.Add("FirstName", OleDbType.VarChar).Value = User.Text;

Il parametro FirstName non esiste nel tuo comando di SELECT.
Incapsula quella SELECT in un oggetto Query di Access, specificando il nome dei parametri esattamente come è riportato nell'esempio che trovi all'inizio del thread.

>Grazie ancora , saluti
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

dyd666 Profilo | Junior Member

>Il parametro FirstName non esiste nel tuo comando di SELECT.
>Incapsula quella SELECT in un oggetto Query di Access, specificando
>il nome dei parametri esattamente come è riportato nell'esempio
>che trovi all'inizio del thread.
>
>>Grazie ancora , saluti
>Prego.
>
>Ciao!
>--
>Lorenzo Benaglia
>Microsoft MVP - SQL Server
>http://blogs.dotnethell.it/lorenzo/
>http://italy.mvps.org

Ciao , ho fatto tutto su Access , la query parametrica sembra funzionare.
Ora ho un problema però: il codice risultante è questo

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

La query parametrica questa:

PARAMETERS Contr_User Text ( 255 ); SELECT Password FROM Utenti WHERE Username = Contr_User;

Mi ritrovo ora a dover effettuare dei controlli sul campo password , non direttamente con la Select però.
Che oggetto potrei utilizzare per "trattare" il campo Password estratto dalla Select?
Prima di inserire la query parametrica utilizzavo un OleDbDataReader a questo scopo...
Sinceramente ora non saprei come utilizzarlo

Grazie ancora per la pazienza ed i suggerimenti
Saluti
Riccardo

EDIT: Rettifico , ho ricontrollato e la variabile result associata alla executenonquery da risultato Zero.
Come se non venisse estratto nulla.
Il problema è che su Access la query parametrica funziona.
Dove sbaglio?

dyd666 Profilo | Junior Member

Up

lbenaglia Profilo | Guru

>Up
Non siamo sul forum di Hardware Upgrade, "uppare" non serve a nulla
Studia su MSDN la differenza tra questi tre metodi e risponditi da solo:
http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.executenonquery.aspx
http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.executereader.aspx
http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.executescalar.aspx

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

dyd666 Profilo | Junior Member

>>Up
>Non siamo sul forum di Hardware Upgrade, "uppare" non serve a
>nulla
>Studia su MSDN la differenza tra questi tre metodi e risponditi
>da solo:
>http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.executenonquery.aspx
>http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.executereader.aspx
>http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.executescalar.aspx
>
>Ciao!
>--
>Lorenzo Benaglia
>Microsoft MVP - SQL Server
>http://blogs.dotnethell.it/lorenzo/
>http://italy.mvps.org

Mi scuso per l'Up
Grazie per le segnalazioni

dyd666 Profilo | Junior Member

Eccomi di ritorno.
Funziona tutto.
Grazie mille a Lorenzo per l'aiuto
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5