目前, 許多小型網站的 ASP 程序使用的都是用 Access 作為后臺數據庫, 但是 Access 數據庫在承擔訪問量、數據量大的網站應用時, 往往不堪重負。一般而言, 容量超過 50M 的 Access 數據庫, 性能就開始明顯下降, 超過 100M以后, 出錯、運行慢的問題就會更加突出。盡管可以用動態網頁程序設計方法, 從程序的角度盡量優化以圖提高性能, 但是這不能從根本上解決問題。這時, 使用微軟的 SQL Server 數據庫就是最好的替代辦法之一, 當然也可以使用其它的如 Oracle、My SQL 等等, 但是作為轉換來說, 由于同為微軟的產品, 改寫成 SQL Server 應該是最有效、最實用的辦法。
1 如何實現轉換
1.1 轉換前提
系統應首先安裝好 SQL Server 數據庫和 Office 套件里面的Access; 并使用一個支持純文本編輯并且帶有行號顯示的編輯器,推薦使用 Ultra Edit, 也可以使用 FrontPage2003。
1.2 數據庫的準備
一般來說有兩種情況:
1.2.1 程序提供了 SQL 數據庫格式: 有一個 MDF 文件, 或者提供了創建 SQL 數據庫的 SQL 腳本文件( 后綴名為 SQL) 。
如果有 MDF 文件, 可以用企業管理器直接附加上, 如果提供的是 SQL 腳本文件, 那么就要先用企業管理器自己創建一個 SQL數據庫, 然后數據庫用企業管理器中的查詢分析器運行這個腳本創建數據庫表。這樣建立的數據庫基本不用再去改寫了。
1.2.2 程序只提供了一個 Access 數據庫, 這樣你就用企業管理器導入 Access 數據庫, 導入后需要改寫下面一些東西。
對照原來的 Access, 改寫下面的部分: SQL 數據庫表是沒有自動字段的, 因此原來 Access 中的自動字段被轉換成了普通字段, 需要手工改成標識類型, 增量為 1。
所有的時間字段, 如果定義了默認值, 那么原來肯定是 now(),需要改成 getdate(), 原來字段的默認值一般都不會自動引入, 需要對照原表的字段手工添加。
由于數據庫的不同, Access 和 SQL 的字段類型很多轉換后就變化了, 比如原來的“是/否”字段會被轉換成 bit 或者 int, 備注字段被轉換成 long text, text 字段轉換成 var char 等等, 一般來說不會影響程序運行。
如果要用一個 For SQL 的程序, 程序里用到了存儲過程, 那么應該有這個程序本身建立 SQL 數據庫的方法: 有其本身的 SQL數據庫文件, 或者 SQL 腳本; 如果沒有, 采用導入 Access 數據庫的方式是無法建立存儲過程的, 這樣最好放棄這個 For SQL 的程序版本, 使用同樣版本的 For Access 的程序, 導入 Access 數據庫,然后用下面的改寫方法自己改成 SQL 版本的程序。
2 連接字符串的改寫
2.1 對于 Access,可采用如下方法編寫程序
Dim ConnStr
If IsSQLDataBase = 1 Then
‘SQL 數據庫連接參數: 數據庫名、用戶密碼、用戶名、連接名( 本地用local, 外地用IP)
Dim SQLDatabaseName, SQLPassword, SQLUserName, SQLLocalName
SQLDatabaseName = “dvbbs7”
SQLPassword = ””
SQLUserName = ”(local)”
ConnStr=”provider = SQLoledb;User ID = “ & SQLUserName & ”; Password = “ & SQLPassword & “;Initial Catalog = “ & SQLDatabaseName & “; Data Source = “ & SQLLocalName & “;”
Else
‘第一次使用要修改本處數據庫地址并相應修改 DATA 目錄中數據庫名稱, 如將 dvbbs6.mdb 修改為 dvbbs6.asp
Db = “data/fengerqingqing.mdb”
ConnStr = “Provider = Microsoft.Jet.OLEDB.4.0; Data Source = “ & Server.MapPath(Db)
End If
On Error Resume Next
Set conn = Server.CreatObject("ADODB.Connection")
conn.open ConnStr
2.2 如果要改寫成 SQL Server, 有關 Access 的使用語句可以刪除, 即從 else 到 on error resume next, 從而變成如下語句:
Dim ConnStr
' SQL 數據庫連接參數: 數據庫名、用戶密碼、用戶名、連接名( 本地用 local, 外地用 IP)
Dim SQLDatabaseName,SQLPassword,SQLUsername,SQLLocalName
SQLDatabaseName =“databasename”
SQLPassword =“”
SQLUsername =“sa”
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
也可以簡潔一些, 寫成:
Set conn = Server.CreateObject(“ADODB.Connection”)
conn.open “Provider = SQLoledb; User ID = sa; Password =1234567; Initial Catalog =databasename; Data Source = (local);”
程序中的數據庫名稱、數據源、用戶、密碼, 使用者可以根據自己的實際情況進行修改。
3 程序的改寫
這也有兩種情況:
3.1 若是 For SQL 的程序, 那么如果上述的數據庫建立過程沒有遇到阻礙, 程序基本就可以運行了; 如果出錯, 只可能是程序本身的問題。
3.2 若程序是 For Access 的, 與 For SQL 的程序差別主要是程序中使用到的 SQL 查詢語句。注意, SQL 查詢語句是數據庫應用中不可缺少的部分, 不管是 For SQL 還是 For Access 的程序使用的語法大體相似, 但也一些細微的差別, 正是這些差別, 造成了程序的不通用, 也是需要修改的主要內容。一般要修改的部分如下:
時間函數的問題: SQL 數據庫的時間函數與 Access 不同, 最常見的是取現在時間的函數, Access 是 now(), SQL 是 getdate()。因此凡是在 where 子句中使用了 now()的地方都要改成 getdate(); 注意, now()函數在 ASP 程序本身也要使用, 凡是不在數據庫查詢或執行語句中使用的 now()函數一定不能改。
時間比較函數: datediff(\' d\' ,\' 時間 1\' ,‘時間 2’)這是Access 查詢用的格式, SQL 中這些引號都要去掉, 同時時間格式的前后可能加上了 #, 也要去掉。同樣這也是指在 SQL 語句中的,在 ASP 語句中的要保持原樣。
空值的表示: 在使用 Access 數據庫時, 判斷空值一般用是否=“”來表示, 但是這在使用 SQL 數據庫時往往出錯, 如果遇到出錯 的問題或者程序運行不正常,可以改成如這樣判斷:where(nameis null)
真假值判斷: Access 中可以用=true、=false 來判斷, 但是在SQL 中就會出錯, 因此在 SQL 查詢或執行語句中這類判斷要分別 改成=1、=0。注意一點: 有些程序雖然寫成=“true”, 但是由于有引 號, 所以這個字段是字符類型的, 不能改成=1, 保持原樣即可。