使用多种数据库(一)Access问题



这个是ado oledb驱动的老问题了,传入参数必须按sql中参数出现的顺序,sql不会有这样的问题。不过在ado.net下面,除了sqlserver就都难以 避免了,不过好在,一般使用框架时如果sql是由程序动态构造的一般不会出现参数顺序不一致,我原来被这个问题折腾也是在测试用例中:)当时查了一下才发 现真的是一个很早就广为流传的问题了,并且不是bug,而是因为oledb支持通用的db,但有很多db本身识别参数的时候不按名称只按顺序的,所以也是 没办法的。

其实还有另一个问题:
在sqlserver中:select * from table where param1 = @p1 and param2 = @p2 and param3 = @p1
@p1=1
@p2=2
是完全没问题的

但是如果对oledb驱动就不行了,必须以三个参数对待,同样是因为oledb只按参数索引顺序,不按名称来为参数赋值。


 谈到sql语法差异,我再说两点access和sqlserver中的不同,希望对你所有帮助:

一个是access不支持select top 0 from table这样的语句,注意top后面的数字不能是0,如果大于0没问题,但是sqlserver下是没问题的。发现这个问题是在我的一个基于代码生成的 框架中自动通过形如select columns from table这样的简单语句为每个实体类生成形如select top {0} ... where not in (select top {1}...)...这样的通用分页查询语句,当区第一页数据的时候,not in 后面的top {1}中,{1}将会是0,这时access就会报错,所以最后对取第一页的情况我只能区别对待。

再一个是像select * from (select * from table)这样的语法,在access下没问题,在sqlserver下则必须在后面为动态表指定一个别名语法才是正确的:select * from (select * from table) aliasname,aliasname可以是任意的单词。之所以使用这样的语句同样是为了通过形如select columns from table这样的简单语句构造分页语句时用来返回所有的记录总数:select count(ID) from (select columns from table),当然这样是偷懒,性能上应该会有部分影响的,count的时候尽可能还是建议直接用select count(ID) from table这样的句法。
 
原文地址:https://www.cnblogs.com/huqingyu/p/217756.html