Unfortunately, the DbProviderFactory mechanism is very poorly designed by IMHO. The mechanism itself is not expandable, all interesting classes are sealed (SqlClientFactory, etc.), the configuration in the .config file is also not extensible.
One simple solution is to build an extension class, for example:
public static class DbProviderFactoryExtensions { public static DbParameter CreateParameter(this DbProviderFactory factory, string name) { DbParameter parameter = factory.CreateParameter(); if (factory.GetType().FullName.IndexOf("sqlclient", StringComparison.OrdinalIgnoreCase) >= 0) { name = "@" + name; } else if (factory.GetType().FullName.IndexOf("oracle", StringComparison.OrdinalIgnoreCase) >= 0) { name = ":" + name; }
This is not very smart, but you can do it in your code:
DbProviderFactory factory = DbProviderFactories.GetFactory("MyDb"); DbParameter parameter = factory.CreateParameter("myParam"); // parameter.ParameterName will be @myParam if SQL, etc.
Or you can also recreate your own system. This is not very complicated and may be worth it if you need other variables for each type of database.
source share