好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Access转SqlServer的注意事项(相对完整版)

1. 自动增加字段需要重写。在 access 中经常使用的自动编号字段,导入到 mssql 后,他并不是自增型的 int ,需要手工设置,把导入后的自动编号字段的标识的否改为是,种子和递增量都为 1 ,才能成为自动编号。 2. 所有的默认值都丢失了。主要是数字类型和日期

1. 自动增加字段需要重写。在 access 中经常使用的自动编号字段,导入到 mssql 后,他并不是自增型的 int ,需要手工设置,把导入后的自动编号字段的标识的“否”改为“是”,“种子”和“递增量”都为“ 1 ” ,才能成为自动编号。

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) 来使用

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 区分 

区分大小写 : 如果想让比较将大写字母和小写字母视为不等,请选择该选项。

区分重音 : 如果想让比较将重音和非重音字母视为不等,请选择该选项。如果选择该选项,

比较还将重音不同的字母视为不等。

区分假名 : 如果想让比较将片假名和平假名日语音节视为不等,请选择该选项。

区分宽度 : 如果想让比较将半角字符和全角字符视为不等,请选择该选项

查看更多关于Access转SqlServer的注意事项(相对完整版)的详细内容...

  阅读:47次