陈行远 : 

 
 
 
SC 环境增加 一个常数  DBT_ ="access"  '表示当前数据库的类型, 枚举: access, sqlserver, mysql

SC环境增加一个函数 function ST_(s) 这个函数用于不同数据库的Select Top 语句的兼容.

如果你的 sql 语句里面包含了 select top n ..., 你必须把你的 语句用ST_函数处理一下, 如:

  sql="select Top 10 * from ac"

  sql=ST_(sql)  ' 这时如果数据库类型为MySQL 则 sql 变成 "select * from ac LIMIT 10"
  注意, 如果你的SQL语句里面有多个TOP关键字,你必须把SQL语句拆分成单独的只包含一个top 关键字的语句后再合并.

1.识别符

mysql识别符是 ``;sql server识别符是[].
mysql下表名或者字段名用[]包围,都会出错。例如:
create table [tbl] (id int);
alter table tbl add [f1] text;
***解决方式: 在SQL语句中避免使用 "[]" 来包裹字段名和表名, 如果字段名和表名是关键字, 必须区别不同的数据库对待

2.定义自增字段

mysql定义自增字段用 auto_increment;sql server用indentity(1,1)

***解决方式:增加字段时, 必须区分不同的数据库书写不同的SQL语句


3.注释

mysql注释符 -- comments,注释内容和注释符号要留个空格,不然没有注释效果(命令行界面下验证);sql server注释符与注释内容间有无空格皆可。如 --comments  -- comments

***解决方式: 统一使用注释内容和注释符号之间多留一个空格的兼容方式

4.取字符串长度函数

mysql用length(str);sql server用len(str)

***解决方式: 已经通过mysql的自定义函数统一一次性解决,编程人员可以不理会,直接使用 len() 函数即可

5.数据类型text 整类型unsiged

mysql的text数据类型,有65KB的存储空间,longtext有4G存储空间;sql server的Text数据类型有2G存储空间。
mysql的整型数据类型可以指定unsigned,获得更大的取值范围。如 amount int unsigned

***解决方式: 我们统一使用text就可以了,除非我们可以预见某个字段数据量超过65K,则使用longtext类型

6.增加多个字段

mysql要加括号
包围字段列表 例如:
 MS sql:alter table t add f1 int,f2 int,f3 int;

 Mysql: alter table t add (f1 int,f2 int,f3 int);

***解决方式:必须使用带括号的SQl语句的写法,即可兼容不同的数据库类型

7.like子句

 Mysql select ...like,like 子句不支持[0-9]这样的匹配方式,它有扩展正则表达式子句 rlike 支持 . * [] ^ $ {n}等元字符。

 Ms sql: select * from teacher where tname like 'C[0-9][0-9]'; -- 没问题,可以匹配到 C02 C29 ...  Mysql: select * from teacher where tname like 'C[0-9][0-9]'; -- 不会出错,但是like会认为要匹配字符串 C[0-9][0-9] 所以没结果返回  Mysql: select * from teacher where tname rlike '^C[0-9]{2}$'; -- rlike子句的等价写法

***解决方式: 区别数据库对待, 这种情况我们极少用到,只在basedatacommon中用到

8.rs.recordCount

ado连接mysql,sql server数据库,打开rs对象默认的游标位置都是服务端游标。
sql server: rs.open "select * from company",cn,1,1  -- rs.recordCount返回正确的记录数
sql server: rs.open "select * from company",cn,1,1  -- rs.recordCount返回-1,解决方法:在rs.open之前 设置 rs.cursorLocation=3  或rs.cursorLocation=aduseClient。注:cursorLocation在记录集打开之前是可读可写的。打开记录集后为只读。可通过connection对象或recordset对象设置 如:cn.cursorLocation=3, rs.cursorLocation=3

***解决方式:碰到这种问题,把改成rs.cursorLocation=3

9.rs.addnew ....rs.update问题

如product表有数据如下:
Pname
产品A
产品B

SC页面:
rs.open "select * from product" cn,1,3
rs.addnew
rs("Pname")="产品C"
rs.update
response.write rs("Pname")  '结果显示 产品B 而不是新记录的值

***解决方法:rs.open语句前设置游标位置为客户端游标 rs.cursorLocation=3

若用循环语句批量增加记录数很多 例如超过80条,如:
rs.open "select * from product" cn,1,3
for i=1 to 200
rs.addnew
rs("Pname")="产品"&i
rs.update
next

***解决方式:设置客户端游标后还是会有部分记录不能增加进去的情况,这时应把设置lockType=4,rs.update改用rs.updateBatch

10.rs.update多条记录的问题

同样是product表,更新一条记录马上去更新的值没问题;通过循环更新多条记录,就马上取更新后的值有问题。
rs.open "select * from product" cn,1,3
rs("Pname")=rs("Pname")&"modified" '游标位于第一条记录
rs.update
response.write rs("Pname")  '结果为修改后的新值

更新多条记录的情况:
rs.open "select * from product" cn,1,3
do while not rs.eof
rs("Pname")=rs("Pname")&"modified" '游标位于第一条记录
rs.update
rs.movenext
loop

response.write "<h2>更新后的结果</h2><br>"
rs.movefirst
do while not rs.eof
response.write rs("Pname")&"<br>"
loop
'此时显示的是更新前的数据

***解决方法:在rs.open语句之前,设置为客户端游标 rs.cursorLocation=3

可上传附件
选择
同时转发此条
回复
1楼
Jangogo: 
SQL语句 如果使用了  + 作为多个字段值链接成一个字符串。在mysql中应该改为使用
CONCAT(str1,str2,....) 函数
Copyright © 2000-2016 粤ICP05021785号
地址:广州市天河区员村二横路8号全丰商业大厦808室 邮编:510600