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