none
DbProviderFactory.CreateParameter() 问题 RRS feed

  • 问题

  • DbProviderFactory.CreateParameter() 问题

    private DbProviderFactory dbProviderFactory;
    public DbParameter CreateParameter(string parameterName, DbType dbType, string value) {
       DbParameter dbParameter = dbProviderFactory.CreateParameter();// 这句话不大清楚!一定要使用这个吗?
       // DbParameter dbParameter =new DbParameter();// 这样只跟上一句有什么区别啊?
       dbParameter.ParameterName = parameterName;
       dbParameter.DbType = dbType;
       dbParameter.Value = value;
       return dbParameter;
      }

    2010年4月27日 14:18

答案

  • 首先注意到,DbParameter 是一个抽象类,无法通过 new DbParameter(); 直接创建 DbParamter 对象的,
    DbParameter 是不与具体的数据库提供者相关的,而 SlqParameter,OracleParamter 等继承 DbParameter,表示具体数据库的实现
    类似 DbParameter 这种实现的,还有 Connection, Command 等,

    通过 DbProviderFactory 实际上也是一个抽象类,定义了如何创建上面提到的这些对象,在具体的数据库实现中比如 MySqlDbProvider 的 CreateCOnnection 方法就会创建 MySqlConnection 这种特定于 MySql 数据库的 Connection

    通过 dbProviderFactory.CreateParameter(); 这样的方法创建对象,而不是直接 new,实现了多数据库的支持,你只要在配置文件中,指定那种类型的 dbProviderFactory 就可以了切换数据库了,避免了 MySlqParameter p = new MySlqParameter() 的代码,因为这样你的数据访问层直接与具体的数据库耦合了

    详细参考 DbProviderFactory (ADO.NET) http://msdn.microsoft.com/zh-cn/library/wda6c36e(VS.90).aspx

    另外,实际上这里是一个抽象工厂模式的运用,在软件设计方面,设计模式应用得很广泛,也被大师们研究得比较透彻了,网上有很多文章可参考,比如 抽象工厂模式 http://baike.baidu.com/view/1580269.htm?fr=ala0_1

    慢慢消化,如果没实战经验,初次接触设计模式会比较迷糊


    问题要简单,错误须详细@错误/异常/堆栈信息+操作系统+软件版本+all the context of the issue Hope Helpful | http://www.leoworks.net
    • 已标记为答案 Money.Live 2010年4月27日 15:44
    2010年4月27日 14:48