LINQ to SQL的不足
LINQ to sql虽然将数据库操作和业务逻辑隔离开来,使开发人员能够使用单一的语言和知识能够方便的操作数据库并处理业务逻辑。但是这毕竟是微软O/R解决方案的第一个版本,相比相对成熟的DataSet数据集解决方案来说,我们还是可以看到一些不足。
首先,我们注意到所有的数据实体并没有从一个基类中派生,这使得给开发通用的数据实体操作器带来了不便。相对于强类型数据集都从DataSet基类派生,笔者认为数据实体这样做并不是一个很好办法。因为我们可以从DataTable的Columns集合中枚举某张数据库表中的所有字段,却不能够从某个数据实体中枚举该数据库表的所有字段。虽然我们可以通过使用反射的方法获得,但是这样显然并不好。
同理,DataContext也没有提供一个获得所有数据实体的集合的方式,我们无法获得一个DataContext中所有的数据实体,与此相对应的是,即便是强类型数据集,我们也能够通过Tables属性获得该数据集中所有的数据表。
一个典型的例子就是,在笔者的上一本书《ASP.NET 2.0网站开发技术详解》中,提到了一个在多服务器部署的N层应用程序解决方案中实现的中间层数据缓存的项目。在该项目中,就是通过枚举内容中驻留的数据集的数据表的方式来确定某张数据库表中的数据是否被缓存(当然还通过了其他一系列的方法来判断),而如果使用LINQ to sql,这样一个通用的数据缓存方案就很难实现了。
同样,如果希望开发一个快速开发平台,通过配置的方式来实现数据的呈现和处理,比如希望通过配置XML文件来控制实现GridView列表或者Edit详细界面显示的字段的话,目前版本的LINQ to SQL便无法实现了。
再如,假设有这么一个需求,需要查询指定数据库表中某个数据类型为字符串型的字段含有某个指定值的记录,那么使用LINQ to SQL实现也会比较困难。
另外,我们知道DataSet数据集中还有一个数据版本的概念,一共有Original、Current、Proposed、Default四种版本,我们在对数据进行操作时可以根据数据行的不同版本值以及其他条件决定是否对数据进行更新,也即AcceptChanges或RejectChanges。而在LINQ to SQL中,要获得实体数据的变更却非常麻烦,必须使用DataContext的GetChangeSet方法来获得,而且获得的变更集能够提供的信息也实在太有限,要对某一具体数据取消更新也很困难,基本上可以认为是不可能的。
所以,当我们在考虑使用数据集方式还是LINQ to SQL实体对象模型来操作数据库的时候应当充分考虑以上情况并结合
相关文档:
SQL2005中row_number( )、rank( )、dense_rank( )、ntile( )函数的用法(2) 收藏
SQL server 2005新增的几个函数,分别是row_number( )、rank( )、,DENSE_RANK( )、ntile( )下面以实例分别简单讲解。
1.row_number( )
先来点数据,先建个表
SET NOCOUNT ......
1.需要一种下载卸载工具,这里选择微软官方提供的工具(msicuu2.exe)
http://support.microsoft.com/default.aspx?kbid=290301
2.使用卸载工具卸载所有SQL Server服务和相关组件(注意:卸载前要先停止对应的服务,否则可能卸载失败)
3.删除C:\WINDOWS\inf 下所用文件(我是在该文件夹下搜索&ldquo ......
1用于排序的函数
row_number()
rank()
dense_rank()
ntile(group_number)
下面列举这个函数的用法:
row_number()函数一般用于组内排序,而其他三个函数是对结果集排序
例子:分页排序
<!--注意全局变量也在这里声明,并用逗号隔开-->
create proc MyDividePageSort @iRowCount int ,@iPageNo int
AS
< ......
关于两表关联的update,但语句怎么写都不正确,老是报错,于是心惊肉跳(就怕不能及时完成操作)去查了一下,NND,原来把SQL写成了在SQL Server下面的特有形式,这种语法在Oracle下面是行不通的,急忙改回来,及时完成了任务。顺便也把查到的SQL帖出来,哪天再忘记了,也好在这里找回来:
update customers a ......
---------数学函数
1.绝对值
S:select abs(-1) value
O:select abs(-1) value from dual
2.取整(大)
S:select ceiling(-1.001) value
O:select ceil(-1.001) value from dual
3.取整(小)
S:select floor(-1.001) value
O:select floor(-1.001) value from dual
4.取整(截取)
S:select cast(-1.002 as int) v ......