2. 所有的默认值都丢失了。主要是数字类型和日期类型。以前添加记录的时候,有些字段是不需要手动用程序赋值的,像日期等,现在则需要再添加多一句rs("newsDate")=now()的。
3. 所有now(),time(),date()要改成getdate(),网上有这么说的,但是我改了之后程序反而运行不正常。不改倒还可以。
4. 所有datediff(’d', time1, time2)要改成datediff(day, time1, time2)
5. 所有datediff(’ww’, time1, time2)要改成datediff(week, time1, time2)
6. 所有datediff(’d', time1, time2)要改成datediff(day, time1, time2)
7. 在mssql server中,有许多保留字,在access中是没有的,当你把数据导入到mssql的时候,问题就出来了。mssql在导入的时候,会自动给这些字段(包括数据库中的表名)加上“[字段名]”,如果想去掉[],那么改字段名字为不是mssql的保留字。
8. 有些地方用conn.execute只能读取到部分字段的数据,有些字段的数据就读不到。非常奇怪,查看了很多关于asp中的rs.open于conn.execute的区别,也没有找到本质的答案。真是奇怪。
9. 日期函数不相同,在对ACCESS数据库处理中,可用date()、time()等函数,但对SQL SERVER数据库处理中,只能用datediff,dateadd等函数,而不能用date()、time()等函数。
10. 转化时,跟日期有关的字段,SQL SERVER默认为smalldatetime型,我们最好将它变为datetime型,因为datetime型的范围比smalldatetime型大。有时用smalldatetime型时,转化失败,而用datetime型时,转化成功
11. isnull(rowname)要改成rowname = null
12. CursorType要改成1,也就是打开数据库时要给出第一个数字参数为1,否则记录可能显示不完整
13. 备注类型要通过cast(column as varchar)来使用
14. true/false类型不能使用,要变为1/0
15. 在对ACCESS数据库处理中,sql语句中直接可以用一些VB的函数,像cstr()函数,而对SQL SERVER数据库处理中,却不能用
16. 原来ASP里的“DELETE * FROM ……”要改为“DELETE FROM ……”,有部分运作正常,有部分会无效。
17. access里面除法可以使用”"”或者”/”,MSSQL里面只能使用”/”
18. 首先如果一开始就需要制作SQLSERVER的网站,那么最好将你的爱机装上WINDOWS2000或者2003这样的SERVER版,这样的版本是支持SQLSERVER正式版的安装的,而XP只能支持个人版或者开发版,我没有装过,但对于调试网站而言最好还是在正式版下工作,转化的整个过程不算太复杂,但至少可以省下一些精力。我的爱机是XP,所以只好先用ACCESS调试。
19. 好了,当你找到一台装有SQLSERVER的机器时,你便可以开始转换并调试了。
a) 先利用转化软件:CooSel2.0 CreateSQL V1.05,我用的这个,非常好用。具体操作的话,我用的是生成升迁SQL脚本,保存为 *.sql文件后,在SQL2000的查询分析器里调入执行。而SQLSERVER的具体操作在此不便赘述。这样,你的数据库就转化成了MSSQL数据库
b) 对asp而言,首先是数据库连接文件的修改:这点可以参考动网论坛的conn.asp
20. Dim ConnStr
21. 'sql数据库连接参数:数据库名、用户密码、用户名、连接名(本地用local,外地用IP)
Dim SqlDatabaseName,SqlPassword,SqlUsername,SqlLocalName
SqlDatabaseName = "dvbbs7" '数据库名称
SqlPassword = "" '数据库密码
SqlUsername = "dvbbs" '数据库用户名
SqlLocalName = "(local)"
ConnStr = "Provider = Sqloledb; User ID = " & SqlUsername & "; Password = " & SqlPassword & "; Initial Catalog = " & SqlDatabaseName & "; Data Source = " & SqlLocalName & ";"
On Error Resume Next
Set conn = Server.CreateObject("ADODB.Connection")
conn.open ConnStr
a) 这时候你可以先浏览一下新的网站了,如果出错了,也不用担心,但是有很多页面已经是可以正常显示了。接着就是对整站程序的修改了。尤其要注意的是:所有的修改都只针对对数据库进行操作的语句,几乎全是对SQL语句的修改。而在一般的代码中是绝对不需要修改的!否则会出错!!
b) 真假值的判断。ACCESS提供了布尔值这一数据类型,但是在SQLSERVER中,如果你在SQL语句中填写Where AA=True则是错误的,因为MSSQL不支持在数据库中True和False的判断。这时候你需要将所有SQL语句中的True和False改为1和0。而在一般的程序中,例如rs("aa")=True则不需要修改!因为这句话并不是对数据库的操作。可能你会说这样改起来,对于大网站而言,是非常麻烦的,的确,但有一些比较简便的方法。比如在dreamweaver中,你可以利用整个文件夹的查找,找出所有的True和False,然后筛选出对数据库进行操作的True和False并将他们改成1和0。另外还有一点:在SQLSERVER中也需要更改一下,ACCESS转化后布尔值变成了Bit值,最好将默认值设为0,即与ACCESS一样设置默认值为False。
c) 有一些网站中提到:sql数据库表是没有自动字段的,因此原来access中的自动字段被转换成了普通字段,需要手工改成标识类型,增量为1。这点其实软件在转化的过程中已经帮你完成了,如果你是手工转化的话,确实需要修改标识类型。还有一点我没有遇到过,但是有的网站也提到了:空值的表示:在access中,判断空值一般用是否=""来表示,但是这在SQL中往往出错,如果遇到出错的问题或者程序运行不正常,可以改成如这样判断:where (name is null)。
d) 如果你在SQL语句中同时使用了VB函数,很遗憾,这在MSSQL中是不能被辨认的,最好的方法是先将他在SQL之外处理,然后存入变量中导入到SQL语句中。
e) 最主要的还是时间函数的各种修改,这占到了工作量的90%。其一是将所有数据库操作语句中的NOW()转化成GETDATE();其二是datediff和dateadd这类函数需要将第一项中的引号去掉,即datediff("s",date1,date2)改为datediff(s,date1,date2);其三,ACCESS中时间字符串都用#括起来,而MSSQL中是用''来表示的,即等同于一般的字符串;在access的sql语句中的时间使用变量查询的时候,大家一般使用”select * from aaaa while time=#”&变量名&”#”,在mssql中是不行的,他的语法是“select * from aaaa while time=’”&变量名&”‘””。(意思是让你把日期时间变量当成字符串来使用,呵呵~~~)
22. 其四有一些时间函数在MSSQL中是不能被辨认的,基本上所有的SQLSERVER中的时间日期函数如下:
23. day(), month(), year()
24. dateadd(datepart, number, date), datapart指定对那一部分加,number知道加多少,date指定在谁的基础上加。datepart的取值包括,year,quarter,month,dayofyear,day,week,hour,minute,second,比如明天dateadd(day,1, getdate())
25. datediff(datepart,date1,date2). datapart和上面一样。整个函数结果是date2 - date1
26. datename(datepart, date) 取那一部分,返回字符串。
27. datepart(datepart, date) 取一部分,返回整数。
28. getdate()当前时间
最后一个,排序问题:
我测试程序的时候,发现刚开始中文的显示是正常的,后来我更新的时候,读取出来的正常的中文马上就变成问号了,而且是数据库记录里边的填充的数据直接变成问题那种类型。这种现象是由于数据库排序规则(Collation)指定错误造成的,要正确的将中文写入NVARCHAR字段,要么在SQL语句中文值前加N(N'中文值'),要么要确定数据库排序规则为Chinese_PRC。于是我再新建一个数据库,将排序规则定为chinses_ci_ai这个,然后再导入数据。这样问题就解决了。
PS:什么叫排序规则呢?MS是这样描述的:"在 Microsoft SQL Server 2000 中,
字符串的物理存储由排序规则控制。排序规则指定表示每个字符的位模式以及存
储和比较字符所使用的规则。"
在查询分析器内执行下面语句,可以得到SQL SERVER支持的所有排序规则。
select * from ::fn_helpcollations()
排序规则名称由两部份构成,前半部份是指本排序规则所支持的字符集。
如:
Chinese_PRC_CS_AI_WS
前半部份:指UNICODE字符集,Chinese_PRC_指针对大陆简体字UNICODE的排序规则。
排序规则的后半部份即后缀 含义:
_BIN 二进制排序
_CI(CS) 是否区分大小写,CI不区分,CS区分
_AI(AS) 是否区分重音,AI不区分,AS区分
_KI(KS) 是否区分假名类型,KI不区分,KS区分
_WI(WS) 是否区分宽度 WI不区分,WS区分
区分大小写:如果想让比较将大写字母和小写字母视为不等,请选择该选项。
区分重音:如果想让比较将重音和非重音字母视为不等,请选择该选项。如果选择该选项,
比较还将重音不同的字母视为不等。
区分假名:如果想让比较将片假名和平假名日语音节视为不等,请选择该选项。
区分宽度:如果想让比较将半角字符和全角字符视为不等,请选择该选项