4

我正在使用 ADO.NET 接口来创建一个独立于数据库的程序。工厂接受提供者名称并返回实现 ADO 接口的供应商特定对象。这很棒。

但是我找不到标识参数的标志的工厂。

string paramName = "@foo"; //flag "@" for sql server

string paramName = ":foo"; //flag ":" for oracle

问题:ADO.NET 是否提供工厂方法来获取标志?
我可以为此推出自己的独立工厂,但这会将我限制在预定义的提供者列表中;打败了提供者工厂的大部分好处。

4

1 回答 1

2

不幸的是,恕我直言,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.

或者您也可以重新创建自己的系统。这不是很复杂,如果您需要每种类型的数据库的其他变量项,它可能是值得的。

于 2013-01-30T09:56:53.687 回答