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

标签 .net ado.net dataprovider

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

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

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.

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

关于.net - ADO.NET 中是否有工厂方法来获取参数标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14529962/

相关文章:

c# - DbProviderFactory 失败

flex3 - 弹性 3.5.0;在数据提供程序更改时更新 ComboBox 显示列表

search - yii2 一个 GridView 的搜索正在影响其他 GridView

c# - 为什么 .NET 异步等待文件复制比同步 File.Copy() 调用消耗更多 CPU?

.net - 有人可以给世界自然基金会一个很好的教程吗?

c# - 如何使用 C# 和 ADO.NET 查询具有 SDO_GEOMETRY 类型空间列的 Oracle 表?

c# - 如何使用 Visual C# 连接到远程 SQL Server 数据库?

mysql - SSMS 中的 SSIS 包 - ADO NET 源无法获取连接 - 无法创建托管连接管理器

c# - 如何编写自定义 POCO 序列化器/反序列化器?

c# - 为什么这个 .dll 在 ILSpy 中有奇怪的字母?