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 è:
- tenta di aprire la connessione. La stringa di default ha la IntegratedSecurity a true.
- 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.