Variabile in query SQL che non risponde

di il
8 risposte

Variabile in query SQL che non risponde

Vorrei eseguire una query SQL ogni volta che l'utente preme i pulsanti First, Last, Previous e Next.

Nella fattispecie, la query deve mostrare che classe ha frequentato uno studente. Al variare del nome dello studente varia il contenuto del DGV.
I dati vengono presi da tre tabelle differenti: Students, SchoolClasses e StudentEnrolment.
La query funziona pefettamente sia nella versione generale, inserita nell'evento LOAD della Form:
SELECT StudentEnrolments.EnrolmentID,	StudentEnrolments.SchoolYear, Students.StudentName, SchoolClasses.SchoolClass FROM StudentEnrolments, Students, SchoolClasses
WHERE
	Students.StudentID = StudentEnrolments.StudentID
AND
	SchoolClasses.SchoolClassID = StudentEnrolments.SchoolClassID
Che nella versione "personalizzata":
SELECT StudentEnrolments.EnrolmentID,StudentEnrolments.SchoolYear, Students.StudentName, SchoolClasses.SchoolClass 
FROM StudentEnrolments, Students, SchoolClasses 
WHERE
Students.StudentID = StudentEnrolments.StudentID 
AND 
SchoolClasses.SchoolClassID = StudentEnrolments.SchoolClassID 
AND StudentName = 'Reese Klostermann'"
Ma quando provo ad inserire una variabile dove nella parte finale scrivo:
AND StudentName = '"+ txtStudentName.Text +"'
Azionata dall'evento CLICK di uno dei pulsanti di scorrimento, la query non funziona. Ho provato a creare un public Static String studentClassroom, ma non è servito.

Aggiungo per completezza di informazione che i pulsanti di scorrimento fanno riferimento ad una funzione che richiama i vari campi.

Inoltre, ho provato la query inserendo a mano il nome di uno studente tramite l'evento LEAVE della textbox txtStudentName per vedere se funzionava, ma il risultato è che oltre a non attivare la query il nome dello studente scompare appena usciti dalla texbox.

8 Risposte

  • Re: Variabile in query SQL che non risponde

    Ciao,
    ti da errore oppure non ti da risultati?
    Nell'evento click del pulsante come richiami l'esecuzione della query?
  • Re: Variabile in query SQL che non risponde

    lele2006 ha scritto:


    Ciao,
    ti da errore oppure non ti da risultati?
    Il DGV rimane vuoto.

    lele2006 ha scritto:


    Nell'evento click del pulsante come richiami l'esecuzione della query?
    //Esegue la query per filtrare le iscrizioni delle classi degli studenti
                using (SqlConnection conn = new SqlConnection(myconnstrng))
                {               
                    SqlDataAdapter adapter = new SqlDataAdapter("SELECT StudentEnrolments.EnrolmentID,StudentEnrolments.SchoolYear, Students.StudentName, SchoolClasses.SchoolClass FROM StudentEnrolments, Students, SchoolClasses WHERE Students.StudentID = StudentEnrolments.StudentID AND SchoolClasses.SchoolClassID = StudentEnrolments.SchoolClassID AND StudentName = 'Julia Soppit'", conn);
                    DataTable dt = new DataTable();
                    adapter.Fill(dt);
                    dgvStudentClassromm.DataSource = dt;
    
                    dgvStudentClassromm.Columns[0].Visible = false;
                    dgvStudentClassromm.Columns[2].Visible = false;
                }
    Al momento la query è nella versione manuale.
  • Re: Variabile in query SQL che non risponde

    Aggiungo il listato relativo al pulsante FIRST, così hai (avete) il quadro completo.
    private void btnFirst_Click(object sender, EventArgs e)
            {
                position = 0;
                ShowData(position);
            }
    E quello della funzione ShowData.
    public void ShowData(int index)
            {
                txtStudentID.Text = dataTable.Rows[index][0].ToString();
                txtStudentName.Text = dataTable.Rows[index][1].ToString();
                cbGender.Text = dataTable.Rows[index][2].ToString();
                txtAddress.Text = dataTable.Rows[index][3].ToString();
                txtCity.Text = dataTable.Rows[index][4].ToString();
                txtPostalCode.Text = dataTable.Rows[index][5].ToString();
                txtEmail.Text = dataTable.Rows[index][6].ToString();
            }
  • Re: Variabile in query SQL che non risponde

    Quindi vuoi caricare nelle caselle di testo i dati presenti nel dataTable?

    Questo DataTable ha i dati? Inoltre è scritto a livello globale di form?

    La query con la condizione "Students.StudentID = StudentEnrolments.StudentID AND SchoolClasses.SchoolClassID = StudentEnrolments.SchoolClassID AND StudentName = 'Julia Soppit' " ti restituisce dei record?
  • Re: Variabile in query SQL che non risponde

    La query, quando la eseguo con l'evento LOAD della Form, funziona perfettamente. Se scrivo il nome di Julia Soppit mi restituisce le classi a cui si è iscritta Julia Soppit. Quando scrivo un altro nominativo altrettanto. Solo che sono io che la imposto.
    Quando invece, nell'ultima clausola scrivo AND StudentName = '"+ txtStudentName.text +"' non restituisce niente, nemmeno se scrivo nella textbox un nome.
    Lo stesso accade con l'evento CLICK di uno dei tasti di scorrimento.
  • Re: Variabile in query SQL che non risponde

    Fabriziog ha scritto:


    La query, quando la eseguo con l'evento LOAD della Form, funziona perfettamente. Se scrivo il nome di Julia Soppit mi restituisce le classi a cui si è iscritta Julia Soppit. Quando scrivo un altro nominativo altrettanto. Solo che sono io che la imposto.
    Quando invece, nell'ultima clausola scrivo AND StudentName = '"+ txtStudentName.text +"' non restituisce niente, nemmeno se scrivo nella textbox un nome.
    Lo stesso accade con l'evento CLICK di uno dei tasti di scorrimento.
    Per risolvere il tuo problema sono necessarie due cose:

    1)
    usa i parametri nell'esecuzione del comando (vedi qui) e non inserire direttamente il valore letterale nella stringa SQL, pena l'esposizione di vulnerabilità a SQL Injection oltre a una serie infinita di altre problematiche;

    2)
    usa il debugger quando lanci il programma andando a mettere un breakpoint nell'istruzione che definisce o esegue la query verificando qual è il testo che viene inserito e usato come parametro per il filtro e controllando in generale lo stato di tutte le altre variabili e oggetti coinvolti.

    Ciao!
  • Re: Variabile in query SQL che non risponde

    Alka ha scritto:


    Per risolvere il tuo problema sono necessarie due cose:

    1)
    usa i parametri nell'esecuzione del comando (vedi qui) e non inserire direttamente il valore letterale nella stringa SQL, pena l'esposizione di vulnerabilità a SQL Injection oltre a una serie infinita di altre problematiche;
    Dopo che ho spento mi era venuto in mente che potevo usare SqlCommand e infatti ho modificato l'evento, così:
    private void btnFirst_Click(object sender, EventArgs e)
            {
                position = 0;
                ShowData(position);
    
                using(SqlConnection conn = new SqlConnection(myconnstrng))
                {
                    conn.Open();
                    SqlCommand cmd = new SqlCommand("SELECT StudentEnrolments.EnrolmentID,StudentEnrolments.SchoolYear, Students.StudentName, SchoolClasses.SchoolClass FROM StudentEnrolments, Students, SchoolClasses WHERE Students.StudentID = StudentEnrolments.StudentID AND SchoolClasses.SchoolClassID = StudentEnrolments.SchoolClassID AND StudentName = '"+ txtStudentName.Text +"'", conn);
                    SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                    //adapter.SelectCommand.Parameters.AddWithValue("@StudentName", txtStudentName.Text);
                    DataTable dt = new DataTable();
                    adapter.Fill(dt);
                    dgvStudentClassromm.DataSource = dt;
    
                    cmd.ExecuteNonQuery();
    
                    dgvStudentClassromm.Columns[0].Visible = false;
                    dgvStudentClassromm.Columns[2].Visible = false;
                }      
    Ho fatto un po' di prove.
    Il codice funziona sia con la riga SelectCommand.Parameters... sia attivata che no.
    Funziona sia che uso ExecuteNonQuery che ExecuteScalar.

    La cosa negativa è che il listato funziona solo con il pulsante btnFirst. Con gli altri tre, quando cambiano i nominativi il DGV rimane fermo sul primo nominativo della lista.

    In quanto alla query: per le query complesse uso le stored procedure. Per il momento mi serviva verificare che desse i risultati corretti. Non mi andava di fare avanti e indietro fra Visual Studio e Sql Server.

    Alka ha scritto:


    2)
    usa il debugger quando lanci il programma andando a mettere un breakpoint nell'istruzione che definisce o esegue la query verificando qual è il testo che viene inserito e usato come parametro per il filtro e controllando in generale lo stato di tutte le altre variabili e oggetti coinvolti.

    Ciao!
    Qui mi fermo, perché non so leggere e interpretare gli eventuali errori.
  • Re: Variabile in query SQL che non risponde

    Fabriziog ha scritto:


    Ho fatto un po' di prove.
    A me pare che tu stia utilizzando le classi di ADO.NET in modo improprio senza studiare la documentazione, vista la quantità di errori nel tuo codice. In breve, stai più o meno andando a caso, sperimentando di volta in volta.

    Ma andiamo per punti...

    Fabriziog ha scritto:


    Il codice funziona sia con la riga SelectCommand.Parameters... sia attivata che no.
    Per forza: nella query SQL che esegui non esiste in alcun punto il riferimento al parametro con nome @StudentName, poiché tu continui a concatenare il valore della TextBox invece di usare un parametro al suo posto, come indicato nella documentazione.

    Essendo che il parametro non viene usato nel comando SQL, che tu lo specifichi o meno, è ovvio che sia indifferente.

    Fabriziog ha scritto:


    Funziona sia che uso ExecuteNonQuery che ExecuteScalar.
    Anche qui, si tratta di una ovvietà, dato che nessuno di questi due metodi è quello che realmente ti fornisce il risultato.

    Prima di chiamare questi metodi, fai uso di un SqlDataAdapter e vai a invocare il metodo Fill() passando la DataTable come parametro: questo è esattamente il punto in cui l'adapter va a eseguire il comando così come configurato, recupera i dati, inizializza la tabella in memoria e la riempie con le informazioni.

    L'esecuzione postuma che fai chiamando ExecuteNonQuery() o ExecuteScalar() ha il solo effetto di eseguire nuovamente la query del comando, senza che questa venga letta o usata in nessun contesto, visto che i dati li hai recuperati prima.

    Fabriziog ha scritto:


    Qui mi fermo, perché non so leggere e interpretare gli eventuali errori.
    Saper leggere gli errori e, se non interpretarli quantomeno ricercarli, direi che è fondamentale.

    Prendendo esempi qua e là, combinarli senza sapere bene l'effetto che producono e non andare ad analizzare il comportamento del programma quando questo è diverso da quello che ci aspettiamo è un'attività fondamentale: se non ci si vuole nemmeno sforzare di provare a farla e seguire un minimo di metodologia, tanto vale non programmare affatto allora, perché saranno problemi uno dopo l'altro, privi di spiegazione logica e anche per le cose più banali. Poi, questo è solo il mio parere.

    Un saluto!
Devi accedere o registrarti per scrivere nel forum
8 risposte