Individuare tipologia di SqlException

di il
2 risposte

Individuare tipologia di SqlException

Buongiorno a tutti,

ho una domanda in merito all'individuazione esatta dell'errore riportato in una SqlException. In un codice tipo

        public static SqlConnection GetConnection(string connectionString)
        {
            SqlConnection conn = new SqlConnection(connectionString);
            try
            {
                conn.Open();
            }
            catch (SqlException ex)
            {
                if (ex.Message.Contains("SSPI"))
                    RetryWithoutIntegratedSecurity(conn);
            }
            finally
            {
                conn.Close();
            }
            return conn;
        }
        private static void RetryWithoutIntegratedSecurity(SqlConnection conn)
        {
            FormCredential frm = new FormCredential();
            if (frm.DialogResult == System.Windows.Forms.DialogResult.OK)
            {
                SqlConnectionStringBuilder sb = new SqlConnectionStringBuilder(conn.ConnectionString)
                {
                    IntegratedSecurity = false,
                    UserID = frm.Username,
                    Password = frm.Password
                };
                conn.ConnectionString = sb.ConnectionString;
                try
                {
                    conn.Open();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    frm.Dispose();
                }
            }
        }

il cui obiettivo è:

  1. tenta di aprire la connessione. La stringa di default ha la IntegratedSecurity a true.
  2. Se fallisci e trovi SqlExeption - errore nel generare il contesto SSPI, ritenta modificando la stringa di connessione.

Faccio aprire una form in cui inserire User e pw, modifico la ConnectionString della connessione e riprovo.

Il punto è: come distinguo la SqlException ricevuta per SSPI da quella ricevuta per un timeout o altro? Indagare la Message mi pare decisamente poco “professionale” ma è il primo escamotage che mi è venuto in mente per far funzionare la cosa.

Purtroppo la HResult non aiuta perché è mappata su SqlException generica e non sull'errore specifico.

2 Risposte

  • Re: Individuare tipologia di SqlException

    Hai controllato il valore della proprietà Number?
    Di solito è dirimente in questi casi.

  • Re: Individuare tipologia di SqlException

    Si e lo avevo trovato valorizzato a zero. Ma non l'ho trovato strano perché, magari sbagliando, ho supposto che l'eccezione più che SqlServer la solleva Kerberos. Nella collection Errors ho trovato un solo item e ho spulciato quello in debug. Controllando nella tabella sys.message non riesco a trovare il testo che vedo nell'eccezione.

    Nota a margine: di autenticazioni non ne capisco una cicca. Vado a tentoni brancolando nel buio. Ho provato a studiare qualcosa ma dire che è un argomento vasto è come dire che il Pacifico è una tinozza.

    Ora ovviamente Windows Server deve aver trovato il modo di far ripartire il servizio di autenticazione perché il problema è sparito e non riesco più a replicarlo.

Devi accedere o registrarti per scrivere nel forum
2 risposte