Ne znam koliko ti ovo resenje igra, ali mozes da iskoristis ODBC.NET data provider i u data layeru iskoristis OdbcConnection, OdbcCommand, OdbcDataAdapter i ostale klase iz System.Data.Odbc namespace-a, u zavisnosti od potrebe.
ODBC connection stringovi ce ti se razlikovati za razlicite engine, ali ce tvoj kod biti isti u svim slucajevima jer ce native ODBC drajver za bazu raditi neophodne konverzije, dakle ne treba ti engine specific instanciranje, interfejsi i ostala cudesa. Sve baze koje si pomenuo plus jos drugih imaju svoje ODBC drajvere.
Naravno ovo sve pod uslovom da je ODBC standard dovoljan za tvoje potrebe, posto on radi svodjenje baza na najveci zajednicki delilac

i ne daje neke specificnosti koje native .NET drajveri daju. ALi ako se tvoje potrebe svode na select/insert/update/delete onda moze da ti odradi posao.
▪ When the only tool you know how to use is a hammer every problem begins to look like a nail
▪ "Gladni stolećima, kupujemo više hleba nego što nam je potrebno. A, onda ga bacamo. Hleb u đubretu nije dobar prizor. On sluti na zlo. I zlo dolazi" - Momo Kapor
▪ "Opportunity is missed by most because it is dressed in overalls and looks like work" - Thomas Edison