Exception handling in LINQ to SQL

I’ve been doing stuff with LINQ to SQL for a while now and there’s one thing that keeps bugging me: Proper exception handling. IMHO LINQ to SQL should encapsulate the database. I mean, I don’t care which database (SQL Server, Oracle, whatever) I’m working with, but if I call SubmitChanges on the DataContext, I’ll get a SqlException if it fails on the database. I know that currently LINQ to SQL only supports SQL Server, but the model is just as valid for any other (relational)database. To my surprise there is no LinqException or something that encapsulates the SqlException, so now I have to write code that is aware of the fact that I’m dealing with SQL. You can of course solve this by using the Exception Handling Application Block, so you don’t deal with specific exceptions in code, but it still feels funky.

2 thoughts on “Exception handling in LINQ to SQL

  1. Boah

    Michiel,

    Heb je ook een idee hoe je linq exceptions kan onderscheiden/handig afvangen. Ik heb bijvoorbeeld een veld in mijn tabel waarin ik unieke waarden opsla. Dubbele gegevens mag dus niet, doe je het wel dan volgt een exception. Hoe kan ik zo’n exception het beste afvangen? Eerst een functie schrijven of de waarde al bestaat? En dat voor ieder uniek veld/tabel? Of kan dat ook ineens/handiger?

    Bedankt!

    Reply
  2. Michiel

    Boah,

    Wat ik nu gedaan heb is een base class gemaakt voor interacties met LINQ. Hierin zit o.a. een SubmitChanges methode die SqlExceptions afvangt en een eigen exception teruggeeft. Iedere business class die wijzigingen doet op LINQ data is gebaseerd op die base class en roept niet de DataContact.SubmitChanges, maar de eigen SubmitChanges aan. In de base class zit dus alle exception handling logica en daar zou je dus bijvoorbeeld kunnen controleren of een exception gegooid is omdat er dubbele waardes zijn. Die check hou je "gewoon" in de key/index instelling van je tabel.

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *