使用System.Data.Common.DbConnection;第一个
直接使用 DbConnection db=new DbConnection()是错误的。
但是使用 DbConnection db=new SqlConnection()这样是可以的。
为什么是这样的?不是说没有实现接口的类是不能实例化的吗?
这样的原理是不是类似于,父类和子类继承的关系? 因为SqlConnection是继承于DbConnection
所以DbConnection类型的变量可以用SqlConnection类实例化?第二个
同样还有一个函数public void init(DbConnection db)
1.在这里只是定义了一个DbConnection 类型的变量,并未实例化,所以是可以的?
他期待的应该是已经被实例化的一个变量传进来,比如说SqlConnection的或者是OracleConnection的凡是实现IDbConnection接口的都可以的.一旦变量传进来以后这个db就是传进来那个变量的类型,而不是DbConnection变量的类型了?2.如果定义DbTransaction trans= conn.BeginTransaction(); 这个trans应该是传进来SqlConnection.BeginTransaction()所创建的SqlTransaction类型数据。请问我这样理解对吗?
直接使用 DbConnection db=new DbConnection()是错误的。
但是使用 DbConnection db=new SqlConnection()这样是可以的。
为什么是这样的?不是说没有实现接口的类是不能实例化的吗?
这样的原理是不是类似于,父类和子类继承的关系? 因为SqlConnection是继承于DbConnection
所以DbConnection类型的变量可以用SqlConnection类实例化?第二个
同样还有一个函数public void init(DbConnection db)
1.在这里只是定义了一个DbConnection 类型的变量,并未实例化,所以是可以的?
他期待的应该是已经被实例化的一个变量传进来,比如说SqlConnection的或者是OracleConnection的凡是实现IDbConnection接口的都可以的.一旦变量传进来以后这个db就是传进来那个变量的类型,而不是DbConnection变量的类型了?2.如果定义DbTransaction trans= conn.BeginTransaction(); 这个trans应该是传进来SqlConnection.BeginTransaction()所创建的SqlTransaction类型数据。请问我这样理解对吗?
解决方案 »
- C# webBrowser抓取验证码图片代码不执行
- C#如何模拟键盘输入?(题目长点醒目些啊醒目些)
- 想要从数据库中存取图片的源代码,两个函数就够了
- 请问怎么将textbox(已与数据库绑定)中的数据更新保存到数据库中?
- 讨论:如何创建类似于MSN、QQ这样的网络聊天工具?有经验者请进。
- 大虾们,小弟郁闷呀!求助
- 窗体的调用
- 小女子请教三位数全排列算法
- 如果是你,你会怎么做??~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~``
- 怎么样替换换行符?
- 学习C#的困惑,希望高手来指点方向
- C#发布软件的问题
DbConnection实现了IDbConnection接口,做为所有Connection的父类来使用.
但它并不提供一个共有构造函数,也就是不可以实例化.
但他是SqlConnection是DbConnection的子类,从面向对象的角度来说SqlConnection的对象是可以给DbConnection的.第二个问题
当一个子类对象付值给父类时,
表面上它是变成了父类,但在空间上它还是子类的对象,通过强制的类型转换还是可以转换为子类的.
这时父类调用的其实是子类的方法
public abstract class DbConnection : Component, IDbConnection, IDisposable
继承层次是这样的:
System.Object
System.MarshalByRefObject
System.ComponentModel.Component
System.Data.Common.DbConnection
System.Data.Odbc.OdbcConnection
System.Data.OleDb.OleDbConnection
System.Data.OracleClient.OracleConnection
System.Data.SqlClient.SqlConnection
System.Data.SqlServerCe.SqlCeConnection DbConnection 是抽象类,这就决定了它不能被实例化。System.Data.Odbc.OdbcConnection ,System.Data.OleDb.OleDbConnection , System.Data.OracleClient.OracleConnection ,System.Data.SqlClient.SqlConnection , System.Data.SqlServerCe.SqlCeConnection 都继承自DbConnection ,也就是说他们都“是”DbConnection。所以在接受DbConnection类型参数 的地方,你都可以传递这几个类的实例。第一个:
直接使用 DbConnection db=new DbConnection()是错误的。 //抽象类不能被实例化
但是使用 DbConnection db=new SqlConnection()这样是可以的。 //子类的实例赋值给父类第二个:
public void init(DbConnection db) “比如说SqlConnection的或者是OracleConnection的凡是实现IDbConnection接口的都可以的.”这句话不对,init(DbConnection db) 方法接受一个DbConnection类型的参数,DbConnection实现了IDbConnection接口。 在需要子类的地方,不能直接用父类或父接口替换。你可以自己写一个实现凡是实现IDbConnection接口的类,直接传递给这个init(DbConnection db) 编译器会报错。
改成 init(IDbConnection db),那就“凡是实现IDbConnection接口的都可以”。2.这样理解是对的。
private void button10_Click(object sender, EventArgs e)
{
DbConnection dbConn = new SqlConnection();
System.Console.WriteLine("dbConn is SqlConnection ? " + (dbConn is SqlConnection));
System.Console.WriteLine("dbConn is DbConnection ? " + (dbConn is DbConnection));
System.Console.WriteLine("dbConn is IDbConnection ? " + (dbConn is IDbConnection));
//.....设置连接串等
DbTransaction trans = conn.BeginTransaction();
System.Console.WriteLine("trans is SqlTransaction ? " + (trans is SqlTransaction));
System.Console.WriteLine("trans is DbTransaction ? " + (trans is DbTransaction));
}
输出:
conn is SqlConnection ? True
conn is DbConnection ? True
conn is IDbConnection ? True
trans is SqlTransaction ? True
trans is DbTransaction ? True