Selezionare più campi da una colonna

lunedì 16 febbraio 2009 - 10.44

Valdal14 Profilo | Junior Member

Salve Ragazzi

Sono alle prese con una piccola applicazione Win Form, devo dire che sono riuscito ad eseguire bene tutto, ma ho un dubbio, perchè quando eseguo il controllo sul DataReader posso visualizzare solo il primo campo della mia tabella e non tutti i restanti?

Vorrei eseguire un login su un winform che si collega ad un DB SQL Server, tutto ok per il primo campo della mia tabella ma non capisco il perchè della non verifica sui campi successivi

Ecco alcune porzioni di codice per farvi capire meglio

Ciclo While sul DataReader

while (datareader.Read()) { ID = datareader["ID"].ToString(); Username = datareader["Username"].ToString(); Password = datareader["Password"].ToString(); }

Query SQL

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

Quando clicco sul pulsante di login, se inserisco il primo record del campo Username e Password della mia tabella funziona tutto, se faccio una prova con il secondo campo mi da login fallito e non capisco il perchè.

Grazie in anticipo

Jeremy Profilo | Guru

Ciao Valdal...
Comincia con tirare via gli apici che hai usato per racchiudere i numeri 1 e 999.....essendo valori integer, non devono essere racchiusi tra gli apici.
Eventualmente....facci sapere...
Ciao

Valdal14 Profilo | Junior Member

Ciao Jeremy

Ho tolto gli apici come suggerito, ma il risultato non cambia....

Jeremy Profilo | Guru

Un'altra cosa che mi viene in mente è che con il codice che hai mostrato ...... nelle variabili Id,Password e Username, avrai sempre i valori dell'ultimo record.
Mostra un pò più di codice....magari quello che usi per verificare utente e password per la validazione.

Facci sapere....
Ciao

Valdal14 Profilo | Junior Member

Ecco il codice relativo al controllo di login

Premetto che per il primo campo della tabella funziona, mentre per il secondo nulla

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

Jeremy Profilo | Guru

Prova ad inserire il controllo per la validazione all'interno del ciclo While
Altrimenti....appena ho un pò di tempo in giornata gli do un occhio e poi ti faccio sapere....
Ciao

Valdal14 Profilo | Junior Member

Provo e ti aggiorno, attendo se puoi una tua verifica

Grazie mille

Aggiorno il Post

Allora, ti spiego bene, Ho un win form di nome start ed una classe esterna di nome connessione, allora, nella classe connessione.cs figlia di start se inserisco nel ciclo while dei controlli posso visualizzare tutti i dati della tabella ma non mi effettua il login... mentre quando richiamo il metodo connessione() alla pressione del mouse sul pulsante di login del form start accede solo con il primo record di dati della tabella.

Spero di essermi spiegato bene

Jeremy Profilo | Guru

Ciao Valdal
Questo è secondo me la giusta impostazione del codice:

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

Attenzione al case sensitive....nel senso....accertati che nella tabella del db ci sia scritto Amministratore e non AMMINISTRATORE(per esempio)

Prova e poi .... facci sapere....
Ciao

Valdal14 Profilo | Junior Member

Ho controllato ma sembra tutto ok

Non riesco a capire il perchè, esegue il controllo, i dati ci sono e sono corretti ma... non funziona

Jeremy Profilo | Guru

Ciao Valdal
Sono quasi sicuro che è un problema di case sensitive.....aggiungi ToUpper a tutte le variabili string che usi per fare la validazione.

Facci sapere...
Ciao

Valdal14 Profilo | Junior Member

Purtroppo le ho provate tutte

Allora se il ciclo if lo eseguo richiamando il metodo della classe connessione all'evento click del button di login, mi controlla bene ma solo il record n°1 del database, mentre se lo eseguo direttamente nella classe ed anche all'interno del ciclo while, visualizzo tutti gli utenti ma non riconosce gli utenti del database

Attendo un tua risposta se puoi

Jeremy Profilo | Guru

Ciao Valdal.
Io ho provato a ricreare un pochino il tuo scenario.....e funziona.
Ti dico che probabilmente è solo un problema di case sensitive.
Prova a modificare il tuo codice in questo modo:

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

Attenzione.....do per scontato che nel campo ID della tabella ci sia scritto davvero Amministratore o Utente!!!
Non è che il campo ID è di tipo contatore o numerico?



facci sapere...
Ciao

Valdal14 Profilo | Junior Member

Nei campi ID sono presenti sia Amministratore che Utente, però la cosa strana e che sembra non eseguire il ciclo if fuori dal while... cioè i dati ci sono e tramite un messagebox posso vederli per esempio, ma quando esco dal ciclo while per eseguire le varie istruzioni if verifica solo la prima e poi si ferma... il perchè è un mistero

Jeremy Profilo | Guru

L'if DEVE essere all'interno del ciclo While....lo hai visto il mio codice????
Fai Copia incolla del mio codice e poi facci sapere...
Ciao

Valdal14 Profilo | Junior Member

Allora...

Certo che avevo visto il tuo codice... penso sia giusto allegare tutto il codice della classe e tutto il codice del form start in modo che tu possa verificare, perchè sia il tuo codice che il mio se vengono eseguiti richiamando il metodo dalla classe esterna non fanno nessun cotrollo, mentre se vengono associati all'evento click del mouse e quindi direttamente nel form strart riconoscono solo il primo utente.

Form Start

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; namespace Wifly { public partial class start : Form { public start() { InitializeComponent(); menuStrip1.Visible = false; } public void button_login_Click(object sender, EventArgs e) { Connessione Login = new Connessione(); Login.Data_Connection(); } } }

Classe connessione

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

Provalo e fammi sapere e grazie ancora del tempo che mi hai dedicato

Jeremy Profilo | Guru

Prova ad aggiungere questo codice subito dopo:
datacommand.CommandText = "SELECT ID, Username, Password FROM Utenti WHERE ID_Ruolo BETWEEN 1 AND 999 ORDER BY Nome";

Per fare questa prova, commenta provvisoriamente la riga dataconnection.Open()

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

Con questo codice dovresti capire quanti record ti restituisce la tua query.
Tutto il resto è corretto .... te lo posso garantire.
Magari è la stringa query sbagliata che ti restituisce un solo record come risultato.
Prova a vedere che numero ti indica nella messagebox.

Facci sapere...
Ciao.


Valdal14 Profilo | Junior Member

Ciao Jeremy

Così come avevo fatto io, avevo preventivamente controllato che nel ciclo while mi restituisse tutti i valori della query compreso il campo ID, se eseguo una messagebox vedo sia l'ID Amministratore che la sua relativa username e password ed anche per il secondo record Utente, username e password anche per esso...

ma... Siamo alle solite, anche il tuo codice funziona quanto il mio, la cosa assurda e che mi sembra corretto anche come dici tu, ma non capisco proprio, provo a dormirci sopra e forse la notte porta consiglio, se pensi o se vuoi ti aggiorno domani nella speranza di poter proseguire in questa fase dello sviluppo, pensavo fosse più agevole ma questi problemi di natura almeno per me ignota ora come ora non li proprio digerisco, ci aggiorniamo a domani.

Grazia ancora per la tua disponibilità spero domattina di risolvere e cmq ti tengo aggiornato.

N.B: Il tuo codice mi restituisce 2. come pensavo.

Saluti Valdal14

Jeremy Profilo | Guru

>se vuoi ti aggiorno domani
Certo....domani, appena ho una mezzora un pò tranquilla provo a ricreare lo scenario username e password ed eventualmente ti mando il progettino zippato.
Fammi solo sapere se usi VS2008 o altro.....

Ciao

Valdal14 Profilo | Junior Member

Buongiorno Jeremy

Come puoi vedere sono già pronto per ripartire, con la speranza di risolvere questo "mistero", io uso Visual Studio 2008 per svuluppare le mie applicazioni

Volevo farti verificare una eventuale soluzione, se nella query sql di select facessi il cotrollo sulle textbox senza eseguire il ciclo while?... cosa ne pensi...

Attendo novità e buona giornata

Jeremy Profilo | Guru

Ciao Valdal.
ti ho preparato un esempio funzionante sul quale possiamo fare le varie considerazioni.
La prima considerazione che mi viene di fare è che il metodo toUpper(), ovviamente, è solo ai fini di test, in quanto,ovviamente, username e password, è giusto che siano case sensitive.
Per mia comodità ho usato un DataBase Access....ma questo non cambia nulla(è solo che ho appena formattato il pc e non ho ancora tutto installato).
gli utenti sono 3:
Amministratore,admin,admin
Utente,ut1,prova1
Utente,ut2,prova2


Facci sapere...
Ciao

Valdal14 Profilo | Junior Member

Allora...

Ho visto il tuo codice, funziona... ma quello che volevo fare e caricare tutto il metodo Data_Connection della classe Connessione all'evento click del tasto login del form start, ora mi funziona... ma... perchè se lo eseguo caricandolo dalla classe Connessione non verifica e quindi non funziona.

Codice dell'Evento click sul tasto di login

Connessione Login = new Connessione(); // Costruttore della classe Connessione Login.Data_Connection(); // Chiamata al metodo

Mentre se tutto il codice sviluppato lo eseguo dentro l'evento click funziona tutto, ho scordato qualcosa o cosa...

Grazie mille

Jeremy Profilo | Guru

Ciao Valdal.
Se accade quello che dici tu, i motivi possono essere diversi, tra cui:
Sei sicuro che la connectionstring che dichiari nella tua classe, punta davvero al database al quale tu pensi che punti???
Sei sicuro che nelle proprietà di VS(relative al Db) è disabilitata l'opzione "Copia sempre"????

Comunque, stasera....riscrivo l'esempio utilizzando una classe come hai bisogno che sia.

Ciao.

Valdal14 Profilo | Junior Member

Come detto se tutto il codice lo eseguo al click del tasto login funziona tutto altrimenti se carico il metodo no...

Attendo novità

Jeremy Profilo | Guru

Ciao Valdal.
Spero di aver capito la tua esigenza.
In allegato l'esempio che ti dicevo.

Facci sapere...
Ciao

Valdal14 Profilo | Junior Member

Ok Jeremy

Dopo tanto ci siamo riusciti... grazie mille ed alla prossima
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