Objektet OdbcException har en matris med erorrs, OdbcException.Errors(). Det är väl egentligen bara de på MS som har skrivit OdbcException som kan svara på detta, men om jag får gissa lite.. Det normala i .NET är ju att man har ett Exception, som kan ha ett InnerException, som också kan ha ett InnerException osv (och att det mest korrekta sättet att skriva ut alla fel är ju då att loopa igenom den nästlade Exception-listan - vilket inte så många utvecklare har koll på iofs.. :-)OdbcException.Errors(0)
Men varför en matris? Kan adaptern generera flera error samtidigt? OdbcException blir väll disposad efter innevarande Catch fas?
Här bekräftar dom att det är en matris:
http://msdn.microsoft.com/en-us/library/system.data.odbc.odbcerrorcollection.aspx
Dom till och med bläddrar runt i den och visar alla olika meddelandena.
Så när får man flera meddelanden? Jag kan tänka mig att man bygger ett program och själv genererar ett OdbcException som man fyller med en bunt med error, eller att man i en catchblock tar emot en OdbcException.Errors(0), svarar med att försöka göra en ny SQL sats, fångar ett nytt fel där och stoppar in även det felet i den första felsamlingen... lol, men vad är poängen med det?
Kort sagt, varför har vi "oException.Errors(0).SQLState" och inte enbart "oException.SQLState" ?
Exempelkod:
oConnection = New OdbcConnection(sDSN)
oCommand = New OdbcCommand("", oConnection)
Try
oCommand.CommandText = "SELECT * FROM TableName WHERE KolumnName = 1"
oReader = oCommand.ExecuteReader
Catch ex As OdbcException
If ex.Errors(0).SQLState = "42S02" Then
'Tabellen finns inte
bTableExists = False
End If
End TrySv: OdbcException.Errors(0)
När det gäller ODBC så kommer ju det från underliggande DB-drivers som oftast inte alls har någonting med .Net att göra.. Då är det väl typ en Feature att dessa komponenter kan presentera en lista på flera st fel som har inträffat i kontakt med databasen.
Det är väl inte så ovanligt i SQL att man skickar en batch med SQL-kommandon, då kan jag tänka mig att Errors-listan kan ge ett fel per SQL-instruktion som skickats över till DB. Om detta antagande stämmer, så verkar ju den här konstruktionen klart användbar :)