ndfweb.cn

ACCESS轉成SQL數據庫


2009-05-08 20:13:27 (6275)



ACCESS轉成SQL
網上大部分的免費asp程序使用的是access數據庫。但是access數據庫作為一個中小型的單機數據庫係統,在承擔訪問量、數據量大的網站應用時,往往就不堪重負了。一般認為,超過50M的access數據庫性能就開始明顯下降,超過100M以後,出錯、運行慢的問題會更加突出。盡管可以如動網7.0以後那樣,從程序的角度盡量優化以圖提高性能,但是不能從根本上解決問題。
這時也許使用微軟的SQL Server數據庫就是最可能的辦法,當然也可以使用其它的如Oracle、MySQL等等,但是作為改寫來說,由於同為微軟的產品,改寫成SQL Server應該是最省力的辦法。

一、改寫前提:

係統已經安裝好SQL Server2000並且打上了SP4補丁;安裝好Office套件裏麵的Access;使用一個支持純文本編輯並且帶有行號顯示的編輯器,推薦Ultra Edit,當然也可以使用FrontPage2003,不過以前的版本行號顯示不太好用。

個人能力要求:會基本的asp語法、access數據庫的操作、SQLServer企業管理器的基本操作。

二、數據庫的準備

一般來說有兩種情況:
1、程序提供了SQL數據庫格式:有一個MDF文件,或者提供了創建SQL數據庫的SQL腳本文件(後綴名為.sql)。
如果有mdf文件,可以用企業管理器直接附加上,如果提供的是sql腳本文件,那麼就先用企業管理器自己創建一個sql數據庫,然後數據庫用企業管理器中的查詢分析器運行這個腳本創建數據庫表。
這樣建立的數據庫基本不用再去改寫什麼了。
2、更多的是沒有提供SQL數據庫或腳本文件的,這時,就要自己來做這一切了,這也是我們這個帖子主要解決的問題。一般這樣的程序會提供一個access數據庫,這樣你就用企業管理器導入access數據庫,導入後需要改寫下麵一些東西:
對照原來的access,改寫下麵的部分:
(1)sql數據庫表是沒有自動字段的,因此原來access中的自動字段被轉換成了普通字段,需要手工改成標識類型,增量為1。
(2)所有的時間字段,如果定義了默認值,那麼原來肯定是now(),需要改成getdate()
(3)原來字段的默認值一般都不會自動引入,需要對照原表的字段手工添加。
(4)由於數據庫的不同,access和sql的字段類型很多轉換後就變化了,比如原來的《是否》字段會被轉換成bit或者int,備注字段被轉換成longtext,text字段轉換成varchar等等,一般來說不會影響程序運行,如果有問題,我們在下麵的程序改寫部分再說。
(5)如果你要用一個For SQL的程序,裏麵用到了存儲過程,那麼你應該有這個程序本身建立SQL數據庫的方法:有其本身的SQL數據庫文件,或者sql腳本;如果沒有的話,采用導入access數據庫的方式是無法建立存儲過程的,這樣你最好放棄這個For SQL的程序版本,使用同樣版本的For Access的程序,導入access數據庫,然後用下麵的改寫方法自己改成SQL版本的程序。

三、連接字符串的改寫

可參考動網的這段,分別是針對access和SQL的
Dim ConnStr
If IsSqlDataBase Then

\'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 &; ";"

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.CreateObject("ADODB.Connection")
conn.open ConnStr

當然你使用SQL的話,有關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);"
裏麵的數據庫名稱、數據源、用戶、密碼根據自己的實際情況改寫一下。

四、程序的改寫

這也有兩種情況
1、如果你幸運,拿到的是For SQL的程序,那麼如果上麵的數據庫建立過程沒有遇到麻煩,程序基本上就可以運行了,出錯的話,隻是程序本身的bug,如何修改不是這個帖子討論的內容,就不贅述了。
2、大多數情況,程序本身是For Access的,與For SQL的程序差別主要是程序中使用到的SQL查詢語句。注意,SQL查詢語句是數據庫應用不可缺少的部分,不管是For SQL還是For Aceess的程序使用的語法大體差不多,但是有一些微妙的差別,正是這些差別,造成了程序的不通用,也是我們需要修改的主要內容。這樣一般要修改的部分如下:
(1)時間函數的問題:SQL數據庫的時間函數與access不同,最常見的是取現在時間的函數,access是now(),SQL是getdate()。因此凡是在where子句中使用了now()的地方都要改成getdate();注意,now()函數在asp程序本身也要使用,凡是不在數據庫查詢或執行語句中使用的now()函數千萬不要改。
(2)時間比較函數:datediff(\'d\',\'時間1\',‘時間2’)這是access查詢用的格式,SQl中這些引號都要去掉,同時時間格式的前後可能加上了#,這也要去掉。同樣這也是指在sql語句中的,在asp語句中的要保持原樣。
(3)空值的表示:在access中,判斷空值一般用是否=""來表示,但是這在SQL中往往出錯,如果遇到出錯的問題或者程序運行不正常,可以改成如這樣判斷:where (name is null)
(4)真假值判斷:access中可以用=true、=false來判斷,但是在SQL中就會出錯,因此在SQL查詢或執行語句中這類判斷要分別改成=1、=0。注意一點:有些程序雖然寫成=“true”,但是由於有引號,所以這個字段是字符類型的,你不能改成=1,保持原樣即可。
本文版权:http://www.ndfweb.cn/news-334.html
  NDF俱乐部
  国际域名注册
  建站咨询
简体中文 NDF网站建设淘宝店 | ICO图标在线生成 | 外贸网站建设 | 联系我们
©2007-2025 NDF Corporation 鲁ICP备08005967号 Sitemap - RSSRSS订阅