关于ADO.NET设计模型上的困惑?
我刚刚接触ADO.NET,对这个新的数据访问模型的设计思路有一些疑惑,希望已经体会到其中真味的朋友给点指点。
ADO.NET为什么没有像ADO一样提供一组"接口模型",而是直接把类暴露给开发者。这样一来,我们写的程序不得不针对不同数据库"硬编码",就像:
OracleConnection conn;
OracleCommand cmd;
...
SqlConnection conn;
SqlCommand cmd;
然而以上代码,除了类名不同以外,语句基本上没什么区别,类似如下:
conn.open();
reader = cmd.executeReader(...)
...
conn.Close();
虽然只有类名不同,但是为了支持不同的数据库,代码也要被迫写多遍。而原来的ADO则不强迫你硬编码数据库的类型,只是在ConnnectionString的provider中设的OLEDB的driver不同。ADO.NET为什么不再多加入一个类似JDBC中的DriverManager类,输入不同的Provider字符串返回具体connection类的接口呢。.NET具有那么强大的Assembly动态分析加载功能,做这个不是小菜一碟吗?
当然,针对不同数据库,Data Access Layer的类实现起来肯定会不一样的,尽量发挥而不是抹煞各个数据库的特色,是Data Access Layer的职责。那么针对Oracle的实现里用OracleConntion...,针对SqlServer的实现用SqlConntion如此这般就成了顺理成章的事,即使在接口模型上统一了代码,到具体实现还是要分开(比如SQL语句不同,表的设计不同),那上面说的接口模型好像意义也不大了,PetShop3和Duwamish就是这么设计的DAL。可是这里有一个问题,就是选择设计模型的自由没有了,你被强迫使用区别对待的模型(ADO.NET),而不能用风格统一的接口模型(像ADO,JDBC的模型),而后者的自由在于你即可以用统一风格也可以区别对待。比如,SQL Server的日期字段是这样操作:
... WHERE create_date='2003-07-08'
Oracle的是这样
... WHERE create_date=to_date('2003-07-08','yyyy-mm-dd')
假如对这个字段的操作只有写入和取出打印,那我就想模糊这种区别,统一用varchar。
在ADO.NET中你就没的选择,只有写两遍:
OracleConnection conn...
SqlConnection conn...
而在ADO或JDBC中你只需写一遍:
Connection conn
以前用MFC,ATL以及其它的MS的framework时,总感觉不是特别舒服,觉得微软的东西挺实用,但在设计上总是差了那么一点。现在推出的.NET是微软精心打造的,说是为了未来十年设计的.ADO.NET又是重新设计的,可是,不会在现在开发中就这么不顺手吧。
盼望高人指点
ADO.NET为什么没有像ADO一样提供一组"接口模型",而是直接把类暴露给开发者。这样一来,我们写的程序不得不针对不同数据库"硬编码",就像:
OracleConnection conn;
OracleCommand cmd;
...
SqlConnection conn;
SqlCommand cmd;
然而以上代码,除了类名不同以外,语句基本上没什么区别,类似如下:
conn.open();
reader = cmd.executeReader(...)
...
conn.Close();
虽然只有类名不同,但是为了支持不同的数据库,代码也要被迫写多遍。而原来的ADO则不强迫你硬编码数据库的类型,只是在ConnnectionString的provider中设的OLEDB的driver不同。ADO.NET为什么不再多加入一个类似JDBC中的DriverManager类,输入不同的Provider字符串返回具体connection类的接口呢。.NET具有那么强大的Assembly动态分析加载功能,做这个不是小菜一碟吗?
当然,针对不同数据库,Data Access Layer的类实现起来肯定会不一样的,尽量发挥而不是抹煞各个数据库的特色,是Data Access Layer的职责。那么针对Oracle的实现里用OracleConntion...,针对SqlServer的实现用SqlConntion如此这般就成了顺理成章的事,即使在接口模型上统一了代码,到具体实现还是要分开(比如SQL语句不同,表的设计不同),那上面说的接口模型好像意义也不大了,PetShop3和Duwamish就是这么设计的DAL。可是这里有一个问题,就是选择设计模型的自由没有了,你被强迫使用区别对待的模型(ADO.NET),而不能用风格统一的接口模型(像ADO,JDBC的模型),而后者的自由在于你即可以用统一风格也可以区别对待。比如,SQL Server的日期字段是这样操作:
... WHERE create_date='2003-07-08'
Oracle的是这样
... WHERE create_date=to_date('2003-07-08','yyyy-mm-dd')
假如对这个字段的操作只有写入和取出打印,那我就想模糊这种区别,统一用varchar。
在ADO.NET中你就没的选择,只有写两遍:
OracleConnection conn...
SqlConnection conn...
而在ADO或JDBC中你只需写一遍:
Connection conn
以前用MFC,ATL以及其它的MS的framework时,总感觉不是特别舒服,觉得微软的东西挺实用,但在设计上总是差了那么一点。现在推出的.NET是微软精心打造的,说是为了未来十年设计的.ADO.NET又是重新设计的,可是,不会在现在开发中就这么不顺手吧。
盼望高人指点
...全文
相关推荐
ADO.NET实体数据模型详细介绍
这一模型简化了数据访问层的开发,提高了代码的可读性和可维护性。在ADO.NET实体数据模型中,数据库表被映射为类(实体类),表中的行则对应为类的实例。
趣味理解ADO.NET对象模型
ADO.NET是微软为.NET框架设计的一种强大的数据库访问技术,它为开发者提供了面向对象的方式来处理数据库交互。ADO.NET的核心目标是实现高效、灵活且可靠的数据库应用程序开发。
ADO与ADO.NET
ADO.NET概述:ADO.NET则是.NET Framework的一部分,它采用了全新的数据访问模型,不再依赖于COM。
ADO及ADO.NET结构图
**事件驱动**:ADO.NET支持事件驱动编程,允许在数据更改时触发事件。4. **编程模型**:ADO.NET提供了更现代、面向对象的编程模型。5.
ADO.NET觀念探討
### ADO.NET概念详解#### 一、ADO.NET概述ADO.NET是Microsoft为.NET框架设计的一个数据访问技术,它提供了一种高效的方式来处理数据库中的数据。


