Monday, January 17

Not Standard: MS Access

这两天用VB + MS Access 做个文档管理的软件,被Access气死了。

第一件事是:模糊查询语句用like, SQL的标准是用%作为匹配符: Select * from author where lastname like '%p%' 就会把所有名字中有p的作者都列出来。可是在MS Access中的Query,它是用*作为匹配符:Select * from author where lastname like '*p*' 。最气人的是:在VB中用ADODB调用Access,使用上面这句“Select * from author where lastname like '*p*'”,不成功,非要改成标准SQL方式Select * from author where lastname like '%p%'才把我要的结果列出来了。

第二件事:Access中有Memo类型的字段,能表示长于255字符的串。Sql Server, Oracle中也有类似的字段,我用起来一点问题都没有,可是今晚用Access,发现无法像普通字段那样写入。比如:
Insert into author(lastname, memo) values('Philip', 'famous author') (其中memo是Memo类型的字段),在MS Access中的Query是成功的,在VB中却不成功。在网上一搜索,已经有许多人问这个问题,而且有一家公司专门做了一个软件Total Access Memo来解决这个问题。其中这个联结介绍的方法最具体,但是我发现不起作用 :( 最后把它改成一个250字符的普通类型完事了。

另一个不标准是别名问题。SQL标准的方式是:Select lastname ln from author, 然后你就可以用“ln”来引用作者的姓。这个别名很有用,特别是你采用一些数学公式的时候。比如说:Select max(age) maxage from author ,如果不用别名你怎么能引用这个最老的年龄呢?来到Access上,这个方式就行不通了,摸了大半个钟头才发现用 Select max(age) AS maxage from author 的方式。

总之,Access最大的问题是不标准,最令人生气的是用它自身的Query跟用VB/ADODB的结果不一致。在这边明明运行很好的命令,在那边却无论如何跑不起来。

2 Comments:

At May 11, 2005 11:04 AM, Blogger Unknown said...

Left join in SQL:
select name from A, B where A.id=B.id(+)

Left join in SQL:
select name from A left join B ON A.id=B.id

 
At May 14, 2005 10:05 AM, Blogger Unknown said...

Left join in SQL:
select name from A, B where A.id=B.id(+)

Left join in MS Access:
select name from A left join B ON A.id=B.id

What if I have 3 tables to join?

 

<< Home