【问题标题】:Is there a factory method in ADO.NET to get the parameter flag?ADO.NET 中是否有工厂方法来获取参数标志?
【发布时间】:2013-01-25 20:35:25
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: .net ado.net dataprovider


    【解决方案1】:

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

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

    【讨论】:

    • 您的回答证实了我的担忧,即我不会获得我正在寻找的 OO 可扩展性。如果没有其他回复,我会接受这个作为答案。
    猜你喜欢
    • 2011-05-08
    • 2021-12-05
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多