ADO.NET中是否有工厂方法来获取参数标志?

我正在使用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.

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

点赞