ERRORE LOGIN FORM

di il
3 risposte

ERRORE LOGIN FORM

Buongiorno a tutti,

sto creando un form di Login mediante una tabella connessa ad un database di Sql Server, con il seguente codice:

Imports Microsoft.Data.SqlClient

Public Class frmLogin

    Dim conn As SqlConnection
    Dim command As SqlCommand
    Dim reader As SqlDataReader
    Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click
        Dim con As New SqlConnection("Data Source=SRV-APP01;Initial Catalog=DataITA_UFFICIALE;Persist Security Info=True;User ID=sa;Password=***********")
        Dim command As New SqlCommand("select * from TMS_UTENTI where TMS_UTENTE = @username and TMS_PASSWORD = @password", con)

        command.Parameters.Add("@username", SqlDbType.VarChar).Value = UsernameTextBox.Text
        command.Parameters.Add("@password", SqlDbType.VarChar).Value = PasswordTextBox.Text

        Dim adapter As New SqlDataAdapter(command)

        Dim table As New DataTable()

        adapter.Fill(table)

        If table.Rows.Count() <= 0 Then

            MessageBox.Show("Username o password non validi")

        Else

            'MessageBox.Show("Login Successfully")

            Dim frm As New frmMenu

            Me.Hide()

            frm.Show()

        End If

    End Sub

    Private Sub btnEsci_Click(sender As Object, e As EventArgs) Handles btnEsci.Click
        Application.Exit()
    End Sub
End Class
Quando tento di eseguire l'applicazione, ricevo questo errore di cui vi allego l'immagine.

Il codice mi sembra corretto non capisco mi restituisca l'errore di eccezione non gestita.

Grazie mille a tutti e buon lavoro
Allegati:
31216_59bcc5e520f47ad0e804acf874ed7ccc.jpg
31216_59bcc5e520f47ad0e804acf874ed7ccc.jpg

3 Risposte

  • Re: ERRORE LOGIN FORM

    DiegoLuppi1993 ha scritto:


    Quando tento di eseguire l'applicazione, ricevo questo errore di cui vi allego l'immagine. [...]
    Si direbbe che tu abbia abilitato l'encrypting su SQL Server, e nel tentativo di instaurare una connessione vi sia la ricerca automatica di un certificato valido per poterla stabilire.

    In questo articolo trovi un po' di spiegazioni a riguardo e qualche metodo per la risoluzione del problema.

    DiegoLuppi1993 ha scritto:


    
            Dim adapter As New SqlDataAdapter(command)
            Dim table As New DataTable()
            adapter.Fill(table)
            If table.Rows.Count() <= 0 Then
                MessageBox.Show("Username o password non validi")
    
    Il codice che hai scritto per l'operazione da fare mi sembra poco ottimizzato e molto "sprecone" di risorse.

    La creazione di un DataAdapter ha senso nel momento in cui vuoi memorizzare i dati ottenuti all'interno di un DataTable, che funge da cache per le informazioni estratte tramite il comando.

    Siccome ti basta controllare la presenza di un singolo record, che te ne fai della cache? Creare tutti gli oggetti per scaricare in una tabella tutti i dati dell'utente con lo scopo di andare a controllare se in quella tabella, alla fine di tutto, c'è finito almeno un record mi pare uno spreco enorme e ingiustificato.

    Aggiungi una clausola COUNT() alla query SQL, in modo che invece di tutti i dati (che potrebbero anche includere campi BLOB molto estesi) ti venga riportato un solo campo singolo, ossia il conteggio degli utenti che corrispondono alle credenziali indicate.

    Infine, invece che coinvolgere DataTable e DataAdapter, semplifica il codice usando il metodo dell'oggetto SqlCommand, che ti restituisce direttamente il valore della prima colonna del primo record ottenuto, quindi il conteggio esatto degli utenti (che puoi successivamente controllare se uguale a zero oppure maggiore di zero).

    Ci sarebbero altre remore da fare sul fatto che crei gli oggetti per l'accesso ai dati senza farne esplicitamente la Close() oppure chiamando Dispose() tramite gli appositi costrutti (es. Using), come indicato peraltro negli esempi della documentazione, ma direi che le indicazioni fornite sono sufficienti.

    Ciao!
  • Re: ERRORE LOGIN FORM

    Alka ha scritto:


    DiegoLuppi1993 ha scritto:


    Quando tento di eseguire l'applicazione, ricevo questo errore di cui vi allego l'immagine. [...]
    Si direbbe che tu abbia abilitato l'encrypting su SQL Server, e nel tentativo di instaurare una connessione vi sia la ricerca automatica di un certificato valido per poterla stabilire.

    In questo articolo trovi un po' di spiegazioni a riguardo e qualche metodo per la risoluzione del problema.

    DiegoLuppi1993 ha scritto:


    
            Dim adapter As New SqlDataAdapter(command)
            Dim table As New DataTable()
            adapter.Fill(table)
            If table.Rows.Count() <= 0 Then
                MessageBox.Show("Username o password non validi")
    
    Il codice che hai scritto per l'operazione da fare mi sembra poco ottimizzato e molto "sprecone" di risorse.

    La creazione di un DataAdapter ha senso nel momento in cui vuoi memorizzare i dati ottenuti all'interno di un DataTable, che funge da cache per le informazioni estratte tramite il comando.

    Siccome ti basta controllare la presenza di un singolo record, che te ne fai della cache? Creare tutti gli oggetti per scaricare in una tabella tutti i dati dell'utente con lo scopo di andare a controllare se in quella tabella, alla fine di tutto, c'è finito almeno un record mi pare uno spreco enorme e ingiustificato.

    Aggiungi una clausola COUNT() alla query SQL, in modo che invece di tutti i dati (che potrebbero anche includere campi BLOB molto estesi) ti venga riportato un solo campo singolo, ossia il conteggio degli utenti che corrispondono alle credenziali indicate.

    Infine, invece che coinvolgere DataTable e DataAdapter, semplifica il codice usando il metodo dell'oggetto SqlCommand, che ti restituisce direttamente il valore della prima colonna del primo record ottenuto, quindi il conteggio esatto degli utenti (che puoi successivamente controllare se uguale a zero oppure maggiore di zero).

    Ci sarebbero altre remore da fare sul fatto che crei gli oggetti per l'accesso ai dati senza farne esplicitamente la Close() oppure chiamando Dispose() tramite gli appositi costrutti (es. Using), come indicato peraltro negli esempi della documentazione, ma direi che le indicazioni fornite sono sufficienti.

    Ciao!
    Buonasera e grazie mille per le indicazioni ricevute e per le migliorie proposte...ma è possibile che questo errore non compaia su Visual Studio 2022? perchè ho ripreso in mano la versione 2019 causa un problema con la mia macchina principale (sto utilizzando Microsoft Sql Server 2017) e non mi sembrava che mi fosse mai capitata questa problematica...
  • Re: ERRORE LOGIN FORM

    DiegoLuppi1993 ha scritto:


    ma è possibile che questo errore non compaia su Visual Studio 2022? perchè ho ripreso in mano la versione 2019 causa un problema con la mia macchina principale (sto utilizzando Microsoft Sql Server 2017) e non mi sembrava che mi fosse mai capitata questa problematica...
    Presumo dipenda dalla macchina, non dalla versione di Visual Studio.
Devi accedere o registrarti per scrivere nel forum
3 risposte