目前主流的企业应用大多数是基于以下的数据库开发的,Microsoft SQL Server、IBM DB 2、Oracle、Sybase。作为软件开发商,其软件需要支持不同的数据库,但是公司缺乏精通多种数据库的人才。就算有精通不同数据库的人才,开发不同的Data Access模块业导致工 作量增加,程序难以维护。
但是你到sourceforge.net上,你会发现其实很多项目的做法,是只用了非常非常有限的工作,只用了这些数据库之间的公共功能的子集。当然也有的项目为不同的数据库编写不同的DAL(数据库访问层)
我的一种解决方案是提供一套自定义的SQL文法,在开发应用程序的时候,翻译为不同的数据的SQL。
使用“递归下降”的文法分析技术,并且经过针对性的优化处理,效率极高,普通的SQL通常在0.1~0.2毫秒就能翻译完成。在使用的过程中,可以完全忽略其所占用的执行时间。
如果对此技术感兴趣,可以致信:c_sql@163.net ,索要试用版本和相关文档。
下面是例子:
例一
翻译如下的SQL语句:
select top 10 * from t where a>b order by a, b asc, c desc
测试结果是:
Oracle :
SELECT * FROM (SELECT * FROM t WHERE (a > b) ORDER BY a ASC, b ASC, c DESC) WH
ERE ROWNUM <= 10
翻译1000次共耗时 : 120 (毫秒), 平均每次0.12(毫秒)
MS SQL Server :
SELECT TOP 10 * FROM t WHERE (a > b) ORDER BY a ASC, b ASC, c DESC
翻译1000次共耗时 : 140 (毫秒), 平均每次0.14(毫秒)
DB2 :
SELECT * FROM t WHERE (a > b) ORDER BY a ASC, b ASC, c DESC FETCH FIRST 10 ROW
S ONLY
翻译1000次共耗时 : 130 (毫秒), 平均每次0.13(毫秒)
Sybase :
SELECT TOP 10 * FROM t WHERE (a > b) ORDER BY a ASC, b ASC, c DESC
翻译1000次共耗时 : 151 (毫秒), 平均每次0.151(毫秒)
例二
翻译如下的SQL语句
Oracle :
SELECT * FROM T1 A, T2 B WHERE A.FId = B.FId
翻译1000次共耗时 : 80 (毫秒), 平均每次0.08(毫秒)
select * from T1 A inner join T2 B on A.FId = B.Fid
MS SQL Server :
SELECT * FROM T1 A INNER JOIN T2 B ON A.FId = B.FId
翻译1000次共耗时 : 90 (毫秒), 平均每次0.09(毫秒)
DB2 :
SELECT * FROM T1 A INNER JOIN T2 B ON A.FId = B.FId
翻译1000次共耗时 : 90 (毫秒), 平均每次0.09(毫秒)
Sybase :
SELECT * FROM T1 A INNER JOIN T2 B ON A.FId = B.FId
翻译1000次共耗时 : 100 (毫秒), 平均每次0.1(毫秒)