1. 自動增加字段需要重寫。在access中經(jīng)常使用的自動編號字段,導入到mssql后,他并不是自增型的int,需要手工設置,把導入后的自動編號字段的標識的“否”改為“是”,“種子”和“遞增量”都為“1”,才能成為自動編號。
2. 所有的默認值都丟失了。主要是數(shù)字類型和日期類型。以前添加記錄的時候,有些字段是不需要手動用程序賦值的,像日期等,現(xiàn)在則需要再添加多一句rs("newsDate")=now()的。 3. 所有now(),time(),date()要改成getdate(),網(wǎng)上有這么說的,但是我改了之后程序反而運行不正常。不改倒還可以。 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中是沒有的,當你把數(shù)據(jù)導入到mssql的時候,問題就出來了。mssql在導入的時候,會自動給這些字段(包括數(shù)據(jù)庫中的表名)加上“[字段名]”,如果想去掉[],那么改字段名字為不是mssql的保留字。 8. 有些地方用conn.execute只能讀取到部分字段的數(shù)據(jù),有些字段的數(shù)據(jù)就讀不到。非常奇怪,查看了很多關(guān)于asp中的rs.open于conn.execute的區(qū)別,也沒有找到本質(zhì)的答案。真是奇怪。 9. 日期函數(shù)不相同,在對ACCESS數(shù)據(jù)庫處理中,可用date()、time()等函數(shù),但對SQL SERVER數(shù)據(jù)庫處理中,只能用datediff,dateadd等函數(shù),而不能用date()、time()等函數(shù)。 10. 轉(zhuǎn)化時,跟日期有關(guān)的字段,SQL SERVER默認為smalldatetime型,我們最好將它變?yōu)?/span>datetime型,因為datetime型的范圍比smalldatetime型大。有時用smalldatetime型時,轉(zhuǎn)化失敗,而用datetime型時,轉(zhuǎn)化成功 11. isnull(rowname)要改成rowname = null 12. CursorType要改成1,也就是打開數(shù)據(jù)庫時要給出第一個數(shù)字參數(shù)為1,否則記錄可能顯示不完整 13. 備注類型要通過cast(column as varchar)來使用 14. true/false類型不能使用,要變?yōu)?/span>1/0 15. 在對ACCESS數(shù)據(jù)庫處理中,sql語句中直接可以用一些VB的函數(shù),像cstr()函數(shù),而對SQL SERVER數(shù)據(jù)庫處理中,卻不能用 16. 原來ASP里的“DELETE * FROM ……”要改為“DELETE FROM ……”,有部分運作正常,有部分會無效。 17. access里面除法可以使用”"”或者”/”,MSSQL里面只能使用”/” 18. 首先如果一開始就需要制作SQLSERVER的網(wǎng)站,那么最好將你的愛機裝上WINDOWS2000或者2003這樣的SERVER版,這樣的版本是支持SQLSERVER正式版的安裝的,而XP只能支持個人版或者開發(fā)版,我沒有裝過,但對于調(diào)試網(wǎng)站而言最好還是在正式版下工作,轉(zhuǎn)化的整個過程不算太復雜,但至少可以省下一些精力。我的愛機是XP,所以只好先用ACCESS調(diào)試。 19. 好了,當你找到一臺裝有SQLSERVER的機器時,你便可以開始轉(zhuǎn)換并調(diào)試了。 a) 先利用轉(zhuǎn)化軟件:CooSel2.0 CreateSQL V1.05,我用的這個,非常好用。具體操作的話,我用的是生成升遷SQL腳本,保存為 *.sql文件后,在SQL2000的查詢分析器里調(diào)入執(zhí)行。而SQLSERVER的具體操作在此不便贅述。這樣,你的數(shù)據(jù)庫就轉(zhuǎn)化成了MSSQL數(shù)據(jù)庫 b) 對asp而言,首先是數(shù)據(jù)庫連接文件的修改:這點可以參考動網(wǎng)論壇的conn.asp 20. Dim ConnStr 21. 'sql數(shù)據(jù)庫連接參數(shù):數(shù)據(jù)庫名、用戶密碼、用戶名、連接名(本地用local,外地用IP) Dim SqlDatabaseName,SqlPassword,SqlUsername,SqlLocalName SqlDatabaseName = "dvbbs7" '數(shù)據(jù)庫名稱 SqlPassword = "" '數(shù)據(jù)庫密碼 SqlUsername = "dvbbs" '數(shù)據(jù)庫用戶名 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) 這時候你可以先瀏覽一下新的網(wǎng)站了,如果出錯了,也不用擔心,但是有很多頁面已經(jīng)是可以正常顯示了。接著就是對整站程序的修改了。尤其要注意的是:所有的修改都只針對對數(shù)據(jù)庫進行操作的語句,幾乎全是對SQL語句的修改。而在一般的代碼中是絕對不需要修改的!否則會出錯!! b) 真假值的判斷。ACCESS提供了布爾值這一數(shù)據(jù)類型,但是在SQLSERVER中,如果你在SQL語句中填寫Where AA=True則是錯誤的,因為MSSQL不支持在數(shù)據(jù)庫中True和False的判斷。這時候你需要將所有SQL語句中的True和False改為1和0。而在一般的程序中,例如rs("aa")=True則不需要修改!因為這句話并不是對數(shù)據(jù)庫的操作??赡苣銜f這樣改起來,對于大網(wǎng)站而言,是非常麻煩的,的確,但有一些比較簡便的方法。比如在dreamweaver中,你可以利用整個文件夾的查找,找出所有的True和False,然后篩選出對數(shù)據(jù)庫進行操作的True和False并將他們改成1和0。另外還有一點:在SQLSERVER中也需要更改一下,ACCESS轉(zhuǎn)化后布爾值變成了Bit值,最好將默認值設為0,即與ACCESS一樣設置默認值為False。 c) 有一些網(wǎng)站中提到:sql數(shù)據(jù)庫表是沒有自動字段的,因此原來access中的自動字段被轉(zhuǎn)換成了普通字段,需要手工改成標識類型,增量為1。這點其實軟件在轉(zhuǎn)化的過程中已經(jīng)幫你完成了,如果你是手工轉(zhuǎn)化的話,確實需要修改標識類型。還有一點我沒有遇到過,但是有的網(wǎng)站也提到了:空值的表示:在access中,判斷空值一般用是否=""來表示,但是這在SQL中往往出錯,如果遇到出錯的問題或者程序運行不正常,可以改成如這樣判斷:where (name is null)。 d) 如果你在SQL語句中同時使用了VB函數(shù),很遺憾,這在MSSQL中是不能被辨認的,最好的方法是先將他在SQL之外處理,然后存入變量中導入到SQL語句中。 e) 最主要的還是時間函數(shù)的各種修改,這占到了工作量的90%。其一是將所有數(shù)據(jù)庫操作語句中的NOW()轉(zhuǎn)化成GETDATE();其二是datediff和dateadd這類函數(shù)需要將第一項中的引號去掉,即datediff("s",date1,date2)改為datediff(s,date1,date2);其三,ACCESS中時間字符串都用#括起來,而MSSQL中是用''來表示的,即等同于一般的字符串;在access的sql語句中的時間使用變量查詢的時候,大家一般使用”select * from aaaa while time=#”&變量名&”#”,在mssql中是不行的,他的語法是“select * from aaaa while time=’”&變量名&”‘””。(意思是讓你把日期時間變量當成字符串來使用,呵呵~~~) 22. 其四有一些時間函數(shù)在MSSQL中是不能被辨認的,基本上所有的SQLSERVER中的時間日期函數(shù)如下: 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和上面一樣。整個函數(shù)結(jié)果是date2 - date1 26. datename(datepart, date) 取那一部分,返回字符串。 27. datepart(datepart, date) 取一部分,返回整數(shù)。 28. getdate()當前時間 最后一個,排序問題: 我測試程序的時候,發(fā)現(xiàn)剛開始中文的顯示是正常的,后來我更新的時候,讀取出來的正常的中文馬上就變成問號了,而且是數(shù)據(jù)庫記錄里邊的填充的數(shù)據(jù)直接變成問題那種類型。這種現(xiàn)象是由于數(shù)據(jù)庫排序規(guī)則(Collation)指定錯誤造成的,要正確的將中文寫入NVARCHAR字段,要么在SQL語句中文值前加N(N'中文值'),要么要確定數(shù)據(jù)庫排序規(guī)則為Chinese_PRC。于是我再新建一個數(shù)據(jù)庫,將排序規(guī)則定為chinses_ci_ai這個,然后再導入數(shù)據(jù)。這樣問題就解決了。 PS:什么叫排序規(guī)則呢?MS是這樣描述的:"在 Microsoft SQL Server 2000 中, 字符串的物理存儲由排序規(guī)則控制。排序規(guī)則指定表示每個字符的位模式以及存 儲和比較字符所使用的規(guī)則。" 在查詢分析器內(nèi)執(zhí)行下面語句,可以得到SQL SERVER支持的所有排序規(guī)則。 select * from ::fn_helpcollations() 排序規(guī)則名稱由兩部份構(gòu)成,前半部份是指本排序規(guī)則所支持的字符集。 如: Chinese_PRC_CS_AI_WS 前半部份:指UNICODE字符集,Chinese_PRC_指針對大陸簡體字UNICODE的排序規(guī)則。 排序規(guī)則的后半部份即后綴 含義: _BIN 二進制排序 _CI(CS) 是否區(qū)分大小寫,CI不區(qū)分,CS區(qū)分 _AI(AS) 是否區(qū)分重音,AI不區(qū)分,AS區(qū)分 _KI(KS) 是否區(qū)分假名類型,KI不區(qū)分,KS區(qū)分 _WI(WS) 是否區(qū)分寬度 WI不區(qū)分,WS區(qū)分 區(qū)分大小寫:如果想讓比較將大寫字母和小寫字母視為不等,請選擇該選項。 區(qū)分重音:如果想讓比較將重音和非重音字母視為不等,請選擇該選項。如果選擇該選項, 比較還將重音不同的字母視為不等。 區(qū)分假名:如果想讓比較將片假名和平假名日語音節(jié)視為不等,請選擇該選項。 區(qū)分寬度:如果想讓比較將半角字符和全角字符視為不等,請選擇該選項 |
|
來自: 悟靜 > 《數(shù)據(jù)庫》