关于使用企业库出现的数据库部分语法不兼容问题的解决方案一、SQLserver、Access和Oracle的语法差别1、取当前系统时间A:SelectNow()S:SelectGetdate()O:SelectSysdatefromDual2、连接字符串A:S:+O:||3、字符串函数(截取字符串、大写、小写、查找字符串位置)A:Mid、UCase、LCase、InStrS:SubString、Upper、Lower、CharIndexO:SubStr、Upper、Lower、InStr4、判断取值语句A:IIFS:CaseWhenThenO:Decode5、时间字段A:要用#号分隔,或者转换为日期SELECT*fromBooksWHERERegDate=#2007-5-1#或SELECT*fromBooksWHERERegDate=CDate(’2007-5-1′)S:可以直接用''SELECT*fromBooksWHERERegDate=‘2007-5-1′O:To_DateSELECT*fromBooksWHERERegDate=To_Date('2007-05-01','yyyy-mm-dd')6、数据类型转换A:CStr,CInt,CDateS:Convert,CASTO:To_Char,To_Number,To_Date7、InserInto…..Select…from语句InsertIntoa(ii,jj,kk)(Selectii,jj,kkfromb)这样的语句,在SQLServer以及Oracle中都不会有错,但在Access中会报:INSERTINTO语句的语法错误。Access应该把后面Select语句的括号去掉,如下:InsertIntoa(ii,jj,kk)Selectii,jj,kkfromb同时这样写在SQLServer和Oracle中都不会有错8、关键字有些字母在Access,SQLServer中是关键字,需要用[]界定可解决问题,例如:at,name9、别名SQLServer和Oracle中字段起别名时as可以省略,Access不能10、表名前缀Select*,1fromA这样的语句在Access,SQLServer中不会有错,但在Oracle中是不行的,必须要写成这样:SelectA.*,1fromA11、如果语句中有:(冒号),例如有时间字段的查询:CalcDate=#2008-05-0111:00:00#,在Access中一般会出现如下错误:不正常地定义参数对象。提供了不一致或不完整的信息。将相应Query的ParamCheck设为False即可。12、Access中的逻辑值在库中为-1和0,而SQLServer中为1和0,所以写BoolField=1这样的语句有兼容性问题。还有部分语句执行的不同,不再一一罗列。二、解决方案方案一:(可以以企业库为基础)1、定义一个参数,标识数据库种类publicenumDataBaseType{Access,SQLServer,Oracle}2、数据库连接方式和常用函数的区分if(DatabaseType==SQLServer){ConnStr=SQLserver数据库名FY_True="1"FY_False="0"FY_Now="GetDate()"FY_OrderType="desc"FY_DatePart_W="ww"FY_DatePart_H="hh"}elseif(DatabaseType==Access){ConnStr=Access数据库名称FY_True="True"FY_False="False"FY_Now="Now()"FY_OrderType="asc"FY_DatePart_W="'ww'"FY_DatePart_H="'h'"}else(DatabaseType==Oracle){---本文来源于网络,仅供参考,勿照抄,如有侵权请联系删除---…………FY_Now=”sysdatefromdual”……….//与以上类似}将SQLServer、ACCESS和Oracle常用的语句进行变量赋值。这样做的好处就是后面使用相关内容的时候可以直接使用调用变量的方法,而不再需要进行数据库类型的判断。例如获取系统时间:“select”+FY_Now这样就免去了数据库的判别,减少了代码量和实用性。3、用自定义的变量参与SQL语句的构造4、根据数据库的不同执行SQL语句5、在必要的时候放弃兼容性的追求,采用不同数据库不同代码if(DatabaseType==SQLServer){MSSQL数据库时使用的代码}elseif(DatabaseType==Access){ACCESS数据库时使用的代码}else(DatabaseType==Oracle){Orcale数据库时使用的代码}这样就可以保证程序的高效性以及稳定性。这也是整个程序的兼容性的一种。个人意见:这种方式可以在企业库的基础上使用,工作量相对较小,主要工作量会集中在SQLServer、Access和Oracle不同语法的重新统一定义,以及部分特殊SQL语句的单独处理。不过这种方式如果要更换或是新增其他的数据库种类,程序的更改可能比较分散,不太好处理,也就是扩展性不好。方案二:(不使用企业库)1、定义一个参数,标识数据库种类publicenumDataBaseType{Access,SQLServer,Oracle}2、定义接口,统一数据库的操作publicinterfaceIDBAccess{voidInit(stringstrServer,stringstrDataBase,stringstrUser,stringstrPwd);voidOpen();voidClose();boolTestConn();intRunNoQuery(string...