網(wǎng)上找到 ,收藏,未經(jīng)驗(yàn)證。
新手asp編程的基本法則 [新手必看] 2009-6-17 更新
一、新手常犯的錯(cuò)誤
在論壇看到很多帖子代碼中都有一個(gè)共同的基本錯(cuò)誤,字段類型錯(cuò)誤。
程序和數(shù)據(jù)庫(kù)是緊緊相連的,數(shù)據(jù)庫(kù)字段文本型或時(shí)間型的都使用單引號(hào)
比如下面這段修改語(yǔ)句:
conn.execute "update Counts set counts='"&counts&"' where num="&num&" and Atime='"&now()&"'"
等號(hào)左邊都是字段名,等號(hào)右邊是傳值過(guò)來(lái)的變量名,counts 字段是文本型,所以寫(xiě)入時(shí)必須前后加單引號(hào),無(wú)論是寫(xiě)入還是查詢都一樣,后面的查尋語(yǔ)句中,num 字段是數(shù)字型,所以前后就沒(méi)有單引號(hào)了,Atime 字段是時(shí)間型所以前后也要加單引號(hào)。
最重要的是以ID查詢,ID字段是唯一的并且數(shù)字類型,很明顯查詢ID號(hào)時(shí)前后也不能有單引號(hào)
conn.execute "update Counts set counts='"&counts&"' where id='"&id&"'" '錯(cuò)誤寫(xiě)法
conn.execute "update Counts set counts='"&counts&"' where id="&id '正確寫(xiě)法
二、ACCESS 數(shù)據(jù)庫(kù)連接
通常數(shù)據(jù)庫(kù)連接有兩種方式,新手基本不知道用哪一種方式,或者在什么情況下用哪一種,又或者不知道兩者的原理
①直接連接數(shù)據(jù)庫(kù)文件
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ="&Server.MapPath("database/yanhang.mdb")
②通過(guò)數(shù)據(jù)源來(lái)連接數(shù)據(jù)庫(kù)文件
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="&Server.MapPath("database/yanhang.mdb")
那么,兩者到底哪一個(gè)好呢,當(dāng)然是第二種,因?yàn)榈谝环N其實(shí)就是客戶端瀏覽器直接讀取數(shù)據(jù)庫(kù)的,所以安全方面差很多,第二種通過(guò)數(shù)據(jù)源連接,是以服務(wù)器數(shù)據(jù)源工具連接的,與客戶端沒(méi)關(guān)系,所以數(shù)據(jù)庫(kù)不會(huì)暴露給客戶端,安全系數(shù)高很多。
ACCESS 數(shù)據(jù)庫(kù)對(duì)應(yīng)程序的應(yīng)用:①直接連接數(shù)據(jù)庫(kù)文件
conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ="&Server.MapPath("database/yanhang.mdb")
這樣的數(shù)據(jù)庫(kù)連接方式,添加語(yǔ)句:
set rs=server.createobject("adodb.recordset") '(正確寫(xiě)法)
rs.open "select * from dndj",conn,1,3
rs.addnew
rs("bh") = bh
rs("bm") = bm
rs("xm") = xm
rs("xsq") = xsq
rs.update
rs.close
set rs=nothing
set rs=server.createobject("adodb.recordset") '(錯(cuò)誤寫(xiě)法)
sql="insert into dndj(bh,bm,xm,xsq) values('bh','bm','xm','xsq')"
rs.open sql,conn,1,3
ACCESS 數(shù)據(jù)庫(kù)對(duì)應(yīng)程序的應(yīng)用:②通過(guò)數(shù)據(jù)源來(lái)連接數(shù)據(jù)庫(kù)文件
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="&Server.MapPath("database/yanhang.mdb")
這樣的數(shù)據(jù)庫(kù)連接方式,添加語(yǔ)句:
conn.execute "insert into dndj(bh,bm,xm,xsq) values('"&bh&"','"&bm&"','"&xm&"','"&xsq&"')" '(正確寫(xiě)法)
set rs=server.createobject("adodb.recordset") '(錯(cuò)誤寫(xiě)法)
sql="insert into dndj(bh,bm,xm,xsq) values('bh','bm','xm','xsq')"
rs.open sql,conn,1,3
三、雙引號(hào)的應(yīng)用
通常我們寫(xiě)超級(jí)連接這樣 <a href="abc.asp?id=<%=rs("id")%>">超級(jí)連接</a>
但要是把這個(gè)超級(jí)連接編譯進(jìn)asp里面呢
response.write "<a href=""abc.asp?id="&rs("id")&""">超級(jí)連接</a>" '(正確寫(xiě)法)
response.write "<a href='abc.asp?id="&rs("id")&"'>超級(jí)連接</a>" '(正確寫(xiě)法)
response.write "<a href=abc.asp?id="&rs("id")&">超級(jí)連接</a>" '(正確寫(xiě)法)
response.write "<a href="abc.asp?id=<%=rs("id")%>">超級(jí)連接</a>" '(錯(cuò)誤寫(xiě)法)
response.write "<a href="abc.asp?id="&rs("id")&"">超級(jí)連接</a>" '(錯(cuò)誤寫(xiě)法)
表單編譯進(jìn)asp里 <input type="text" name="id" value="<%rs("id")%>" />
response.write "<input type=""text"" name=""id"" value="""&rs("id")&""" />" '(正確寫(xiě)法) 注意:這里有三個(gè)雙引號(hào)
response.write "<input type='text' name='id' value='"&rs("id")&"' />" '(正確寫(xiě)法)
response.write "<input type=text name=id value="&rs("id")&" />" '(正確寫(xiě)法)
response.write "<input type="text" name="id" value="<%=rs("id")%>" />" '(錯(cuò)誤寫(xiě)法)
response.write "<input type="text" name="id" value=""&rs("id")&"" />" '(錯(cuò)誤寫(xiě)法)
四、防止ACCESS數(shù)據(jù)庫(kù)被下載的幾個(gè)方法
很多動(dòng)態(tài)站點(diǎn)大量應(yīng)用了數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)理所當(dāng)然成了一個(gè)站點(diǎn)的核心文件。一旦數(shù)據(jù)庫(kù)被非法下載,極有可能被惡意人士破壞網(wǎng)站?;蛘吒`取資料。
下面提供的方法分別適用使用虛擬主機(jī)空間的用戶和有IIS控制權(quán)的用戶!
一:購(gòu)買虛擬主機(jī)空間的,適合沒(méi)有IIS控制權(quán)
1:發(fā)揮你的想象力 修改數(shù)據(jù)庫(kù)文件名
這個(gè)是最基本的。我想現(xiàn)在也沒(méi)有多少連數(shù)據(jù)庫(kù)文件名都懶得改的人吧? 至于改成什么,你自己看著辦,至少要保證文件名復(fù)雜,不可猜測(cè)性。當(dāng)然這個(gè)時(shí)候你的數(shù)據(jù)庫(kù)所在目錄是不能開(kāi)放目錄瀏覽權(quán)限的!
2:數(shù)據(jù)庫(kù)名后綴改為ASA、ASP等
這個(gè)聽(tīng)說(shuō)很流行,不過(guò)我測(cè)試了好多次,發(fā)現(xiàn)并不理想,如果真正要起到防止下載的作用,要進(jìn)行一些二進(jìn)制字段添加等設(shè)置,一句話,繁而復(fù)雜(如果你的數(shù)據(jù)庫(kù)有很多的話,這個(gè)方法實(shí)在不是很好)
3:數(shù)據(jù)庫(kù)名前加“#”
只需要把數(shù)據(jù)庫(kù)文件前名加上#、然后修改數(shù)據(jù)庫(kù)連接文件(如conn.asp)中的數(shù)據(jù)庫(kù)地址。原理是下載的時(shí)候只能識(shí)別 #號(hào)前名的部分,對(duì)于后面的自動(dòng)去掉,比如你要下載:http://bbs.bccn.net/date/#123.mdb (假設(shè)存在的話)。無(wú)論是IE還是FLASHGET等下到的都是 http://bbs.bccn.net/date/index.htm
今天來(lái)看到57樓的兄弟說(shuō)前面加“#”根本就是垃圾,后來(lái)測(cè)試了下
使用%23的確能下載:http://bbs.bccn.net/date/[color=red]%23123.mdb
后來(lái)我研究了下,中間加空格的瀏覽器自動(dòng)編譯成 %20 也是能夠下載的
最后索性都不用,我就使用#+空格的編譯碼 %23%20.mdb 作為數(shù)據(jù)庫(kù)名字
http://bbs.bccn.net/date/%23%20.mdb
經(jīng)過(guò)測(cè)試,使用迅雷和普通的下載工具都不能下載[/color]
4:加密數(shù)據(jù)庫(kù)
用ACCESS將你的數(shù)據(jù)庫(kù)以獨(dú)占方式打開(kāi)后,在工具-安全-設(shè)置數(shù)據(jù)庫(kù)密碼,加密后要修改數(shù)據(jù)庫(kù)連接頁(yè), 如:
conn.open "driver={microsoft access driver (*.mdb)};uid=admin;pwd=數(shù)據(jù)庫(kù)密碼;dbq=數(shù)據(jù)庫(kù)路徑"
這樣修改后,數(shù)據(jù)庫(kù)即使被人下載了,別人也無(wú)法打開(kāi)(前提是你的數(shù)據(jù)庫(kù)連接頁(yè)中的密碼沒(méi)有被泄露)
但值得注意的是,由于Access數(shù)據(jù)庫(kù)的加密機(jī)制比較簡(jiǎn)單,即使設(shè)置了密碼,解密也很容易。該數(shù)據(jù)庫(kù)系統(tǒng)通過(guò)將用戶輸入的密碼與某一固定密鑰進(jìn)行“異或”來(lái)形成一個(gè)加密串,并將其存儲(chǔ)在*.mdb文件從地址“&H42”開(kāi)始的區(qū)域內(nèi)。所以一個(gè)好的程序員可以輕松制作一個(gè)幾十行的小程序就可以輕松地獲得任何Access數(shù)據(jù)庫(kù)的密碼。因此,只要數(shù)據(jù)庫(kù)被下載,其安全依然是個(gè)未知數(shù)。
二:有主機(jī)控制權(quán) (當(dāng)然虛擬空間的設(shè)置在這里依然可以用)
5:數(shù)據(jù)庫(kù)放在WEB目錄外
如你的WEB目錄是e:webroot,可以把數(shù)據(jù)庫(kù)放到e:data這個(gè)文件夾里,在e:webroot里的數(shù)據(jù)庫(kù)連接頁(yè)中
修改數(shù)據(jù)庫(kù)連接地址為:"../data/#123 456.mdb" 的形式,這樣數(shù)據(jù)庫(kù)可以正常調(diào)用,但是無(wú)法下載的,因?yàn)樗辉赪EB目錄里!這個(gè)方法一般也適合購(gòu)買虛擬空間的用戶。
6:使用ODBC數(shù)據(jù)源。
在ASP等程序設(shè)計(jì)中,如果有條件,應(yīng)盡量使用ODBC數(shù)據(jù)源,不要把數(shù)據(jù)庫(kù)名寫(xiě)在程序中,否則,數(shù)據(jù)庫(kù)名將隨ASP源代碼的失密而一同失密
例如:
conn.open "driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("../123/abc/asfadf.mdb")
可見(jiàn),即使數(shù)據(jù)庫(kù)名字起得再怪異,隱藏的目錄再深,ASP源代碼失密后,也很容易被下載下來(lái)。
如果使用ODBC數(shù)據(jù)源,就不會(huì)存在這樣的問(wèn)題了:conn.open "ODBC-DSN名" ,不過(guò)這樣是比較煩的,目錄移動(dòng)的話又要重新設(shè)置數(shù)據(jù)源了!
7:添加數(shù)據(jù)庫(kù)名的如MDB的擴(kuò)展映射
這個(gè)方法就是通過(guò)修改IIS設(shè)置來(lái)實(shí)現(xiàn),適合有IIS控制權(quán)的朋友,不適合購(gòu)買虛擬主機(jī)用戶(除非管理員已經(jīng)設(shè)置了)。這個(gè)方法我認(rèn)為是目前最好的。只要修改一處,整個(gè)站點(diǎn)的數(shù)據(jù)庫(kù)都可以防止被下載。無(wú)須修改代碼即使暴露目標(biāo)地址也可以防止下載。
設(shè)置:
在 IIS屬性—主目錄—配置—映射—應(yīng)用程序擴(kuò)展那里添加.mdb文件的應(yīng)用解析。注意這里的選擇的DLL(或EXE等)似乎也不是任意的,選擇不當(dāng),這個(gè)MDB文件還是可以被下載的, 注意最好不要選擇選擇asp.dll等。你可以自己多測(cè)試下
這樣修改后下載數(shù)據(jù)庫(kù)如:http://bbs.bccn.net/data/dvbbs6.mdb。就出現(xiàn)(404或500等錯(cuò)誤)
8:使用.net的優(yōu)越性
動(dòng)網(wǎng)的木鳥(niǎo)就寫(xiě)過(guò)一個(gè)防非法下載文件的“WBAL 防盜鏈工具”。記得本論壇曾經(jīng)也有位牛人也發(fā)表過(guò)數(shù)據(jù)庫(kù)防下載的插件,是.dll的加載到IIS里的。
不過(guò) 那個(gè)只實(shí)現(xiàn)了防止非本地下載的 ,沒(méi)有起到真正的防下載數(shù)據(jù)庫(kù)的功能。不過(guò)這個(gè)方法跟第5種差不多
可以通過(guò)修改.NET文件,實(shí)現(xiàn)本地也不能下載!
這幾個(gè)方法中,只有第7和8個(gè)是統(tǒng)一性改的,一次修改配置后,整個(gè)站點(diǎn)的數(shù)據(jù)庫(kù)都可以防止下載,其他幾個(gè)就要分別修改數(shù)據(jù)庫(kù)名和連接文件,比較麻煩,不過(guò)對(duì)于虛擬主機(jī)的朋友也只能這樣了!
其實(shí)第6種方法應(yīng)該是第5種方法的擴(kuò)展,可以實(shí)現(xiàn)特殊的功能,但對(duì)于不支持.net的主機(jī)或者怕設(shè)置麻煩的話,還是直接用第5種方法了,而且默認(rèn)情況下第6種方法,依然可以通過(guò)復(fù)制連接到同主機(jī)的論壇或留言本發(fā)表,然后就可以點(diǎn)擊下載了(因?yàn)檫@樣的引用頁(yè)是來(lái)自同主機(jī)的)
這幾個(gè)方法各有長(zhǎng)短,請(qǐng)自己選擇性地使用。這些方法也不是絕對(duì)的安全,還需要網(wǎng)站管理員平時(shí)注意一些系統(tǒng)的安全,以及寫(xiě)ASP代碼本身的安全 ,否則依然有可能被人下載或者修改數(shù)據(jù)庫(kù)!
字符串截取的四個(gè)函數(shù)
一、如果只截取前幾位,使用left
二、如果只截取后幾位,使用right
三、如果只截取中間幾位,使用mid
四、分隔符截取,使用split
一、left 截取前3位:得到 ABC
<%
dd="ABCDEFGH"
response.write left(dd,3) '從第1位向后數(shù)到第3位
%>
二、right 截取后3位,得到 FGH
<%
dd="ABCDEFGH"
response.write right(dd,3) '從最后1位向前數(shù)到第3位
%>
三、mid 截取中間3位,得到 DEF
<%
dd="ABCDEFGH"
response.write mid(dd,4,3) '從第4位開(kāi)始向后數(shù)到第3位
%>
四、split 截取分隔符前后的內(nèi)容,得到 AB CD EF GH
<%
dd="AB|CD|EF|GH"
response.write split(dd,"|")(0) '得到內(nèi)容是 AB
response.write split(dd,"|")(1) '得到內(nèi)容是 CD
response.write split(dd,"|")(2) '得到內(nèi)容是 EF
response.write split(dd,"|")(3) '得到內(nèi)容是 GH
'可以寫(xiě)成循環(huán)語(yǔ)句來(lái)將分隔符左右的內(nèi)容一一顯示出來(lái)
for i=0 to 3
response.write split(dd,"|")(i)&"<br/>"
next
'單獨(dú)調(diào)用指定分隔符位置的內(nèi)容
dim dm(3) '定義一個(gè)循環(huán)變量
for i=0 to 3
dm(i)=split(dd,"|")(i)
next
response.write dm(0) '得到內(nèi)容是 AB
response.write dm(1) '得到內(nèi)容是 CD
response.write dm(2) '得到內(nèi)容是 EF
response.write dm(3) '得到內(nèi)容是 GH
'如果不確定 dd 里有多少個(gè)分隔符,使用循環(huán)參數(shù)的時(shí)候 to 后面的數(shù)字就不能直接寫(xiě)了,需要統(tǒng)計(jì)分隔符的數(shù)量
for i=0 to UBound(split(dd,"|"))
dm(i)=split(dd,"|")(i)
next
%>
今天來(lái)說(shuō)說(shuō)SQL數(shù)據(jù)庫(kù)的連接方式:
①SQL2000數(shù)據(jù)庫(kù)本地連接
Set conn=Server.CreateObject("ADODB.Connection")
conn.open "provider=sqloledb;server=(local);database=數(shù)據(jù)庫(kù)名;uid=用戶名;pwd=密碼;"
②SQL2000數(shù)據(jù)庫(kù)遠(yuǎn)程連接
Set conn=Server.CreateObject("ADODB.Connection")
conn.open "provider=sqloledb;server=200.200.200.200,1433;database=數(shù)據(jù)庫(kù)名;uid=用戶名;pwd=密碼;"
③SQL2005數(shù)據(jù)庫(kù)本地連接
Set conn=Server.CreateObject("ADODB.Connection")
conn.open "provider=SQLNCLI;server=(local);database=數(shù)據(jù)庫(kù)名;uid=用戶名;pwd=密碼;"
④SQL2005數(shù)據(jù)庫(kù)遠(yuǎn)程連接
Set conn=Server.CreateObject("ADODB.Connection")
conn.open "driver={sql server};server=200.200.200.200,1433;database=數(shù)據(jù)庫(kù)名;uid=用戶名;pwd=密碼;"
今天來(lái)寫(xiě)一下ASP入門(mén)與解說(shuō)
無(wú)論是哪種編程語(yǔ)言不外乎就這幾種功能
1.讀取
2.添加
3.修改
4.刪除
5.查詢
6.統(tǒng)計(jì)
只要將這幾種功能運(yùn)用自如,那么,你就已經(jīng)會(huì)這門(mén)語(yǔ)言了
首先我們談?wù)剶?shù)據(jù)庫(kù):
一般ASP使用 ACCESS 和 SQL 數(shù)據(jù)庫(kù)
初學(xué)者最好先使用 ACCESS 數(shù)據(jù)庫(kù),裝個(gè) OFFIEC 就已經(jīng)自帶 ACCESS 數(shù)據(jù)庫(kù)了
ACCESS 版本從 ACCESS98 → ACCESS2000 → ACCESS2003 → ACCESS2007
安裝什么版本的 OFFIEC 就是什么版本的 ACCESS
SQL數(shù)據(jù)庫(kù)是微軟的產(chǎn)品,目前一般使用的SQL數(shù)據(jù)庫(kù)為 SQL2000 → SQL2005
ASP讀取數(shù)據(jù):
<%
Set rs=Server.CreateObject("ADODB.Recordset")
rs.open "select * from 表名 order by id desc",conn,1,1 'order by用來(lái)排序 id為排序字段,desc為倒序,asc為順序,1,1為只讀,1,3為可操作
do while not rs.eof '循環(huán)開(kāi)始
response.write rs("abc") '顯示數(shù)據(jù)
rs.movenext '循環(huán)下一條數(shù)據(jù)
loop
rs.close '關(guān)閉rs記錄
set rs=nothing '清除rs記錄集
%>
瞧,讀取數(shù)據(jù)就這么簡(jiǎn)單
ASP添加新數(shù)據(jù):
第一種添加方式代碼:
<%
Set rs=Server.CreateObject("ADODB.Recordset")
rs.open "select * from 表名",conn,1,3 '這里添加新數(shù)據(jù)就不需要排序了,1,3上面我們已經(jīng)說(shuō)了,是可對(duì)數(shù)據(jù)庫(kù)操作的意思
rs.addnew '開(kāi)始新數(shù)據(jù)
rs("字段1")="123456" '將數(shù)據(jù)添加到字段1
rs("字段2")="123456" '同上
rs.update '開(kāi)始向數(shù)據(jù)庫(kù)寫(xiě)入
rs.close '關(guān)閉rs記錄
set rs=nothing '清除rs記錄集
%>
這種添加方式適合ACCESS和SQL數(shù)據(jù)庫(kù)的任何方式連接
下面這個(gè)添加語(yǔ)句只適合ACCESS的第②種連接方式,同時(shí)也適合SQL數(shù)據(jù)庫(kù)任何方式連接
第二種添加方式代碼:
<%
conn.execute "insert into 表名(字段1,字段2) values('123456','123456')" '兩個(gè)括號(hào)中要一一對(duì)應(yīng),多個(gè)內(nèi)容添加用逗號(hào)隔開(kāi)
%>
上面這段添加語(yǔ)句唯一不支持ACCESS第①種數(shù)據(jù)庫(kù)連接方式
瞧,添加數(shù)據(jù)我們也學(xué)會(huì)了
ASP修改數(shù)據(jù):
ASP修改數(shù)據(jù)多數(shù)用在查詢指定的數(shù)據(jù)然后去修改那條數(shù)據(jù)
第一種修改方式代碼:
<%
Set rs=Server.CreateObject("ADODB.Recordset")
rs.open "select * from 表名 where id=10",conn,1,3 'where為查詢開(kāi)始,查詢條件為id等于10的那條數(shù)據(jù)
rs("字段1")="123456" '無(wú)論字段1中是什么值,我們都把它改成123456這個(gè)值
rs("字段2")="123456" '同上
rs.update '開(kāi)始向數(shù)據(jù)庫(kù)寫(xiě)入
rs.close '關(guān)閉rs記錄
set rs=nothing '清除rs記錄集
%>
瞧,修改與添加不同的是少了個(gè)rs.addnew,多了個(gè)查詢條件,其它完全相同
第二種修改方式代碼:
<%
conn.execute "update 表名 set 字段1='123456',字段2='123456' where id=10" '多個(gè)內(nèi)容修改用逗號(hào)隔開(kāi)
%>
上面這段修改代碼和上面的添加一樣唯一不支持ACCESS第①種數(shù)據(jù)庫(kù)連接方式
ASP刪除數(shù)據(jù):
刪除數(shù)據(jù)也用到查詢,如果沒(méi)有查詢,那就是將整個(gè)表中的所有內(nèi)容全部刪除了,如果你只需要?jiǎng)h除其中一條,那就必須使用查詢條件
<%
conn.execute "delete 表名 where id=10" '查詢到id值等于10的那條數(shù)據(jù)并且刪除
%>
如果是ACCESS數(shù)據(jù)庫(kù)就要加上from,例如:
<%
conn.execute "delete from 表名 where id=10"
%>
瞧,這個(gè)刪除語(yǔ)句就這么簡(jiǎn)短,它和上面讀取,添加,修改語(yǔ)句有所不同
如果你的數(shù)據(jù)庫(kù)連接使用的是ACCESS第②種方式或者使用的是SQL數(shù)據(jù),那么添加,修改,刪除用起來(lái)就很簡(jiǎn)單了,像下面這樣
添加:conn.execute "insert into 表名(字段1,字段2) values('123456','123456')"
修改:conn.execute "update 表名 set 字段1='123456',字段2='123456' where id=10"
刪除:conn.execute "delete 表名 where id=10"
看起來(lái)是不是很清爽
記住,在讀取,添加,修改,刪除,這四個(gè)功能之中只有添加不能帶有查詢條件,其他三個(gè)根據(jù)自己的需要可以帶查詢條件
一、查詢條件可以多個(gè)條件
例如:conn.execute "delete 表名 where 字段1='123456' and 字段2='123456' and id=10" 之間用and隔開(kāi),and前后一定要空格
意思是這三個(gè)條件必須同時(shí)滿足才能查詢出你想要的結(jié)果
二、查詢條件可以使用or或者的意思
例如:conn.execute "delete 表名 where 字段1='123456' or 字段2='123456' or id=10" 之間用or隔開(kāi),or前后一定要空格
意思是只要查詢的條件滿足其中之一就能查詢出你想要的結(jié)果
三、查詢條件還可以使用and和or同時(shí)使用
例如:conn.execute "delete 表名 where (字段1='123456' or 字段2='123456') and id=10"
意思是只要查詢條件滿足 字段1 或者 字段2 中的一條,并且id等于10的條件,注意:括號(hào)要括起來(lái)
以上三種查詢條件適合讀取,修改,刪除三個(gè)功能
統(tǒng)計(jì)使用函數(shù)sum,recordcount
統(tǒng)計(jì)價(jià)格:sum
<%
Set rs=Server.CreateObject("ADODB.Recordset")
rs.open "select sum(價(jià)格字段) as price from 表名 order by id desc",conn,1,1 'as就是將統(tǒng)計(jì)出來(lái)的結(jié)果賦值給臨時(shí)變量price
response.write rs("price") '顯示統(tǒng)計(jì)出來(lái)的總價(jià)格
rs.close
set rs=nothing
%>
統(tǒng)計(jì)總數(shù)量:recordcount
<%
Set rs=Server.CreateObject("ADODB.Recordset")
rs.open "select * from 表名 order by id desc",conn,1,1
response.write rs.recordcount '顯示統(tǒng)計(jì)出來(lái)的總條數(shù)
rs.close
set rs=nothing
%>
代碼是死的,人的大腦是靈活的,就要看你如何去靈活運(yùn)用吧!
下面我們來(lái)說(shuō)說(shuō)字段為空的判斷:
字段為空有兩種,一種是默認(rèn)值設(shè)置為字符的比如SQL數(shù)據(jù)庫(kù)字段默認(rèn)值可以填寫(xiě) N''
另一種默認(rèn)值為空的,字段顯示內(nèi)容為 null 的
平時(shí)我們查詢判斷字段為空的把兩種空都寫(xiě)上
查詢所有為空的字段:
<%
Set rs=Server.CreateObject("ADODB.Recordset")
rs.open "Select * from 表名 where abc='' or abc is null",conn,1,1
%>
查詢所有不為空的字段:
<%
Set rs=Server.CreateObject("ADODB.Recordset")
rs.open "Select * from 表名 where abc<>'' or is abc not null",conn,1,1
%>
那么在讀取字段的時(shí)候判斷是否為空的:
<%
if isnull(rs(字段名))=true or rs(字段名)="" then
'true表示為空
else
'false表示不為空
end if
if rs(字段名) is null or rs(字段名)="" then
'表示為空
else
'表示不為空
end if
if not rs(字段名) isnull or rs(字段名)<>"" then
'表示不為空
else
'表示為空
end if
%>
數(shù)據(jù)庫(kù)多表連接查詢
學(xué)習(xí)數(shù)據(jù)庫(kù)查詢的時(shí)候?qū)Χ啾磉B接查詢的有些概念還比較模糊。而連接查詢是在數(shù)據(jù)庫(kù)查詢操作的時(shí)候肯定要用到的。對(duì)于此概念,我用通俗一些的語(yǔ)言和例子來(lái)進(jìn)行講解。
首先我們做兩張表:?jiǎn)T工信息表和部門(mén)信息表,在此,表的建立只為講述連接的概念,所以字段非常的簡(jiǎn)單
eTB(員工信息表):
eid ename tid
0001 張三 01
0002 李四 01
0003 王五 02
0004 趙六 02
0005 鄭七 NULL
tTB(部門(mén)信息表)
tid tname
01 技術(shù)部
02 市場(chǎng)部
03 工程部
我們現(xiàn)在需要進(jìn)行連接查詢,連接兩張表檢索數(shù)據(jù)。分別檢索員工信息表的員工編號(hào)、員工姓名和部門(mén)信息表中的部門(mén)名稱。
顯然,兩個(gè)表的連接條件是 員工表的部門(mén)編號(hào)=部門(mén)表的部門(mén)編號(hào)
注意:鄭七不屬于任何部門(mén)(新來(lái)的員工,還沒(méi)有分配到任何的部門(mén)),而工程部不存在任何的員工(比如是一個(gè)新成立的部門(mén),還沒(méi)有員工)
1、內(nèi)連接查詢
我們可以有兩種方式,這兩種是等效的
一種是:Select e.eid,e.ename,d.tname from eTB as e,tTB as d where e.tid=d.tid
二種是:Select e.eid,e.ename,d.tname from eTB as e inner join tTB as d on e.tid=d.tid
檢索的結(jié)果都是:
eid ename tname
0001 張三 技術(shù)部
0002 李四 技術(shù)部
0003 王五 市場(chǎng)部
0004 趙六 市場(chǎng)部
而“鄭七”和“工程部”的信息是不會(huì)檢索出來(lái)。因?yàn)椴捎脙?nèi)連接計(jì)算的時(shí)候必須要保證連接的條件e.tid=d.tid匹配,結(jié)果才會(huì)被檢索出來(lái)。當(dāng)我們連接兩張檢索數(shù)據(jù)的時(shí)候,檢索的方式是首先逐行掃描“員工信息表”中的記錄,然后根據(jù)連接條件來(lái)決定此記錄是否被檢索。比如對(duì)于張三,這條記錄的tid是01(部門(mén)編號(hào)),它在部門(mén)表中能找到和它匹配的編號(hào)01,而編號(hào)01的部門(mén)名稱(tname)是“技術(shù)部”所以張三這條記錄會(huì)被檢索,最終的結(jié)果肯定是:
0001 張三 技術(shù)部
同樣,李四、王五、趙六也能。但是鄭七的部門(mén)編號(hào)是NULL,它在部門(mén)信息表中找不到匹配的項(xiàng)(因?yàn)椴块T(mén)信息表中不存在部門(mén)編號(hào)為NULL的部門(mén)),所以鄭七不會(huì)被檢索。
同理,沒(méi)有任何人員的部門(mén)編號(hào)為03,所以工程部的記錄也不會(huì)被檢索
2、左外聯(lián)結(jié)
但是有些情況下,我們需要知道所有員工的信息,即使他不屬于任何部門(mén)。這樣我們就可以采用外連接,在這里為左外連接,也就是連接中的左表的表中的記錄,無(wú)論能不能在右表中找到匹配的項(xiàng),都要檢索,如果沒(méi)有匹配的項(xiàng)目,那么右表中的字段值為NULL(空),在這里就代表,此員工不屬于任何部門(mén)。
檢索語(yǔ)句為:Select e.eid,e.ename,d.tname from eTB as e left outer join tTB as d on e.tid=d.tid
檢索的結(jié)果都是:
eid ename tname
0001 張三 技術(shù)部
0002 李四 技術(shù)部
0003 王五 市場(chǎng)部
0004 趙六 市場(chǎng)部
0005 鄭七 NULL
但是在這里,工程部同樣不會(huì)被檢索,因?yàn)?,tname是在連接的右邊的表中,“工程部”在左表中不存在任何的記錄,所以不會(huì)被檢索。這里關(guān)注的是“連接中的左邊的表”
3、右外連接
有時(shí),我們需要知道,全部部門(mén)的信息,即使它沒(méi)有任何的員工。在我們的查詢中部門(mén)表在連接的右邊,如果我們想知道右邊表中的所有記錄信息,那么就可以采用右外連接,如果此記錄在左邊的表中找不到匹配項(xiàng),則相應(yīng)字段(eid,ename)為NULL
檢索語(yǔ)句為:Select e.eid,e.ename,d.tname from eTB as e right outer join tTB as d on e.tid=d.tid
檢索的結(jié)果都是:
eid ename tname
0001 張三 技術(shù)部
0002 李四 技術(shù)部
0003 王五 市場(chǎng)部
0004 趙六 市場(chǎng)部
NULL NULL 工程部
但在這里,鄭七是不會(huì)被檢索了,因?yàn)樗谟冶碇姓也坏狡ヅ漤?xiàng),這里關(guān)注的是“連接中的右邊的表”
4、完全外連接
如果我們想知道所有的記錄呢?無(wú)論員工有沒(méi)有部門(mén),部門(mén)有沒(méi)有員工,我們都需要檢索。這里就可以使用完全外連接。關(guān)注連接中的兩部分。如果沒(méi)有部門(mén),部門(mén)為空,沒(méi)有員工,員工信息為空。
檢索語(yǔ)句為:Select e.eid,e.ename,d.tname from eTB as e full outer join tTB as d on e.tid=d.tid
檢索的結(jié)果都是:
eid ename tname
0001 張三 技術(shù)部
0002 李四 技術(shù)部
0003 王五 市場(chǎng)部
0004 趙六 市場(chǎng)部
0005 鄭七 NULL
NULL NULL 工程部
經(jīng)??吹接行率謥?lái)問(wèn)如何接收傳送的值
下面我來(lái)詳細(xì)的說(shuō)一下接收傳送值的多種方式
獲取傳送值通常使用三種方式來(lái)獲取
id=Request("id") '可以是post或get方式傳送的值
id=Request.Form("id") '只能post方式傳送的值
id=Request.Querystring("id") '只能get方式傳送的值
從表單提交的方式傳送的通常使用post方式傳送
例如:
<form action="abc.asp" method="post">
<input type="text" name="Uname" />
<input type="text" name="Pass" />
<input type="submit" name="submit" value="提交" />
</form>
表單形式的提交通常 method屬性值為post的,當(dāng)然我們也可以改成 method="get",這樣提交過(guò)去會(huì)自動(dòng)在地址欄顯示傳送的值了,例如:http://bbs.bccn.net/abc.asp?Uname=hmhz&Pass=123456
多個(gè)參數(shù)傳送用 & 符號(hào)分隔,格式如上
從地址欄傳送的都為get方式傳送
get傳送形式上面已經(jīng)寫(xiě)了,但get方式不一定非得使用表單來(lái)傳送,我們可以使用超連接,或用JS傳送均可以
例如:
<a href="abc.asp?id=<%=rs("id")%>">刪除</a>
<a href="javascript:location.href='abc.asp?id=<%=rs("id")%>'>刪除</a>
<a href="javascript:void(0);" onclick="location.href='abc.asp?id=<%=rs("id")%>'">刪除</a>
如果一個(gè)頁(yè)面很有可能會(huì)post方式提交來(lái)的參數(shù),也有可能以get方式傳送的,那我們可以使用第一種接收方式
id=Request("id")
就行了,如果這個(gè)值只有一種方式傳送的,那最好使用對(duì)應(yīng)的接收方式,因?yàn)檫@樣接收效率才會(huì)提高,也在安全上加了道門(mén)檻
未經(jīng)允許不得轉(zhuǎn)載:445IT之家 » 新手asp編程的基本法則