• 接口在ADO.NET中的应用("provider模式")


      当我们在连接MSSQLSEVER的时候,一般都是  SqlConnection con = new SqlConnection(ConStr);这样的格式格式来创建连接字符串的,

    这是时候我们我们似乎感觉他很方便。但是突然那一天你的老板给你给一个Oracle的备份数据库,你是不是还要 OracleConnection con= new OracleConnection(conStr);又突然老板突发奇想,觉得数据量也不大,而且ACCESS2010还蛮潮流的,你给我换成ACCESS要我哪里都可以直接打开,你是否又要OleDbConnection conn = new OleDbConnection(conStr);刚做好了突然老板说客户需要DB2了,这孩子终于按耐不住了,这不是折腾人么#·¥%&¥……

    于是乎,他就想了想.NET的思想就是提供统一的规范化来管理一切对象,那么我们就来追踪一下本源,从源头上来解决问题

    他就开始这样查看:

    他发现IDbConnection接口已经提供了我们通常所需要的基本的方法。

    看到这里他想到了利用类型转化(将一个接口变量指向实现接口的类的一个实例,当然这个也可以书面的第一位隐式转化的部分内容)

    那么我还需要这样:

    OleDbConnection Code
    1 // Assumes connectionString is a valid connection string.
    2 using (OleDbConnection connection = 
    3   new OleDbConnection(connectionString))
    4 {
    5     connection.Open();
    6     // Do work here.
    7 }

    或者:

    OdbcConnection Code
    1 // Assumes connectionString is a valid connection string.
    2 using (OdbcConnection connection = 
    3   new OdbcConnection(connectionString))
    4 {
    5     connection.Open();
    6     // Do work here.
    7 }

    或者:

    OracleConnection Code
     1 // Assumes connectionString is a valid connection string.
     2 
     3 using (OracleConnection connection = 
     4 
     5   new OracleConnection(connectionString))
     6 
     7 {
     8 
     9     connection.Open();
    10 
    11     // Do work here.
    12 
    13 }
    14 
    15 OracleConnection nwindConn = new OracleConnection("Data Source=MyOracleServer;Integrated Security=yes;");
    16 
    17 nwindConn.Open();

     

    事实证明完全可以省略这些繁琐的步骤。

    我们现在只需要这样:

    IDbConnection conn= new OracleConnection(conStr);

    IDbConnection conn= new new OleDbConnection(conStr);

    IDbConnection conn= new SqlConnection(ConStr);

    是不是感觉依旧繁琐呢,因为先还没有直观的展示给大家,现在我们就上代码,来展示下他的优点:

     1 using System;
     2 using System.Configuration;
     3 using System.Data.OleDb;
     4 using System.Data;
     5 using System.Data.SqlClient;
     6 using System.Data.OracleClient;
     7 
     8 namespace IFADO
     9 
    10 {
    11     class Program
    12     {
    13         static void Main(string[] args)
    14         {
    15             string conStr = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString;
    16             string privider = ConfigurationManager.ConnectionStrings["conStr"].ProviderName;
    17             IDbConnection conn;
    18             switch (privider)
    19             {
    20                 case "Access": conn = new OleDbConnection(conStr); break;
    21 
    22                 case "SQLSever": conn = new SqlConnection(conStr); break;
    23 
    24                 case "Oracle": conn = new OracleConnection(conStr); break;
    25 
    26                 default: throw new Exception("未找到合适的数据库,请扩展!);
    27             }
    28           using(conn)
    29 
    30           {
    31                 conn.Open();
    32                 using (IDbCommand cmd = conn.CreateCommand())
    33                 {
    34                     cmd.CommandText = "SELECT * FROM Test_TableORDER BY Test_Table.ID DESC";
    35 
    36                     cmd.ExecuteNonQuery(); 
    37                 }
    38                 Console.WriteLine("完成查询!");
    39 
    40                 Console.ReadKey();
    41             }
    42         }
    43     }
    44 }

    此时我们操心的只有配置文件中的ProviderName节点的值了,但是我们可以放心的扩展数据库,而不用担心他是否会正常执行。

     

     

  • 相关阅读:
    学习鸟哥linux私房菜--安装中文输入法fcitx
    学习鸟哥linux私房菜--安装centos5.6(u盘安装,中文乱码)
    CSS
    vue-cli脚手架搭建项目及Axios封装
    前端面试题套路
    移动端touch事件
    import和require的区别
    接口封装
    js 数组操作
    vue 小记
  • 原文地址:https://www.cnblogs.com/rohelm/p/2468279.html
Copyright © 2020-2023  润新知