我正在使用ADO.NET接口来创建一个独立于数据库的程序.工厂接受提供程序名称并返回实现ADO接口的供应商特定对象.这很棒.
但我找不到标识参数的标志的工厂.
string paramName = "@foo"; //flag "@" for sql server
string paramName = ":foo"; //flag ":" for oracle
问题:ADO.NET是否提供了获取标志的工厂方法?我可以为此推出我自己的独立工厂,但它会限制我预定义的提供商列表;击败了提供商工厂的大部分好处.
最佳答案 不幸的是,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.
或者您也可以重新创建自己的系统.这并不是很复杂,如果每种类型的数据库需要其他可变项,那么它是值得的.