第一,就是資料的轉換,也是最重要、最值得注意的一部。由於SQL Server 2000的DTS(data transfer service)不能完全的把Access的資料結構轉換過來,比如“自動編號”、“預設值”、“=now()”等,如果資料結構不複雜的話,可以經過DTS後手動設計表,但如果有N個資料庫,N個表,N個欄位的時候,恐怕能累死你,這時候就要藉助第三方轉換軟體了。國內外相關的資料庫轉換軟體基本都嘗試了,最後發現真正能夠把資料、資料結構完整轉換的只有“Full Convert Enterprise 4.0”,強烈推薦,它支援目前幾乎所有的流行資料庫的相互轉換,支援Unicode,可惜目前沒有破解版,國內用的人也寥寥無幾,用它就不用在考慮“自動編號”、“預設值”、“邏輯型(bit)”、“=now()”等等一系列問題!地址:http://www.spectralcore.com/
試用版,雖然能夠轉換資料結構,但資料是每隔幾行,改為“***TRIAL VERSION***”,不過沒關係,只要資料結構轉過來就行了,吼吼。然後我們利用SQL Server 200自動產生該資料庫的SQL指令碼,刪除剛才轉換過來的資料庫,重新利用產生的SQL建立新的資料庫,然後再用DTS匯入Access資料。
資料轉換到此就大功告成了,接下來的就是改代碼了,瘋狂,這次我改動的代碼過千處。改得我都要吐了
第二,資料庫連接代碼需要改動,如果是用資料來源方式串連的話,基本不需要改動,直接添加資料來源就可以了。否則的話就用以下方式:
Dim SqlUsername,SqlPassword,SqlDatabaseName,SqlLocalName,ConnStr
SqlUsername = "" ’使用者名稱(SqlUsername)
SqlPassword = "" ’使用者密碼(SqlPassword)
SqlDatabaseName = "" ’資料庫名(SqlDatabaseName)
SqlLocalName = "(local)" ’(本地用local,外地用IP)
ConnStr = "Provider = Sqloledb; User ID = " & SqlUsername & "; Password = " & SqlPassword & "; Initial Catalog = " & SqlDatabaseName & "; Data Source = " & SqlLocalName & ";"
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.open ConnStr
第三,SQL語句部分,Access的Jet-SQL和SQL Server的T-SQL有些地方不一樣,這裡給出比較常遇到的情況。
A:now()和getdate(),如果代碼在asp裡,無需改動;如果在SQL語句字串裡,所有的now()要改成getdate()。
B:關鍵字,可能有些表裡的欄位是T-SQL的關鍵字,比如“update”、“time”等,在檢索資料的時候需要加“[]”,否則有時候可能會出錯。
如檢索Access的時候是“SELECT * FROM TABLE WHERE update<getdate() ORDER BY time DESC”要改成“SELECT * FROM TABLE WHERE [update]<getdate() ORDER BY [time] DESC”
C:關於“備忘型”,Access原來所有的“備忘型”到SQL Server裡就成了“ntext”或“text”;比較“ntext”類型的時候不能用“=”“<>”,需要改成“LIKE”。
如,原來Access裡有個“備忘型”欄位:“content”,
按“content”檢索:
“SELECT * FROM TABLE WHERE content=’ABC’”要改成“SELECT * FROM TABLE WHERE content LIKE ’ABC’”;
判斷“content”是否為空白:
原來是“SELECT * FROM TABLE WHERE content <>’’”要改成“SELECT * FROM TABLE WHERE content IS NOT NULL”
D:讀不到值,剛添加一行資料,緊接著就讀取此行某個有“預設值”或“自動編號”的值,例如有個表裡“ID”是自動編號,“y”有預設值
Rs.Addnew
Rs("x1")=x1
Rs("x2")=x2
...
Rs("x9")=x9
’添加完畢
’接著讀取自動編號的“ID”值和具有預設值的“y”
Y=Rs("y")
ID=Rs("ID")
原來在Access裡這樣是完全可以讀取到“ID”和“y”的,但到SQL裡不行,需要把遊標定到剛添加的那一行,所以需要在“Rs("x9")=x9”後加句“Rs.MoveLast”
E:Rs.Recordcount返回“-1”,解決的方法就是在定義“Rs”後面加句“Rs.CursorLocation = 3”或在資料庫連接“Conn”定義的後面加上“Conn.CursorLocation = 3”。
以上是網上牛人總結貼,轉載而來!