不幸的是,恕我直言,DbProviderFactory 机制设计得很糟糕。机制本身不可扩展,所有有趣的类都是密封的(SqlClientFactory 等),.config 文件中的配置也不可扩展。
一个简单的解决方案是构建一个扩展类,如下所示:
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;
} // etc...
parameter.ParameterName = name;
return parameter;
}
}
这不是很聪明,但您可以在代码中执行此操作:
DbProviderFactory factory = DbProviderFactories.GetFactory("MyDb");
DbParameter parameter = factory.CreateParameter("myParam");
// parameter.ParameterName will be @myParam if SQL, etc.
或者您也可以重新创建自己的系统。这不是很复杂,如果您需要每种类型的数据库的其他变量项,它可能是值得的。