[align=left]后臺(tái)數(shù)據(jù)庫(kù): [microsoft access] 與 [microsoft sql server] 更換之后,asp代碼應(yīng)注意要修改的一些地方:[/align]
[align=left]
[一]連接問題(舉例)
[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="[/align]
[align=left][二]相似函數(shù)(舉例)[/align]
[align=left][1]datediff(datepart, startdate, enddate)
其中“datepart”參數(shù)可選項(xiàng)如下:
設(shè)置 描述
————————————
[microsoft access]
年 yyyy
季度 q
月 m
一年的日數(shù) y
日 d
一周的日數(shù) w
周 ww
小時(shí) h
分鐘 n
秒 s[/align]
[align=left][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[/align]
[align=left]-------------------------[/align]
[align=left]基本上差不多,但注意的是在寫的時(shí)候,
[microsoft access]要加引號(hào),如:datediff('d',enddate,'2004/08/01')
[microsoft sql server]則不需要,如:datediff(d,enddate,'2004/08/01')[/align]
[align=left][2][microsoft access]中可用如cstr等轉(zhuǎn)數(shù)據(jù)類型函數(shù),而
[microsoft sql server]中則用convert或cast函數(shù),如:
convert(varchar,[amount])等。[/align]
[align=left][3][microsoft sql server]
取當(dāng)前時(shí)間用getdate等等...[/align]
[align=left][三]語(yǔ)句
[microsoft sql server]
可以用
case
when then
when then
...
else
end
語(yǔ)句,而
[microsoft access]
不支持。
[microsoft access]也不支持between語(yǔ)句
[microsoft sql server]則可以這樣寫:
[date] between @date1 and @date2
[四]查詢表
[microsoft sql server]
可三個(gè)及以上表join查詢,而
[microsoft access]
好像只能兩個(gè)表聯(lián)接查詢(待權(quán)威確認(rèn)),
而且[microsoft sql server]可用“*=”和“=*”連接符。[五]除零問題
[microsoft access]
在碰到除數(shù)為零時(shí),自動(dòng)丟掉相關(guān)記錄,而
[microsoft sql server]
則會(huì)報(bào)錯(cuò),且查詢中止。刪除代碼:
[microsoft access]
可以這樣寫:delete * from [table]
[microsoft sql server]
只能這樣寫:delete from [table]
多*會(huì)報(bào)錯(cuò)
_____________________________________
當(dāng)前日期:
[microsoft access]
用date()
[microsoft sql server]
用getdate()如果數(shù)據(jù)庫(kù)可能會(huì)更換類型的話,可以
在asp代碼中加上如這樣:
if instr(constr,"microsoft access") > 0 then
sqlstr=[microsoft access][sql代碼]
else
sqlstr=[microsoft sql server][sql代碼]
end if
(constr--連接字符串)
這樣即使改了數(shù)據(jù)庫(kù),也不用改數(shù)據(jù)庫(kù)查詢更新代碼了。
再加:access中有true、false的字段記錄,而sql里只有smallint,對(duì)應(yīng)如果在access里有“字段名=true”的,在sql里要改成“字段名=1”
網(wǎng)上大部分的免費(fèi)asp程序使用的是access數(shù)據(jù)庫(kù)。但是access數(shù)據(jù)庫(kù)作為一個(gè)中小型的單機(jī)數(shù)據(jù)庫(kù)系統(tǒng),在承擔(dān)訪問量、數(shù)據(jù)量大的網(wǎng)站應(yīng)用時(shí),往往就不堪重負(fù)了。一般認(rèn)為,超過50m的access數(shù)據(jù)庫(kù)性能就開始明顯下降,超過100m以后,出錯(cuò)、運(yùn)行慢的問題會(huì)更加突出。盡管可以如動(dòng)網(wǎng)7.0以后那樣,從程序的角度盡量?jī)?yōu)化以圖提高性能,但是不能從根本上解決問題。
這時(shí)也許使用微軟的sql server數(shù)據(jù)庫(kù)就是最可能的辦法,當(dāng)然也可以使用其它的如oracle、mysql等等,但是作為改寫來說,由于同為微軟的產(chǎn)品,改寫成sql server應(yīng)該是最省力的辦法。[/align]
[align=left]一、改寫前提:[/align]
[align=left]系統(tǒng)已經(jīng)安裝好sql server2000并且打上了sp3補(bǔ)?。话惭b好office套件里面的access;使用一個(gè)支持純文本編輯并且?guī)в行刑?hào)顯示的編輯器,推薦ultra edit,當(dāng)然也可以使用frontpage2003,不過以前的版本行號(hào)顯示不太好用。[/align]
[align=left]個(gè)人能力要求:會(huì)基本的asp語(yǔ)法、access數(shù)據(jù)庫(kù)的操作、sqlserver企業(yè)管理器的基本操作。[/align]
[align=left]二、數(shù)據(jù)庫(kù)的準(zhǔn)備[/align]
[align=left]一般來說有兩種情況:
1、程序提供了sql數(shù)據(jù)庫(kù)格式:有一個(gè)mdf文件,或者提供了創(chuàng)建sql數(shù)據(jù)庫(kù)的sql腳本文件(后綴名為.sql)。
如果有mdf文件,可以用企業(yè)管理器直接附加上,如果提供的是sql腳本文件,那么就先用企業(yè)管理器自己創(chuàng)建一個(gè)sql數(shù)據(jù)庫(kù),然后數(shù)據(jù)庫(kù)用企業(yè)管理器中的查詢分析器運(yùn)行這個(gè)腳本創(chuàng)建數(shù)據(jù)庫(kù)表。
這樣建立的數(shù)據(jù)庫(kù)基本不用再去改寫什么了。
2、更多的是沒有提供sql數(shù)據(jù)庫(kù)或腳本文件的,這時(shí),就要自己來做這一切了,這也是我們這個(gè)帖子主要解決的問題。一般這樣的程序會(huì)提供一個(gè)access數(shù)據(jù)庫(kù),這樣你就用企業(yè)管理器導(dǎo)入access數(shù)據(jù)庫(kù),導(dǎo)入后需要改寫下面一些東西:
對(duì)照原來的access,改寫下面的部分:
(1)sql數(shù)據(jù)庫(kù)表是沒有自動(dòng)字段的,因此原來access中的自動(dòng)字段被轉(zhuǎn)換成了普通字段,需要手工改成標(biāo)識(shí)類型,增量為1。
(2)所有的時(shí)間字段,如果定義了默認(rèn)值,那么原來肯定是now(),需要改成getdate()
(3)原來字段的默認(rèn)值一般都不會(huì)自動(dòng)引入,需要對(duì)照原表的字段手工添加。
(4)由于數(shù)據(jù)庫(kù)的不同,access和sql的字段類型很多轉(zhuǎn)換后就變化了,比如原來的《是否》字段會(huì)被轉(zhuǎn)換成bit或者int,備注字段被轉(zhuǎn)換成longtext,text字段轉(zhuǎn)換成varchar等等,一般來說不會(huì)影響程序運(yùn)行,如果有問題,我們?cè)谙旅娴某绦蚋膶懖糠衷僬f。
(5)如果你要用一個(gè)for sql的程序,里面用到了存儲(chǔ)過程,那么你應(yīng)該有這個(gè)程序本身建立sql數(shù)據(jù)庫(kù)的方法:有其本身的sql數(shù)據(jù)庫(kù)文件,或者sql腳本;如果沒有的話,采用導(dǎo)入access數(shù)據(jù)庫(kù)的方式是無(wú)法建立存儲(chǔ)過程的,這樣你最好放棄這個(gè)for sql的程序版本,使用同樣版本的for access的程序,導(dǎo)入access數(shù)據(jù)庫(kù),然后用下面的改寫方法自己改成sql版本的程序。[/align]
[align=left]三、連接字符串的改寫[/align]
[align=left]可參考動(dòng)網(wǎng)的這段,分別是針對(duì)access和sql的
dim connstr
if issqldatabase = 1 then
'sql數(shù)據(jù)庫(kù)連接參數(shù):數(shù)據(jù)庫(kù)名、用戶密碼、用戶名、連接名(本地用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
'免費(fèi)用戶第一次使用請(qǐng)修改本處數(shù)據(jù)庫(kù)地址并相應(yīng)修改data目錄中數(shù)據(jù)庫(kù)名稱,如將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[/align]
[align=left]當(dāng)然你使用sql的話,有關(guān)access的使用語(yǔ)句可以刪除,就是else后面到on error resume next前面,變成這樣:[/align]
[align=left]dim connstr
'sql數(shù)據(jù)庫(kù)連接參數(shù):數(shù)據(jù)庫(kù)名、用戶密碼、用戶名、連接名(本地用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[/align]
[align=left]也可以簡(jiǎn)潔一些,寫成這樣:
set conn = server.createobject("adodb.connection")
conn.open "provider = sqloledb; user id = sa; password = 1234567; initial catalog = dvbbs7; data source = (local);"
里面的數(shù)據(jù)庫(kù)名稱、數(shù)據(jù)源、用戶、密碼根據(jù)自己的實(shí)際情況改寫一下。[/align]
[align=left]四、程序的改寫[/align]
[align=left]這也有兩種情況
1、如果你幸運(yùn),拿到的是for sql的程序,那么如果上面的數(shù)據(jù)庫(kù)建立過程沒有遇到麻煩,程序基本上就可以運(yùn)行了,出錯(cuò)的話,只是程序本身的bug,如何修改不是這個(gè)帖子討論的內(nèi)容,就不贅述了。
2、大多數(shù)情況,程序本身是for access的,與for sql的程序差別主要是程序中使用到的sql查詢語(yǔ)句。注意,sql查詢語(yǔ)句是數(shù)據(jù)庫(kù)應(yīng)用不可缺少的部分,不管是for sql還是for aceess的程序使用的語(yǔ)法大體差不多,但是有一些微妙的差別,正是這些差別,造成了程序的不通用,也是我們需要修改的主要內(nèi)容。這樣一般要修改的部分如下:
(1)時(shí)間函數(shù)的問題:sql數(shù)據(jù)庫(kù)的時(shí)間函數(shù)與access不同,最常見的是取現(xiàn)在時(shí)間的函數(shù),access是now(),sql是getdate()。因此凡是在where子句中使用了now()的地方都要改成getdate();注意,now()函數(shù)在asp程序本身也要使用,凡是不在數(shù)據(jù)庫(kù)查詢或執(zhí)行語(yǔ)句中使用的now()函數(shù)千萬(wàn)不要改。
(2)時(shí)間比較函數(shù):datediff('d','時(shí)間1',‘時(shí)間2’)這是access查詢用的格式,sql中這些引號(hào)都要去掉,同時(shí)時(shí)間格式的前后可能加上了#,這也要去掉。同樣這也是指在sql語(yǔ)句中的,在asp語(yǔ)句中的要保持原樣。
(3)空值的表示:在access中,判斷空值一般用是否=""來表示,但是這在sql中往往出錯(cuò),如果遇到出錯(cuò)的問題或者程序運(yùn)行不正常,可以改成如這樣判斷:where (name is null)
(4)真假值判斷:access中可以用=true、=false來判斷,但是在sql中就會(huì)出錯(cuò),因此在sql查詢或執(zhí)行語(yǔ)句中這類判斷要分別改成=1、=0。注意一點(diǎn):有些程序雖然寫成=“true”,但是由于有引號(hào),所以這個(gè)字段是字符類型的,你不能改成=1,保持原樣即可。[/align]
[align=left]以上是比較常見的改寫的地方,還有一些不太常見,如果遇到了可以在此回帖討論。[/align]
[align=left]五、程序的調(diào)試[/align]
[align=left]前面推薦使用帶有行號(hào)的編輯器,是因?yàn)樯鲜龅母膶懖淮罂赡苁侵苯铀阉鞒绦蛟创a來做,很難找全。
我采取的方式一般這樣:數(shù)據(jù)庫(kù)改寫完成,直接調(diào)試程序,出錯(cuò)后,看看出錯(cuò)的提示,找到相應(yīng)文件的代碼行,但是根源往往不是那行,比如出錯(cuò)的語(yǔ)句是:conn.execute(sql),但是這句本身是沒有錯(cuò)的,錯(cuò)誤原因是里面的這個(gè)sql字符串,那就向上看這個(gè)sql字符串是如何生成的,按照上面所說的程序修改辦法修改。[/align]
[align=left]數(shù)據(jù)庫(kù)導(dǎo)入以后,自動(dòng)增加字段需要重寫,所有的數(shù)字類型需要增加長(zhǎng)度,最好用decimal。[/align]
[align=left]所有的默認(rèn)值都丟失了。主要是數(shù)字類型和日期類型。[/align]
[align=left]所有now(),time(),date()要改成getdate()。[/align]
[align=left]所有datediff('d', time1, time2)要改成datediff(day, time1, time2)[/align]
[align=left]有可能一些true/false類型不能使用,要變?yōu)?/0。[/align]
[align=left]備注類型要通過cast(column as varchar)來使用。[/align]
[align=left]cursortype要改成1,也就是打開數(shù)據(jù)庫(kù)時(shí)要給出第一個(gè)數(shù)字參數(shù)為1,否則記錄可能顯示不完整。[/align]
[align=left]isnull(rowname)要改成rowname = null[/align]
[align=left]access的數(shù)據(jù)庫(kù)中的自動(dòng)編號(hào)類型在轉(zhuǎn)化時(shí),sql server并沒有將它設(shè)為自動(dòng)編號(hào)型,我們需在sql創(chuàng)建語(yǔ)句中加上identity,表示自動(dòng)編號(hào)![/align]
[align=left]轉(zhuǎn)化時(shí),跟日期有關(guān)的字段,sql server默認(rèn)為smalldatetime型,我們最好將它變?yōu)閐atetime型,因?yàn)閐atetime型的范圍比smalldatetime型大。有時(shí)用smalldatetime型時(shí),轉(zhuǎn)化失敗,而用datetime型時(shí),轉(zhuǎn)化成功。[/align]
[align=left]對(duì)此兩種數(shù)據(jù)庫(kù)進(jìn)行操作的sql語(yǔ)句不全相同,例如:在對(duì)access數(shù)據(jù)庫(kù)進(jìn)行刪除紀(jì)錄時(shí)用:"delete * from user where id=10",而對(duì)sql server數(shù)據(jù)庫(kù)進(jìn)行刪除是用:"delete user where id=10".[/align]
[align=left]日期函數(shù)不相同,在對(duì)access數(shù)據(jù)庫(kù)處理中,可用date()、time()等函數(shù),但對(duì)sql server數(shù)據(jù)庫(kù)處理中,只能用datediff,dateadd等函數(shù),而不能用date()、time()等函數(shù)。[/align]
[align=left]在對(duì)access數(shù)據(jù)庫(kù)處理中,sql語(yǔ)句中直接可以用一些vb的函數(shù),像cstr()函數(shù),而對(duì)sql server數(shù)據(jù)庫(kù)處理中,卻不能用。
下表比較了microsoftaccess數(shù)據(jù)庫(kù)(microsoftaccess數(shù)據(jù)庫(kù):數(shù)據(jù)和對(duì)象(如表、查詢或窗體)組成的集合,與特定的主題或用途有關(guān)。microsoftjet數(shù)據(jù)庫(kù)引擎用于管理數(shù)據(jù)。)和microsoftaccess項(xiàng)目(microsoftaccess項(xiàng)目:與microsoftsqlserver數(shù)據(jù)庫(kù)連接且用于創(chuàng)建客戶/服務(wù)器應(yīng)用程序的access文件。項(xiàng)目文件中不包含任何數(shù)據(jù)或基于數(shù)據(jù)定義的對(duì)象(如表或視圖)。)的數(shù)據(jù)類型(數(shù)據(jù)類型:決定字段可擁有的數(shù)據(jù)類型的字段特征。數(shù)據(jù)類型包括boolean、integer、long、currency、single、double、date、string和variant(默認(rèn)))。[/align]
[align=left]
microsoftaccess數(shù)據(jù)類型sqlserver數(shù)據(jù)類型
是/否(“是/否”數(shù)據(jù)類型:一種字段數(shù)據(jù)類型,用于只有兩種可能值(如是或否、true或false)的字段。不允許有null值。)bit(bit數(shù)據(jù)類型:在access項(xiàng)目中,一種存儲(chǔ)值為1或0的數(shù)據(jù)類型。接受1和0以外的整數(shù)值,但總是將其解釋為1。)
數(shù)字(“數(shù)字”數(shù)據(jù)類型:microsoftaccess數(shù)據(jù)庫(kù)中的一種字段數(shù)據(jù)類型,用于將在數(shù)學(xué)運(yùn)算中使用的數(shù)值數(shù)據(jù)。但是,若要顯示或計(jì)算貨幣值,則應(yīng)使用“貨幣”數(shù)據(jù)類型。)(字節(jié))tinyint(tinyint數(shù)據(jù)類型:access項(xiàng)目中的一種占一個(gè)字節(jié)(8位)的數(shù)據(jù)類型,用于存儲(chǔ)從0到255范圍內(nèi)的整數(shù)。)
數(shù)字(整型)smallint(smallint數(shù)據(jù)類型:access項(xiàng)目中的一種2字節(jié)(16位)數(shù)據(jù)類型,存儲(chǔ)位于-2^15(-32,768)與2^15-1(32,767)之間的數(shù)字。)
數(shù)字(長(zhǎng)整型)int(int數(shù)據(jù)類型:access項(xiàng)目中的一種4字節(jié)(32位)數(shù)據(jù)類型,存儲(chǔ)位于-2^31(-2,147,483,648)與2^31-1(2,147,483,647)之間的數(shù)字。)
數(shù)字(單精度浮點(diǎn)型)real(real數(shù)據(jù)類型:在access項(xiàng)目中,一種近似的數(shù)值數(shù)據(jù)類型,精度為7位,正值取值范圍大致從1.18e-38到3.40e+38,負(fù)值取值范圍大致從-1.18e-38到-3.40e+38,也可以取0。)
(無(wú)等價(jià)的數(shù)據(jù)類型)bigint(bigint數(shù)據(jù)類型:access項(xiàng)目中的一種8字節(jié)(64位)數(shù)據(jù)類型,存儲(chǔ)位于-2^63(-9,223,372,036,854,775,808)與2^63-1(9,223,372,036,854,775,807)之間的數(shù)字。)
數(shù)字(雙精度浮點(diǎn)型)float(float數(shù)據(jù)類型:在access項(xiàng)目中,一種近似的數(shù)值數(shù)據(jù)類型,精度為15位。它所存儲(chǔ)的正值范圍大致是從2.23e-308到1.79e+308,負(fù)值范圍大致是從-2.23e-308到-1.79e+308,也可以為0。)
貨幣(“貨幣”數(shù)據(jù)類型:microsoftaccess數(shù)據(jù)庫(kù)中的一種數(shù)據(jù)類型,用于與貨幣有關(guān)的計(jì)算或其精確度極其重要的定點(diǎn)計(jì)算。)money(money數(shù)據(jù)類型:在access項(xiàng)目中,用于存儲(chǔ)貨幣值的數(shù)據(jù)類型,取值范圍從-922,337,203,685,477.5707到922,337,203,685,477.5807,精確度為萬(wàn)分之一個(gè)貨幣單位。)[/align]
[align=left]smallmoney(smallmoney數(shù)據(jù)類型:access項(xiàng)目中的一種存儲(chǔ)貨幣值的數(shù)據(jù)類型,取值范圍從-214,748.3648到214,748.3647,精確度為萬(wàn)分之一個(gè)貨幣單位。當(dāng)顯示smallmoney值時(shí),會(huì)將它們四舍五入為兩個(gè)小數(shù)位。)
小數(shù)/數(shù)值(decimal數(shù)據(jù)類型(access數(shù)據(jù)庫(kù)):精確的數(shù)值數(shù)據(jù)類型,用于存儲(chǔ)-10^38-1到10^38-1的值。可以指定數(shù)值范圍(最大總位數(shù))和精度(小數(shù)點(diǎn)右邊的最大位數(shù))。)decimal(decimal數(shù)據(jù)類型(access項(xiàng)目):精確的數(shù)值數(shù)據(jù)類型,用于存儲(chǔ)-10^38-1到10^38-1的值。可以指定數(shù)值范圍(最大總位數(shù))和精度(小數(shù)點(diǎn)右邊的最大位數(shù))。)[/align]
[align=left]numeric(numeric數(shù)據(jù)類型:在access項(xiàng)目中,一種精確的數(shù)值數(shù)據(jù)類型,取值從-10^38-1到10^38-1??梢灾付〝?shù)值范圍(最大總位數(shù))和精度(小數(shù)點(diǎn)右邊的最大位數(shù))。)
日期/時(shí)間(“日期/時(shí)間”數(shù)據(jù)類型:access數(shù)據(jù)庫(kù)的一種數(shù)據(jù)類型,用來存放日期和時(shí)間信息。)datetime(datetime數(shù)據(jù)類型:在access項(xiàng)目中,日期和時(shí)間的數(shù)據(jù)類型,范圍從1753年1月1日到9999年12月31日,精確度為三百分之一秒,即3.33毫秒。)[/align]
[align=left]smalldatetime(smalldatetime數(shù)據(jù)類型:access項(xiàng)目中的一種日期和時(shí)間數(shù)據(jù)類型,精度不如datetime時(shí)間數(shù)據(jù)類型。數(shù)據(jù)取值范圍從1900年1月1日到2079年6月6日,精確度為一分鐘。)
自動(dòng)編號(hào)(“自動(dòng)編號(hào)”數(shù)據(jù)類型:microsoftaccess數(shù)據(jù)庫(kù)中的一種字段數(shù)據(jù)類型,當(dāng)向表中添加一條新記錄時(shí),這種數(shù)據(jù)類型會(huì)自動(dòng)為每條記錄存儲(chǔ)一個(gè)唯一的編號(hào)。可以產(chǎn)生三種編號(hào):順序號(hào)、隨機(jī)號(hào)和同步復(fù)制id。)(遞增)int(int數(shù)據(jù)類型:access項(xiàng)目中的一種4字節(jié)(32位)數(shù)據(jù)類型,存儲(chǔ)位于-2^31(-2,147,483,648)與2^31-1(2,147,483,647)之間的數(shù)字。)(定義了identity屬性)
文本(“文本”數(shù)據(jù)類型:microsoftaccess數(shù)據(jù)庫(kù)中的一種字段數(shù)據(jù)類型?!拔谋尽睌?shù)據(jù)類型最多可以包含255個(gè)字符,或者是由fieldsize屬性指定的一個(gè)小一些的字符數(shù)。)(n)varchar(n)(varchar(n)數(shù)據(jù)類型:access項(xiàng)目中的一種可變長(zhǎng)度的數(shù)據(jù)類型,最大長(zhǎng)度為8,000個(gè)ansi字符。)[/align]
[align=left]nvarchar(n)(nvarchar(n)數(shù)據(jù)類型:在access項(xiàng)目中,一種可變長(zhǎng)度的數(shù)據(jù)類型,最多可含4,000個(gè)unicode字符。unicode字符每字符占兩個(gè)字節(jié),而且支持所有國(guó)際字符。)
備注(“備注”數(shù)據(jù)類型:在microsoftaccess數(shù)據(jù)庫(kù)中的一種字段數(shù)據(jù)類型?!皞渥ⅰ弊侄巫疃嗫梢园?5,535個(gè)字符。)text(text數(shù)據(jù)類型:access項(xiàng)目中的一種長(zhǎng)度可變的數(shù)據(jù)類型,最多可存儲(chǔ)2^31-1(2,147,483,647)個(gè)字符;默認(rèn)長(zhǎng)度為16。)
ole對(duì)象(“ole對(duì)象”數(shù)據(jù)類型:字段的數(shù)據(jù)類型之一,用于在其他應(yīng)用程序中創(chuàng)建的、可鏈接或嵌入(插入)到access數(shù)據(jù)庫(kù)中的對(duì)象。)image(image數(shù)據(jù)類型:在access項(xiàng)目中,一種長(zhǎng)度可變的數(shù)據(jù)類型,最多可存儲(chǔ)2^31-1(2,147,483,647)字節(jié)的二進(jìn)制數(shù)據(jù)。image數(shù)據(jù)類型用來存儲(chǔ)blob(二進(jìn)制大對(duì)象),如圖片、文檔、聲音和已編譯代碼。)
同步復(fù)制id(又名全局唯一標(biāo)識(shí)符(guid:在access數(shù)據(jù)庫(kù)中,一種用于建立同步復(fù)制唯一標(biāo)識(shí)符的16字節(jié)字段。guid用于標(biāo)識(shí)副本、副本集、表、記錄和其他對(duì)象。在access數(shù)據(jù)庫(kù)中,guid是指同步復(fù)制id。)(guid))uniqueidentifier(uniqueidentifier數(shù)據(jù)類型:在access項(xiàng)目中,16字節(jié)的全局唯一標(biāo)識(shí)符(guid)。)(僅適于sqlserver7.0或更高版本)
超鏈接(“超鏈接”數(shù)據(jù)類型:存儲(chǔ)超鏈接地址的access數(shù)據(jù)庫(kù)字段的數(shù)據(jù)類型。地址最多可以包含四部分,用以下語(yǔ)法格式編寫:displaytext#address#subaddress#。)char(char數(shù)據(jù)類型:在access項(xiàng)目中,一種固定長(zhǎng)度的數(shù)據(jù)類型,最多可含8,000個(gè)ansi字符。),[/align]
[align=left]nchar(nchar數(shù)據(jù)類型:在access項(xiàng)目中,一種固定長(zhǎng)度的數(shù)據(jù)類型,最多可含4,000個(gè)unicode字符。unicode字符每字符占兩個(gè)字節(jié),而且支持所有國(guó)際字符。),varchar,nvarchar(hyperlink屬性設(shè)為yes)
(無(wú)等價(jià)的數(shù)據(jù)類型)varbinary(varbinary數(shù)據(jù)類型:access項(xiàng)目中的一種可變長(zhǎng)度的數(shù)據(jù)類型,最多可存儲(chǔ)8,000字節(jié)的二進(jìn)制數(shù)據(jù)。)
(無(wú)等價(jià)的數(shù)據(jù)類型)smallint(smallint數(shù)據(jù)類型:access項(xiàng)目中的一種2字節(jié)(16位)數(shù)據(jù)類型,存儲(chǔ)位于-2^15(-32,768)與2^15-1(32,767)之間的數(shù)字。)
(無(wú)等價(jià)的數(shù)據(jù)類型)timestamp(timestamp數(shù)據(jù)類型:在access項(xiàng)目中,一種每插入或更新一行就會(huì)自動(dòng)更新的數(shù)據(jù)類型。timestamp列中的值不是datetime數(shù)據(jù),而是binary(8)或varbinary(8),標(biāo)明了數(shù)據(jù)修改的順序。)
(無(wú)等價(jià)的數(shù)據(jù)類型)charnchar
(無(wú)等價(jià)的數(shù)據(jù)類型)sql_variant(sql_variant數(shù)據(jù)類型:access項(xiàng)目中的一種數(shù)據(jù)類型,存儲(chǔ)除text、ntext、image、timestamp和sql_variant類型以外的多種數(shù)據(jù)類型的值。在列、參數(shù)、變量或用戶定義函數(shù)的返回值中使用。)
(無(wú)等價(jià)的數(shù)據(jù)類型)用戶定義(用戶定義的數(shù)據(jù)類型:在microsoftsqlserver數(shù)據(jù)庫(kù)中,允許某列包含的數(shù)據(jù)的類型定義,由用戶利用現(xiàn)有的系統(tǒng)數(shù)據(jù)類型定義。規(guī)則和默認(rèn)值僅可以綁定到用戶定義的數(shù)據(jù)類型。)[/align]
[align=left]注釋在access項(xiàng)目或sqlserver數(shù)據(jù)庫(kù)中,前綴“n”代表“國(guó)家/地區(qū)”,意思是這個(gè)數(shù)據(jù)類型是啟用unicode的。在access數(shù)據(jù)庫(kù)中,全部文本列在默認(rèn)情況下都是啟用unicode的。
access轉(zhuǎn)sql需要注意的問題
2006-2-13 16:01:20
很多朋友想用sql2000數(shù)據(jù)庫(kù)的編程方法,但是卻又苦于自己是學(xué)access的,對(duì)sql只是一點(diǎn)點(diǎn)的了解而已,這里我給大家提供以下參考---將access轉(zhuǎn)化成sql2000的方法和注意事項(xiàng)
一,首先,我說的是在access2000,sql2000之間轉(zhuǎn)換,其他的我也還沒有嘗試過,希望大家多多試驗(yàn),肯定是有辦法的;
二,轉(zhuǎn)換的方法
1,打開”控制面板“下”管理工具“中的”數(shù)據(jù)庫(kù)源“;
2,按”添加“添加一個(gè)新的數(shù)據(jù)源,在選擇欄里選”driverdomicrosoftaccess
(*.mdb)”,完成后將出現(xiàn)一個(gè)框,[/align]
[align=left]在”數(shù)據(jù)庫(kù)源“里面輸入你想寫的名稱,我取名叫“abc”,說明不需要填,接著,按下面的選擇,尋找你的數(shù)據(jù)庫(kù)地址和選中(注意,請(qǐng)先備份自己的access數(shù)據(jù)庫(kù)),然后確定。
數(shù)據(jù)源在這里建好了,剩下轉(zhuǎn)換了。[/align]
[align=left]3,打開sql2000企業(yè)管理器,進(jìn)入數(shù)據(jù)庫(kù),新建一個(gè)空的數(shù)據(jù)庫(kù)“abc”;
4,選擇新建立的數(shù)據(jù)庫(kù),按鼠標(biāo)右鍵,選擇“所有任務(wù)”下“導(dǎo)入數(shù)據(jù)”,按“下一步”繼續(xù);
5,在數(shù)據(jù)庫(kù)源下拉但中選擇”driverdomicrosoftaccess(*.mdb)“,在”用戶/系統(tǒng)dsn“中,選種你剛才添加的”abc“,按”下一步“;
6,“目的”不需要修改,選擇服務(wù)器(一般下為自己的本機(jī)"local",也可以選擇服務(wù)器地址或者局域網(wǎng)地址,確定你的權(quán)限是否可以操作,),"使用windows身份驗(yàn)證"指用自己的系統(tǒng)管理員身份操作,"使用sql身份操作驗(yàn)證"可以用于網(wǎng)站的操作,推薦用后者;
7,選上"使用sql身份操作驗(yàn)證"后,填寫你的用戶名和密碼,我自己選擇的是系統(tǒng)默認(rèn)號(hào)碼"sa","****",數(shù)據(jù)庫(kù)選擇剛新建的"abc",按"下一步";
8,這一步的兩個(gè)單項(xiàng)選擇,"從數(shù)據(jù)源復(fù)制表和視圖"與"用一條查詢指令指定要傳輸?shù)臄?shù)據(jù)",選擇前者,按"下一步"繼續(xù);
9,這里將出現(xiàn)你自己access數(shù)據(jù)庫(kù)的表,按"全選"后,下一步;
10,"dts導(dǎo)入/導(dǎo)出向?qū)?,看"立即運(yùn)行"被選中按"下一步",
11,按"完成"繼續(xù);
12,這個(gè)步驟你將看到你的數(shù)據(jù)被導(dǎo)入sql2000里面,當(dāng)出現(xiàn)"已經(jīng)成功把xxx個(gè)表導(dǎo)入到數(shù)據(jù)庫(kù)"的字樣,而且所有的表前面都有綠色的勾,就表示成功導(dǎo)入所有數(shù)據(jù),如果中途出現(xiàn)問題或者表前面有紅色的*的話,說明該表沒有成功導(dǎo)入,這時(shí)就要回去查看自己的操作是否正確了.[/align]
[align=left]三,數(shù)據(jù)修改
1,由于sql2000里面沒有"自動(dòng)編號(hào)",所以你的以"自動(dòng)編號(hào)"設(shè)置的字段都會(huì)變成非空的字段,這就必須手工修改這些字段,并把他的"標(biāo)示"選擇"是",種子為"1",增量為"1",
2,另外,access2000轉(zhuǎn)換成sql2000后,原來屬性為"是/否"的字段將被轉(zhuǎn)換成非空的"bit",這時(shí)候你必須修改成自己想要的屬性了;
3,另外,大家要注意對(duì)時(shí)間函數(shù)的把握.access與sql是有很多不同的.[/align]
[align=left]
四、相關(guān)的字段問題
1.access的數(shù)據(jù)庫(kù)中的自動(dòng)編號(hào)類型在轉(zhuǎn)化時(shí),sqlserver并沒有將它設(shè)為自動(dòng)編號(hào)型,我們需在sql創(chuàng)建語(yǔ)句中加上identity,表示自動(dòng)編號(hào)!
2.轉(zhuǎn)化時(shí),跟日期有關(guān)的字段,sqlserver默認(rèn)為smalldatetime型,我們最好將它變?yōu)閐atetime型,因?yàn)閐atetime型的范圍比smalldatetime型大。我遇見這種情況,用smalldatetime型時(shí),轉(zhuǎn)化失敗,而用datetime型時(shí),轉(zhuǎn)化成功。
3.對(duì)此兩種數(shù)據(jù)庫(kù)進(jìn)行操作的sql語(yǔ)句不全相同,例如:在對(duì)access數(shù)據(jù)庫(kù)進(jìn)行刪除紀(jì)錄時(shí)用:"delete*fromuserwhereid=10",而對(duì)sqlserver數(shù)據(jù)庫(kù)進(jìn)行刪除是用:"deleteuserwhereid=10".
4.日期函數(shù)不相同,在對(duì)access數(shù)據(jù)庫(kù)處理中,可用date()、time()等函數(shù),但對(duì)sqlserver數(shù)據(jù)庫(kù)處理中,只能用datediff,dateadd等函數(shù),而不能用date()、time()等函數(shù)。
5.在對(duì)access數(shù)據(jù)庫(kù)處理中,sql語(yǔ)句中直接可以用一些vb的函數(shù),像cstr()函數(shù),而對(duì)sqlserver數(shù)據(jù)庫(kù)處理中,卻不能用。[/align]
[align=left]五、相關(guān)語(yǔ)句問題
自動(dòng)增加字段需要重寫。在access中經(jīng)常使用的自動(dòng)編號(hào)字段,導(dǎo)入到mssql后,他并不是自增型的int,需要手工設(shè)置,把導(dǎo)入后的自動(dòng)編號(hào)字段的標(biāo)識(shí)的“否”改為“是”,“種子”和“遞增量”都為“1”,才能成為自動(dòng)編號(hào)[/align]
[align=left]
所有的默認(rèn)值都丟失了。主要是數(shù)字類型和日期類型[/align]
[align=left]
所有now(),time(),date()要改成getdate()[/align]
[align=left]
所有datediff('d',time1,time2)要改成datediff(day,time1,time2)[/align]
[align=left]
所有datediff('ww',time1,time2)要改成datediff(week,time1,time2)[/align]
[align=left]
所有datediff('d',time1,time2)要改成datediff(day,time1,time2)[/align]
[align=left]
在mssqlserver中,有許多保留字,在access中是沒有的,當(dāng)你把數(shù)據(jù)導(dǎo)入到mssql的時(shí)候,問題就出來了。mssql在導(dǎo)入的時(shí)候,會(huì)自動(dòng)給這些字段(包括數(shù)據(jù)庫(kù)中的表名)加上“[字段名]”,因此,你必須修改你的腳本,把相應(yīng)的字段名字(或者表名字)加上中括號(hào),或改變字段名字為不是mssql的保留字[/align]
[align=left]
在用access關(guān)于時(shí)間的使用,大家喜歡使用“select*fromaaaawhiletime="&now()”這樣的sql語(yǔ)句,然而,在mssql中沒有“now()”這個(gè)函數(shù),而是使用“getdate()”,所以,所有的sql語(yǔ)句中的“now()”必須換成“getdate()”。[/align]
[align=left]
日期函數(shù)不相同,在對(duì)access數(shù)據(jù)庫(kù)處理中,可用date()、time()等函數(shù),但對(duì)
sqlserver數(shù)據(jù)庫(kù)處理中,只能用datediff,dateadd等函數(shù),而不能用date()、time()等函數(shù)。[/align]
[align=left]轉(zhuǎn)化時(shí),跟日期有關(guān)的字段,sqlserver默認(rèn)為smalldatetime型,我們最好將它變?yōu)閐atetime型。[/align]
該文章在 2010/7/22 22:59:51 編輯過