程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Access數據庫 >> 關於Access數據庫 >> asp中Access與Sql Server數據庫區別總結

asp中Access與Sql Server數據庫區別總結

編輯:關於Access數據庫

後台數據庫: [Microsoft Access] 與 [Microsoft SQL Server] 更換之後,ASP代碼應注意要修改的一些地方:

[一]連接問題(舉例)

[Microsoft Access]

constr = "DBQ=c:\data\clwz.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 
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文件。項目文件中不包含任何數據或基於數據定義的對象(如表或視圖)。)的數據類型(數據類型:決定字段可擁有的數據類型的字段特征。數據類型包括Boolean、Integer、Long、Currency、Single、Double、Date、String和Variant(默認))。

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,036,854,775,807)之間的數字。)

數字(雙精度浮點型)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,精確度為萬分之一個貨幣單位。)

smallmoney(smallmoney數據類型:Access項目中的一種存儲貨幣值的數據類型,取值范圍從-214,748.3648到214,748.3647,精確度為萬分之一個貨幣單位。當顯示smallmoney值時,會將它們四捨五入為兩個小數位。)

小數/數值(decimal數據類型(Access數據庫):精確的數值數據類型,用於存儲-10^38-1到10^38-1的值。可以指定數值范圍(最大總位數)和精度(小數點右邊的最大位數)。)decimal(decimal數據類型(Access項目):精確的數值數據類型,用於存儲-10^38-1到10^38-1的值。可以指定數值范圍(最大總位數)和精度(小數點右邊的最大位數)。)

numeric(numeric數據類型:在Access項目中,一種精確的數值數據類型,取值從-10^38-1到10^38-1。可以指定數值范圍(最大總位數)和精度(小數點右邊的最大位數)。)

日期/時間(“日期/時間”數據類型:Access數據庫的一種數據類型,用來存放日期和時間信息。)datetime(datetime數據類型:在Access項目中,日期和時間的數據類型,范圍從1753年1月1日到9999年12月31日,精確度為三百分之一秒,即3.33毫秒。)

smalldatetime(smalldatetime數據類型:Access項目中的一種日期和時間數據類型,精度不如datetime時間數據類型。數據取值范圍從1900年1月1日到2079年6月6日,精確度為一分鐘。)

自動編號(“自動編號”數據類型:MicrosoftAccess數據庫中的一種字段數據類型,當向表中添加一條新記錄時,這種數據類型會自動為每條記錄存儲一個唯一的編號。可以產生三種編號:順序號、隨機號和同步復制ID。)(遞增)int(int數據類型:Access項目中的一種4字節(32位)數據類型,存儲位於-2^31(-2,147,483,648)與2^31-1(2,147,483,647)之間的數字。)(定義了Identity屬性)

文本(“文本”數據類型:MicrosoftAccess數據庫中的一種字段數據類型。“文本”數據類型最多可以包含255個字符,或者是由FIEldSize屬性指定的一個小一些的字符數。)(n)varchar(n)(varchar(n)數據類型:Access項目中的一種可變長度的數據類型,最大長度為8,000個ANSI字符。)

nvarchar(n)(nvarchar(n)數據類型:在Access項目中,一種可變長度的數據類型,最多可含4,000個Unicode字符。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)字節的二進制數據。image數據類型用來存儲BLOB(二進制大對象),如圖片、文檔、聲音和已編譯代碼。)

同步復制ID(又名全局唯一標識符(GUID:在Access數據庫中,一種用於建立同步復制唯一標識符的16字節字段。GUID用於標識副本、副本集、表、記錄和其他對象。在Access數據庫中,GUID是指同步復制ID。)(GUID))uniqueidentifier(uniqueidentifIEr數據類型:在Access項目中,16字節的全局唯一標識符(GUID)。)(僅適於SQLServer7.0或更高版本)

超鏈接(“超鏈接”數據類型:存儲超鏈接地址的Access數據庫字段的數據類型。地址最多可以包含四部分,用以下語法格式編寫:displaytext#address#subaddress#。)

char(char數據類型:在Access項目中,一種固定長度的數據類型,最多可含8,000個ANSI字符。), nchar(nchar數據類型:在Access項目中,一種固定長度的數據類型,最多可含4,000個Unicode字符。Unicode字符每字符占兩個字節,而且支持所有國際字。),varchar,nvarchar(Hyperlink屬性設為Yes)

(無等價的數據類型)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項目或SQLServer數據庫中,前綴“n”代表“國家/地區”,意思是這個數據類型是啟用Unicode的。在Access數據庫中,全部文本列在默認情況下都是啟用Unicode的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved