後台資料庫:
[Microsoft Access]
與
[Microsoft Sql Server]
更換之後,ASP程式碼應注意要修改的一些地方:
[一]連線問題(舉例)
[Microsoft Access]
constr = "DBQ=c:dataclwz.mdb; DRIVER={Microsoft Access Driver (*.mdb)}"
[Microsoft Sql Server]
constr = "DRIVER={SQL Server};SERVER=host;DATABASE=mydata;uid=sa;pwd="
[二]相似函數(舉例)
[1]DATEDIFF(datepart, startdate, enddate)
其中「datepart」參數可選項如下:
設定描述————————————
[Microsoft Access]
年yyyy
季度q
月m
一年的日數y
日d
一週的日數w
週ww
小時h
分鐘n
秒s
[Microsoft Sql Server]
year yy, yyyy
quarter qq, q
month mm, m
dayofyear dy, y
day dd, d
week wk, ww
hour hh
minute mi, n
second ss, s
millisecond ms
-------------------------
基本上差不多,但注意的是寫的時候,
[Microsoft Access]要加引號,如:datediff('d',enddate,'2004/08/01')
[Microsoft Sql Server]則不需要,如:datediff(d,enddate,'2004/08/01')
[2][Microsoft Access]中可用如cstr等轉資料型別函數,而
[Microsoft Sql Server]中則以convert或cast函數,如:
convert(varchar,[amount])等。
[3][Microsoft Sql Server]
取目前時間用getdate等等...
[三]語句
[Microsoft Sql Server]
可以用
CASE
WHEN THEN
WHEN THEN
……
ELSE
END
語句,而
[Microsoft Access]
不支援。
[Microsoft Access]也不支援between語句
[Microsoft Sql Server]則可以這樣寫:
[date] between @date1 and @date2
[四]查詢表
[Microsoft Sql Server]
可三個以上表join查詢,而
[Microsoft Access]
好像只能兩個表格聯接查詢(待權威確認),
而且[Microsoft Sql Server]可用「*=」和「=*」連線符號。 [五]除零問題
[Microsoft Access]
碰到除數為零時,自動丟掉相關記錄,而
[Microsoft Sql Server]
則會報錯,且查詢中止。刪除代碼:
[Microsoft Access]
可以這樣寫:delete * from [table]
[Microsoft SQL Server]
只能這樣寫:delete from [table]
多*會報錯
_____________________________________
目前日期:
[Microsoft Access]
用date()
[Microsoft SQL Server]
用getdate()如果資料庫可能會更換類型的話,可以在ASP程式碼中加上如這樣:
if inStr(constr,"Microsoft Access") > 0 then
sqlstr=[Microsoft Access][sql程式碼]
else
sqlstr=[Microsoft Sql Server][sql程式碼]
end if
(constr--連接字串)
這樣即使改了資料庫,也不用改資料庫查詢更新程式碼了。
再加:access中有true、false的字段記錄,而sql裡只有smallint,對應如果在access裡有“字段名=true”的,在sql裡要改成“字段名=1”
網路上大部分的免費asp程式使用的是access資料庫。但是access資料庫作為一個中小型的單機資料庫系統,在承擔訪問量、資料量大的網站應用時,往往就不堪重負了。一般認為,超過50M的access資料庫效能就開始明顯下降,超過100M以後,出錯、運行慢的問題會更加突出。儘管可以如動網7.0以後那樣,從程序的角度盡量優化以圖提高性能,但是不能從根本上解決問題。
這時或許使用微軟的SQL Server資料庫就是最可能的辦法,當然也可以使用其它的如Oracle、MySQL等等,但作為改寫來說,由於同為微軟的產品,改寫成SQL Server應該是最省力的辦法。
一、改寫前提:
系統已經安裝好SQL Server2000並且打上了SP3補丁;安裝好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 = 1 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
'http://www.downcodes.com/
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 = "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
也可以簡潔一些,寫成這樣:
Set conn = Server.CreateObject("ADODB.Connection")
conn.open "Provider = Sqloledb; User ID = sa; Password = 1234567; Initial Catalog = dvbbs7; 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,保持原樣即可。
以上是比較常見的改寫的地方,還有一些不太常見,如果遇到了可以在此回帖討論。
五、程式的調試
前面推薦使用有行號的編輯器,是因為上述的改寫不大可能是直接搜尋程式原始碼來做,很難找全。
我採取的方式一般這樣:資料庫改寫完成,直接調試程序,出錯後,看看出錯的提示,找到相應文件的代碼行,但是根源往往不是那行,比如出錯的語句是:conn.execute(sql) ,但這句話本身是沒有錯的,錯誤原因是裡面的這個sql字串,那就向上看這個sql字串是如何產生的,按照上面所說的程式修改辦法修改。
資料庫導入以後,自動增加欄位需要重寫,所有的數字類型需要增加長度,最好用decimal。
所有的預設值都遺失了。主要是數字類型和日期類型。
所有now(),time(),date()要改成getdate()。
所有datediff('d', time1, time2)要改成datediff(day, time1, time2)
有可能有些true/false類型不能使用,要變成1/0。
備註類型要透過cast(column as varchar)來使用。
CursorType要改成1,也就是開啟資料庫時要給予第一個數字參數為1,否則記錄可能顯示不完整。
isnull(rowname)要改成rowname = null
ACCESS的資料庫中的自動編號類型在轉換時,sql server並沒有將它設為自動編號型,我們需在SQL建立語句中加上identity,表示自動編號!
轉換時,跟日期相關的字段,SQL SERVER預設為smalldatetime型,我們最好將它變成datetime型,因為datetime型的範圍比smalldatetime型大。有時用smalldatetime型時,轉換失敗,而用datetime型時,轉化成功。
對此兩種資料庫進行操作的sql語句不全相同,例如:在對ACCESS資料庫進行刪除紀錄時用:"delete * from user where id=10",而對SQL SERVER資料庫進行刪除是用:"delete user where id=10".
日期函數不相同,在對ACCESS資料庫處理中,可用date()、time()等函數,但對SQL SERVER資料庫處理中,只能用datediff,dateadd等函數,而不能用date( )、time()等函數。
在對ACCESS資料庫處理中,sql語句中直接可以用一些VB的函數,像cstr()函數,而對SQL SERVER資料庫處理中,卻不能用。
下表比較了MicrosoftAccess資料庫(MicrosoftAccess資料庫:資料和物件(如表格、查詢或表單)組成的集合,與特定的主題或用途有關。MicrosoftJet資料庫引擎用於管理資料。)和MicrosoftAccess專案(MicrosoftAccess專案:與MicrosoftSQLServer資料庫連接且用於建立客戶/伺服器應用程式的Access檔案。資料類型的欄位特徵。
MicrosoftAccess資料類型SQLServer資料類型是/否(「是/否」資料類型:一種欄位資料類型,用於只有兩種可能值(如是或否、True或False)的欄位。不允許有Null值。) bit(bit資料類型:在Access專案中,儲存值為1或0的資料類型。接受1和0以外的整數值,但總是將其解釋為1。)
數字(「數字」資料類型:MicrosoftAccess資料庫中的一種欄位資料類型,用於將在數學運算中使用的數值資料。但是,若要顯示或計算貨幣值,則應使用「貨幣」資料類型。) (位元組)tinyint(tinyint資料類型:Access項目中的一種佔一個位元組(8位元)的資料類型,用於儲存從0到255範圍內的整數。)
數字(整數)smallint(smallint資料型態:Access項目中的一種2位元組(16位元)資料類型,儲存位於-2^15(-32,768)與2^15-1(32,767)之間的數字。
數字(長整型)int(int資料型態:Access項目中的一種4位元組(32位元)資料型,儲存位於-2^31(-2,147,483,648)與2^31-1(2,147,483,647)之間的數字。
數字(單精度浮點型)real(real數據類型:在Access項目中,一種近似的數值資料類型,精度為7位,正值取值範圍大致從1.18E-38到3.40E+38,負值取值範圍大致從-1.18E-38到-3.40E+38,也可以取0。
(無等價的資料型別)bigint(bigint資料型態:Access專案中的8位元組(64位元)資料類型,儲存位於-2^63(-9,223,372,036,854,775,808)與2^63-1(9,223,372,03,854,85854,85485,854,075,854,8585,85485,間的數字。
數字(雙精度浮點型)float(float資料型態:在Access項目中,一種近似的數值資料型,精確度為15位。它所儲存的正值範圍大致是從2.23E-308到1.79E+ 308,負值範圍大致是從-2.23E-308到-1.79E+308,也可以是0。
貨幣(「貨幣」資料類型:MicrosoftAccess資料庫中的一種資料類型,用於與貨幣相關的計算或其精確度極為重要的定點計算。)money(money資料類型:在Access專案中,用於儲存貨幣值的資料類型,取值範圍從-922,337,203,685,477.5707到922,337,203,685,477.5807,精確度為萬分之一個貨幣單位
。 214,748.3648到214,748.3647,精確度為萬分之一個貨幣單位。
小數/數值(decimal資料類型(Access資料庫):精確的數值資料類型,用於儲存-10^38-1到10^38-1的值。可以指定數值範圍(最大總位數)和精確度(小數點右邊的最大位數)。數)和精度(小數點右邊的最大位數)
。指定數值範圍(最大總位數)和精確度(小數點右邊的最大位數)。
日期/時間(「日期/時間」資料類型:Access資料庫的一種資料類型,用來存放日期和時間資訊。)datetime(datetime資料類型:在Access項目中,日期和時間的資料類型,範圍從1753
精確
度為三百分之一秒,即3.33毫秒。
資料類型。
自動編號(「自動編號」資料類型:MicrosoftAccess資料庫中的一種欄位資料類型,當在表中新增一筆記錄時,此資料類型會自動為每筆記錄儲存一個唯一的編號。可以產生三種編號:順序號、隨機號碼和同步複製ID。 ^31-1(2,147,483,647)之間的數字。
文字(「文字」資料類型:MicrosoftAccess資料庫中的一種欄位資料類型。「文字」資料類型最多可以包含255個字符,或是由FieldSize屬性指定的一個小一些的字元數。)(n)varchar( n) (varchar(n) 資料類型:Access項目中的一種可變長度的資料類型,最大長度為8,000個ANSI字元。)
nvarchar(n)(nvarchar(n)資料類型:在Access專案中,一種可變長度的資料類型,最多可含4,000個Unicode字元。
備註(「備註」資料類型:在MicrosoftAccess資料庫中的一種欄位資料類型。「備註」欄位最多可以包含65,535個字元。)text(text資料類型:Access項目中的一種長度可變的資料類型,最多可儲存2^31-1(2,147,483,647)個字元;預設長度為16。
OLE物件(「OLE物件」資料類型:欄位的資料類型之一,用於在其他應用程式中建立的、可連結或嵌入(插入)到Access資料庫中的物件。)image(image資料類型:在Access專案中,長度可變的資料類型,最多可儲存2^31-1(2,147,483,647)位元組的二進位資料。編譯程式碼。
同步複製ID(又稱全域唯一識別碼(GUID:在Access資料庫中,一種用於建立同步複製唯一識別碼的16位元組欄位。GUID用於識別副本、副本集、表、記錄和其他物件。在Access資料庫中,GUID是指同步複製ID。高版本)
超連結(「超連結」資料類型:儲存超連結位址的Access資料庫欄位的資料類型。位址最多可以包含四部分,用以下語法格式編寫:displaytext#address#subaddress#。)char(char資料類型:在
在Access專案中,一種固定長度
的資料類型,最多可含8,000個ANSI字元。
字元每個字元佔兩個位元組,而且支援所有國際字元。
(無等價的資料類型)varbinary(varbinary資料類型:Access專案中的一種可變長度的資料類型,最多可儲存8,000位元組的二進位資料。)
(無等價的資料型態)smallint(smallint資料型態:Access項目中的一種2位元組(16位元)資料類型,儲存位於-2^15(-32,768)與2^15-1(32,767)之間的數字。
(無等價的資料類型)timestamp(timestamp資料類型:在Access專案中,一種每插入或更新一行就會自動更新的資料類型。timestamp列中的值不是datetime數據,而是binary(8)或varbinary(8),標示了資料修改的順序。
(無等價的資料型態)charnchar
(無等價的資料類型)sql_variant(sql_variant資料類型:Access項目中的一種資料類型,儲存除text、ntext、image、timestamp和sql_variant類型以外的多種資料類型的值。在列、參數、變數或用戶定義函數的返回值中使用。
(無等價的資料類型)使用者定義(使用者定義的資料類型:在MicrosoftSQLServer資料庫中,允許某列包含的資料的類型定義,由使用者利用現有的系統資料類型定義。規則和預設值僅可以綁定定到使用者定義的資料類型
。在Access資料庫中,全部文字列在預設情況下都是啟用Unicode的。
ACCESS轉SQL需要注意的問題
2006-2-13 16:01:20
很多朋友想用SQL2000資料庫的程式設計方法,但是卻又苦於自己是學ACCESS的,對SQL只是一點點的了解而已,這裡我給大家提供以下參考---將ACCESS轉化成SQL2000的方法和注意事項一,首先,我說的是在ACCESS2000,SQL2000之間轉換,其他的我也還沒嘗試過,希望大家多多試驗,肯定是有辦法的;
二,轉換的方法
1,開啟」控制面板「下」管理工具「中的」資料庫來源「;
2,按」新增「新增一個新的資料來源,在選擇欄裡選」DriverdomicrosoftAccess
(*.mdb)」,完成後將出現一個框,
在」資料庫來源「裡面輸入你想寫的名稱,我取名叫「ABC」,說明不需要填,接著,按下面的選擇,尋找你的資料庫位址和選取(注意,請先備份自己的ACCESS資料庫),然後確定。
資料來源在這裡建好了,剩下轉換了。
3,開啟SQL2000企業管理器,進入資料庫,新建一個空的資料庫「ABC」;
4,選擇新建立的資料庫,按滑鼠右鍵,選擇“所有任務”下“匯入資料”,按“下一步”繼續;
5,在資料庫來源下拉但中選擇”DriverdomicrosoftAccess(*.mdb)“,在”使用者/系統DSN“中,選種你剛才新增的”ABC“,按”下一步“;
6,「目的」不需要修改,選擇伺服器(一般下為自己的本機"local",也可以選擇伺服器位址或區域網路位址,確定你的權限是否可以操作,),"使用WINDOWS身份驗證"指用自己的系統管理員身份操作,"使用SQL身份操作驗證"可以用於網站的操作,推薦用後者;
7,選上"使用SQL身分操作驗證"後,填寫你的使用者名稱和密碼,我自己選擇的是系統預設號碼"sa","****",資料庫選擇剛新建的"ABC",按"下一步";
8,這一步驟的兩個單項選擇,"從資料來源複製表和視圖"與"用一條查詢指令指定要傳輸的資料",選擇前者,按"下一步"繼續;
9,這裡將出現你自己ACCESS資料庫的表,按"全選"後,下一步;
10,"DTS導入/匯出精靈",看"立即運行"被選取按"下一步",
11,按"完成"繼續;
12,這個步驟你將會看到你的資料被導入SQL2000裡面,當出現"已經成功把XXX個表導入到資料庫"的字樣,而且所有的表前面都有綠色的勾,就表示成功導入所有資料,如果中途出現問題或表前面有紅色的*的話,說明該表沒有成功導入,這時就要回去查看自己的操作是否正確了.
三,數據修改
1,由於SQL2000裡面沒有"自動編號",所以你的以"自動編號"設定的欄位都會變成非空的欄位,這就必須手工修改這些欄位,並把他的"標示"選擇"是",種子為"1",增量為"1",
2,另外,ACCESS2000轉換成SQL2000後,原來屬性為"是/否"的字段將被轉換成非空的"bit",這時候你必須修改成自己想要的屬性了;
3,另外,大家要注意對時間函數的把握.ACCESS與SQL是有很多不同的.
四、相關的字段問題
1.ACCESS的資料庫中的自動編號類型在轉換時,sqlserver並沒有將它設為自動編號型,我們需在SQL建立語句中加上identity,表示自動編號!
2.轉換時,跟日期有關的字段,SQLSERVER預設為smalldatetime型,我們最好將它變成datetime型,因為datetime型的範圍比smalldatetime型大。我遇見這種情況,用smalldatetime型時,轉化失敗,而用datetime型時,轉化成功。
3.對此兩種資料庫進行操作的sql語句不全相同,例如:在對ACCESS資料庫進行刪除紀錄時用:"delete*fromuserwhereid=10",而對SQLSERVER資料庫進行刪除是用:"deleteuserwhereid=10".
4.日期函數不相同,在對ACCESS資料庫處理中,可用date()、time()等函數,但對SQLSERVER資料庫處理中,只能用datediff,dateadd等函數,而不能用date()、time( )等函數。
5.在對ACCESS資料庫處理中,sql語句中直接可以用一些VB的函數,像cstr()函數,而對SQLSERVER資料庫處理中,卻不能用。
五、相關語句問題自動增加欄位需要重寫。在access中經常使用的自動編號字段,導入到mssql後,他並不是自增型的int,需要手工設置,把導入後的自動編號字段的標識的“否”改為“是”,“種子”和“遞增量”都為“1”,才能成為自動編號
所有的預設值都遺失了。主要是數字類型和日期類型
所有now(),time(),date()要改成getdate()
所有datediff('d',time1,time2)要改成datediff(day,time1,time2)
所有datediff('ww',time1,time2)要改成datediff(week,time1,time2)
所有datediff('d',time1,time2)要改成datediff(day,time1,time2)
在mssqlserver中,有許多保留字,在access中是沒有的,當你把資料匯入到mssql的時候,問題就出來了。 mssql在導入的時候,會自動給這些字段(包括資料庫中的表名)加上“[字段名]”,因此,你必須修改你的腳本,把相應的字段名字(或表名)加上中括號,或改變字段名字為不是mssql的保留字
在用access關於時間的使用,大家喜歡使用“select*fromaaaawhiletime="&now()”這樣的sql語句,然而,在mssql中沒有“now()”這個函數,而是使用“getdate()”,所以,所有的sql語句中的「now()」必須換成「getdate()」。
日期函數不相同,在對ACCESS資料庫處理中,可用date()、time()等函數,但對
SQLSERVER資料庫處理中,只能用datediff,dateadd等函數,而不能用date()、time()等函數。
轉換時,跟日期相關的字段,SQLSERVER預設為smalldatetime型,我們最好將它變成datetime型。