There is one thing in ADO.NET that just irks me, and well its not by .NET design. During a lot of our Business Logic methods in our projects at work, we have to call Insert, Update, and Select procedures from SQL Server. Of course, the proper way of doing this is by wrapping your logic in a transactional support manner... no biggie, we've got this working, and I might add, it works SUPERBLY! Well, that is, if you remember that each call to the database while in a transaction must use the same connection and transaction.
I'm not really sure how many times I've done this, but there's been a few that I'm aware of, one of which was today. The BLL method calls some Inserts, some Updates, then it needs to retrieve some data to do more Inserts and Updates. Well, for that 1 select query I ran, I forgot to pass in the connection and transaction objects. I couldn't figure out why the app was just hanging time and time again until it dawned on me. Yup, thats right...it was a good smack my head kinda realization.
So I guess the point of this rant is if you're using .NET transactional support with databases, make sure that every call to the database has the same connection and transaction object, otherwise you'll spend a good half hour to hour banging your head against the wall and blaming the SQL Architect that his Stored Procedure is causing the problems...only to find out, you're missing a few extra parameters! Arrh!