Heim  >  Artikel  >  Datenbank  >  Access转SqlServer的注意事项(相对完整版)

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

WBOY
WBOYOriginal
2016-06-07 15:27:241202Durchsuche

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.openconn.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不支持在数据库中TrueFalse的判断。这时候你需要将所有SQL语句中的TrueFalse改为10。而在一般的程序中,例如rs("aa")=True则不需要修改!因为这句话并不是对数据库的操作。可能你会说这样改起来,对于大网站而言,是非常麻烦的,的确,但有一些比较简便的方法。比如在dreamweaver中,你可以利用整个文件夹的查找,找出所有的TrueFalse,然后筛选出对数据库进行操作的TrueFalse并将他们改成10。另外还有一点:在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();其二是datediffdateadd这类函数需要将第一项中的引号去掉,即datediff("s",date1,date2)改为datediff(s,date1,date2);其三,ACCESS中时间字符串都用#括起来,而MSSQL中是用''来表示的,即等同于一般的字符串;在accesssql语句中的时间使用变量查询的时候,大家一般使用”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语句中文值前加NN'中文值'),要么要确定数据库排序规则为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区分 

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

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

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

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

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

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn