51代码网ORACLEMYSQLSQL SERVER其它数据库java/jspasp/asp.netC/C++/VC++APP应用其它语言服务器应用
您现在的位置: 51代码网 >> oracle >> 文章正文

如何实现多个数据库连接

更新时间:2012-1-3:  来源:51代码网

我们看SQLConnection和OleDbConnection的父类的时候都看到了他继承了DdConnection这个类

1.public sealed class OleDbConnection : DbConnection, ICloneable, IDbConnection, IDisposable

2.public sealed class SqlConnection : DbConnection, ICloneable

再看 DbConnection,实现了IDbConnection的接口。
3.public abstract class DbConnection : Component, IDbConnection, IDisposable

所以我们就可以用接口来指向我们的子类


view plaincopy to clipboardprint?string connstr= ConfigurationManager.ConnectionStrings["connstr"].ConnectionString; 
        string proName=ConfigurationManager.ConnectionStrings["connstr"].ProviderName; 
        IDbConnection conn; 
        if (proName == "Access") 
        { 
            conn = new OleDbConnection(connstr); 
        } 
        else if (proName == "Sql") 
        { 
            conn = new SqlConnection(connstr); 
        } 
        else 
        { 
            throw new Exception("没有选择对应的数据库吧"); 
        } 
        conn.Open(); 
        using (IDbCommand cmd = conn.CreateCommand())//体现接口,调用的是OleDbCommadn或者SqlCommand  
        { 
            cmd.CommandText = "insert into T_Person(Name,Age) values('李艳',22)"; 
            cmd.ExecuteNonQuery(); 
            MessageBox.Show("成功"); 
        } 
    string connstr= ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;
            string proName=ConfigurationManager.ConnectionStrings["connstr"].ProviderName;
            IDbConnection conn;
            if (proName == "Access")
            {
                conn = new OleDbConnection(connstr);
            }
            else if (proName == "Sql")
            {
                conn = new SqlConnection(connstr);
            }
            else
            {
                throw new Exception("没有选择对应的数据库吧");
            }
            conn.Open();
            using (IDbCommand cmd = conn.CreateCommand())//体现接口,调用的是OleDbCommadn或者SqlCommand
            {
                cmd.CommandText = "insert into T_Person(Name,Age) values('李艳',22)";
                cmd.ExecuteNonQuery();
                MessageBox.Show("成功");
            }
接口只是指向具体的对象,调用的方法还是SQlconnection,sqlCommand.的.
只要修改配置文件,就能实现多个数据库的链接是不是很方便呢.?

 

接口和抽象类不能到底有什么区别呢?

2.override实现多态

真正的多态使用override来实现的。回过去看前面的例1,在基类Animal中将方法Eat()用virtual标记为虚拟方法,再在派生类Cat和Dog中用override对Eat()修饰,进行重写,很简单就实现了多态。需要注意的是,要对一个类中一个方法用override修饰,该类必须从父类中继承了一个对应的用virtual修饰的虚拟方法,否则编译器将报错。

 

好像讲得差不多了,还有一个问题,不知道你想没有。就是多层继承中又是怎样实现多态的。比如类A是基类,有一个虚拟方法method()(virtual修饰),类B继承自类A,并对method()进行重写(override修饰),现在类C又继承自类B,是不是可以继续对method()进行重写,并实现多态呢?看下面的例子。

 

例3:

 

代码
public class Animal
    {
        public virtual void Eat()
        {
            Console.WriteLine("Animal eat");
        }
    }

    public class Dog : Animal
    {
        public override void Eat()
        {
            Console.WriteLine("Dog eat");
        }
    }

    public class WolfDog : Dog
    {
        public override void Eat()
        {
            Console.WriteLine("WolfDog eat");
        }
    }

    class Tester
    {
        static void Main(string[] args)
        {
            Animal[] animals = new Animal[3];

            animals[0] = new Animal();
            animals[1] = new Dog();
            animals[2] = new WolfDog();

            for (int i = 0; i < 3; i++)
            {
                animals[i].Eat();
            }
        }
}

复制代码
 

     运行结果为:

Animal eat...

Dog eat...

WolfDog eat...

 

在上面的例子中类Dog继承自类Animal,对方法Eat()进行了重写,类WolfDog又继承自Dog,再一次对Eat()方法进行了重写,并很好地实现了多态。不管继承了多少层,都可以在子类中对父类中已经重写的方法继续进行重写,即如果父类方法用override修饰,如果子类继承了该方法,也可以用override修饰,多层继承中的多态就是这样实现的。要想终止这种重写,只需重写方法时用sealed关键字进行修饰即可。

 

 

3. abstract-override实现多态

先在我们在来讨论一下用abstract修饰的抽象方法。抽象方法只是对方法进行了定义,而没有实现,如果一个类包含了抽象方法,那么该类也必须用abstract声明为抽象类,一个抽象类是不能被实例化的。对于类中的抽象方法,可以再其派生类中用override进行重写,如果不重写,其派生类也要被声明为抽象类。看下面的例子。

[1] [2] 下一页

  • 上一篇文章:
  • 下一篇文章: 没有了
  • 赞助商链接
    推荐文章
  • 此栏目下没有推荐文章
  • {
    设为首页 | 加入收藏 | 友情链接 | 网站地图 | 联系站长 |