久久久精品2019免费观看_亚洲国产精品成人久久久_69国产成人综合久久精品91_国产精品久久精品视

新手asp編程的基本法則

  核心提示:網(wǎng)上找到 ,收藏,未經(jīng)驗證。新手asp編程的基本法則 [新手必看] 2009-6-17 更新一、新手常犯的錯誤在論壇看到很多帖子代碼中都有一個共同的基本錯誤,字段類型錯誤。程序和數(shù)據(jù)庫是緊緊相連的,數(shù)據(jù)庫字段文本型或時間型的都使用單引號比如下面這段修改語句:conn.execute 'update …

 網(wǎng)上找到 ,收藏,未經(jīng)驗證。

新手asp編程的基本法則 [新手必看] 2009-6-17 更新

一、新手常犯的錯誤
在論壇看到很多帖子代碼中都有一個共同的基本錯誤,字段類型錯誤。
程序和數(shù)據(jù)庫是緊緊相連的,數(shù)據(jù)庫字段文本型或時間型的都使用單引號
比如下面這段修改語句:
conn.execute "update Counts set counts='"&counts&"' where num="&num&" and Atime='"&now()&"'"
等號左邊都是字段名,等號右邊是傳值過來的變量名,counts 字段是文本型,所以寫入時必須前后加單引號,無論是寫入還是查詢都一樣,后面的查尋語句中,num 字段是數(shù)字型,所以前后就沒有單引號了,Atime 字段是時間型所以前后也要加單引號。
最重要的是以ID查詢,ID字段是唯一的并且數(shù)字類型,很明顯查詢ID號時前后也不能有單引號
conn.execute "update Counts set counts='"&counts&"' where id='"&id&"'"  '錯誤寫法
conn.execute "update Counts set counts='"&counts&"' where id="&id  '正確寫法

二、ACCESS 數(shù)據(jù)庫連接
通常數(shù)據(jù)庫連接有兩種方式,新手基本不知道用哪一種方式,或者在什么情況下用哪一種,又或者不知道兩者的原理
①直接連接數(shù)據(jù)庫文件
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ="&Server.MapPath("database/yanhang.mdb")

②通過數(shù)據(jù)源來連接數(shù)據(jù)庫文件
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="&Server.MapPath("database/yanhang.mdb")

那么,兩者到底哪一個好呢,當然是第二種,因為第一種其實就是客戶端瀏覽器直接讀取數(shù)據(jù)庫的,所以安全方面差很多,第二種通過數(shù)據(jù)源連接,是以服務器數(shù)據(jù)源工具連接的,與客戶端沒關系,所以數(shù)據(jù)庫不會暴露給客戶端,安全系數(shù)高很多。

ACCESS 數(shù)據(jù)庫對應程序的應用:①直接連接數(shù)據(jù)庫文件
conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ="&Server.MapPath("database/yanhang.mdb")
這樣的數(shù)據(jù)庫連接方式,添加語句:
set rs=server.createobject("adodb.recordset")   '(正確寫法)
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")  '(錯誤寫法)
sql="insert into dndj(bh,bm,xm,xsq) values('bh','bm','xm','xsq')"
rs.open sql,conn,1,3

ACCESS 數(shù)據(jù)庫對應程序的應用:②通過數(shù)據(jù)源來連接數(shù)據(jù)庫文件
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="&Server.MapPath("database/yanhang.mdb")
這樣的數(shù)據(jù)庫連接方式,添加語句:
conn.execute "insert into dndj(bh,bm,xm,xsq) values('"&bh&"','"&bm&"','"&xm&"','"&xsq&"')"    '(正確寫法)

set rs=server.createobject("adodb.recordset")  '(錯誤寫法)
sql="insert into dndj(bh,bm,xm,xsq) values('bh','bm','xm','xsq')"
rs.open sql,conn,1,3

三、雙引號的應用
通常我們寫超級連接這樣 <a href="abc.asp?id=<%=rs("id")%>">超級連接</a>
但要是把這個超級連接編譯進asp里面呢
response.write "<a href=""abc.asp?id="&rs("id")&""">超級連接</a>"   '(正確寫法)
response.write "<a href='abc.asp?id="&rs("id")&"'>超級連接</a>"       '(正確寫法)
response.write "<a href=abc.asp?id="&rs("id")&">超級連接</a>"        '(正確寫法)

response.write "<a href="abc.asp?id=<%=rs("id")%>">超級連接</a>"  '(錯誤寫法)
response.write "<a href="abc.asp?id="&rs("id")&"">超級連接</a>"       '(錯誤寫法)

表單編譯進asp里  <input type="text" name="id" value="<%rs("id")%>" />
response.write "<input type=""text"" name=""id"" value="""&rs("id")&""" />" '(正確寫法) 注意:這里有三個雙引號
response.write "<input type='text' name='id' value='"&rs("id")&"' />"       '(正確寫法)
response.write "<input type=text name=id value="&rs("id")&" />"            '(正確寫法)

response.write "<input type="text" name="id" value="<%=rs("id")%>" />"  '(錯誤寫法)
response.write "<input type="text" name="id" value=""&rs("id")&"" />"       '(錯誤寫法)

四、防止ACCESS數(shù)據(jù)庫被下載的幾個方法
很多動態(tài)站點大量應用了數(shù)據(jù)庫,數(shù)據(jù)庫理所當然成了一個站點的核心文件。一旦數(shù)據(jù)庫被非法下載,極有可能被惡意人士破壞網(wǎng)站?;蛘吒`取資料。

下面提供的方法分別適用使用虛擬主機空間的用戶和有IIS控制權(quán)的用戶!

   一:購買虛擬主機空間的,適合沒有IIS控制權(quán)
1:發(fā)揮你的想象力 修改數(shù)據(jù)庫文件名
這個是最基本的。我想現(xiàn)在也沒有多少連數(shù)據(jù)庫文件名都懶得改的人吧? 至于改成什么,你自己看著辦,至少要保證文件名復雜,不可猜測性。當然這個時候你的數(shù)據(jù)庫所在目錄是不能開放目錄瀏覽權(quán)限的!

2:數(shù)據(jù)庫名后綴改為ASA、ASP等
這個聽說很流行,不過我測試了好多次,發(fā)現(xiàn)并不理想,如果真正要起到防止下載的作用,要進行一些二進制字段添加等設置,一句話,繁而復雜(如果你的數(shù)據(jù)庫有很多的話,這個方法實在不是很好)

3:數(shù)據(jù)庫名前加“#”
只需要把數(shù)據(jù)庫文件前名加上#、然后修改數(shù)據(jù)庫連接文件(如conn.asp)中的數(shù)據(jù)庫地址。原理是下載的時候只能識別 #號前名的部分,對于后面的自動去掉,比如你要下載:http://bbs.bccn.net/date/#123.mdb (假設存在的話)。無論是IE還是FLASHGET等下到的都是 http://bbs.bccn.net/date/index.htm

今天來看到57樓的兄弟說前面加“#”根本就是垃圾,后來測試了下
使用%23的確能下載:http://bbs.bccn.net/date/[color=red]%23123.mdb
后來我研究了下,中間加空格的瀏覽器自動編譯成 %20 也是能夠下載的
最后索性都不用,我就使用#+空格的編譯碼 %23%20.mdb 作為數(shù)據(jù)庫名字
http://bbs.bccn.net/date/%23%20.mdb
經(jīng)過測試,使用迅雷和普通的下載工具都不能下載[/color]

4:加密數(shù)據(jù)庫
用ACCESS將你的數(shù)據(jù)庫以獨占方式打開后,在工具-安全-設置數(shù)據(jù)庫密碼,加密后要修改數(shù)據(jù)庫連接頁, 如:
conn.open "driver={microsoft access driver (*.mdb)};uid=admin;pwd=數(shù)據(jù)庫密碼;dbq=數(shù)據(jù)庫路徑"
這樣修改后,數(shù)據(jù)庫即使被人下載了,別人也無法打開(前提是你的數(shù)據(jù)庫連接頁中的密碼沒有被泄露)
但值得注意的是,由于Access數(shù)據(jù)庫的加密機制比較簡單,即使設置了密碼,解密也很容易。該數(shù)據(jù)庫系統(tǒng)通過將用戶輸入的密碼與某一固定密鑰進行“異或”來形成一個加密串,并將其存儲在*.mdb文件從地址“&H42”開始的區(qū)域內(nèi)。所以一個好的程序員可以輕松制作一個幾十行的小程序就可以輕松地獲得任何Access數(shù)據(jù)庫的密碼。因此,只要數(shù)據(jù)庫被下載,其安全依然是個未知數(shù)。


  二:有主機控制權(quán) (當然虛擬空間的設置在這里依然可以用)
5:數(shù)據(jù)庫放在WEB目錄外
如你的WEB目錄是e:webroot,可以把數(shù)據(jù)庫放到e:data這個文件夾里,在e:webroot里的數(shù)據(jù)庫連接頁中
修改數(shù)據(jù)庫連接地址為:"../data/#123 456.mdb" 的形式,這樣數(shù)據(jù)庫可以正常調(diào)用,但是無法下載的,因為它不在WEB目錄里!這個方法一般也適合購買虛擬空間的用戶。

6:使用ODBC數(shù)據(jù)源。
在ASP等程序設計中,如果有條件,應盡量使用ODBC數(shù)據(jù)源,不要把數(shù)據(jù)庫名寫在程序中,否則,數(shù)據(jù)庫名將隨ASP源代碼的失密而一同失密
例如:
conn.open "driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("../123/abc/asfadf.mdb")
可見,即使數(shù)據(jù)庫名字起得再怪異,隱藏的目錄再深,ASP源代碼失密后,也很容易被下載下來。
如果使用ODBC數(shù)據(jù)源,就不會存在這樣的問題了:conn.open "ODBC-DSN名" ,不過這樣是比較煩的,目錄移動的話又要重新設置數(shù)據(jù)源了!

7:添加數(shù)據(jù)庫名的如MDB的擴展映射
這個方法就是通過修改IIS設置來實現(xiàn),適合有IIS控制權(quán)的朋友,不適合購買虛擬主機用戶(除非管理員已經(jīng)設置了)。這個方法我認為是目前最好的。只要修改一處,整個站點的數(shù)據(jù)庫都可以防止被下載。無須修改代碼即使暴露目標地址也可以防止下載。

設置:
在 IIS屬性—主目錄—配置—映射—應用程序擴展那里添加.mdb文件的應用解析。注意這里的選擇的DLL(或EXE等)似乎也不是任意的,選擇不當,這個MDB文件還是可以被下載的,  注意最好不要選擇選擇asp.dll等。你可以自己多測試下
這樣修改后下載數(shù)據(jù)庫如:http://bbs.bccn.net/data/dvbbs6.mdb。就出現(xiàn)(404或500等錯誤)

8:使用.net的優(yōu)越性
動網(wǎng)的木鳥就寫過一個防非法下載文件的“WBAL 防盜鏈工具”。記得本論壇曾經(jīng)也有位牛人也發(fā)表過數(shù)據(jù)庫防下載的插件,是.dll的加載到IIS里的。
不過 那個只實現(xiàn)了防止非本地下載的 ,沒有起到真正的防下載數(shù)據(jù)庫的功能。不過這個方法跟第5種差不多
可以通過修改.NET文件,實現(xiàn)本地也不能下載!

這幾個方法中,只有第7和8個是統(tǒng)一性改的,一次修改配置后,整個站點的數(shù)據(jù)庫都可以防止下載,其他幾個就要分別修改數(shù)據(jù)庫名和連接文件,比較麻煩,不過對于虛擬主機的朋友也只能這樣了!

其實第6種方法應該是第5種方法的擴展,可以實現(xiàn)特殊的功能,但對于不支持.net的主機或者怕設置麻煩的話,還是直接用第5種方法了,而且默認情況下第6種方法,依然可以通過復制連接到同主機的論壇或留言本發(fā)表,然后就可以點擊下載了(因為這樣的引用頁是來自同主機的)

這幾個方法各有長短,請自己選擇性地使用。這些方法也不是絕對的安全,還需要網(wǎng)站管理員平時注意一些系統(tǒng)的安全,以及寫ASP代碼本身的安全 ,否則依然有可能被人下載或者修改數(shù)據(jù)庫!


字符串截取的四個函數(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位開始向后數(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

'可以寫成循環(huán)語句來將分隔符左右的內(nèi)容一一顯示出來
for i=0 to 3
    response.write split(dd,"|")(i)&"<br/>"
next

'單獨調(diào)用指定分隔符位置的內(nèi)容
dim dm(3)  '定義一個循環(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 里有多少個分隔符,使用循環(huán)參數(shù)的時候 to 后面的數(shù)字就不能直接寫了,需要統(tǒng)計分隔符的數(shù)量
for i=0 to UBound(split(dd,"|"))
    dm(i)=split(dd,"|")(i)
next
%>

今天來說說SQL數(shù)據(jù)庫的連接方式:
①SQL2000數(shù)據(jù)庫本地連接
Set conn=Server.CreateObject("ADODB.Connection")
conn.open "provider=sqloledb;server=(local);database=數(shù)據(jù)庫名;uid=用戶名;pwd=密碼;"

②SQL2000數(shù)據(jù)庫遠程連接
Set conn=Server.CreateObject("ADODB.Connection")
conn.open "provider=sqloledb;server=200.200.200.200,1433;database=數(shù)據(jù)庫名;uid=用戶名;pwd=密碼;"

③SQL2005數(shù)據(jù)庫本地連接
Set conn=Server.CreateObject("ADODB.Connection")
conn.open "provider=SQLNCLI;server=(local);database=數(shù)據(jù)庫名;uid=用戶名;pwd=密碼;"

④SQL2005數(shù)據(jù)庫遠程連接
Set conn=Server.CreateObject("ADODB.Connection")
conn.open "driver={sql server};server=200.200.200.200,1433;database=數(shù)據(jù)庫名;uid=用戶名;pwd=密碼;"

今天來寫一下ASP入門與解說
無論是哪種編程語言不外乎就這幾種功能
1.讀取
2.添加
3.修改
4.刪除
5.查詢
6.統(tǒng)計
只要將這幾種功能運用自如,那么,你就已經(jīng)會這門語言了

首先我們談談數(shù)據(jù)庫:
一般ASP使用 ACCESS 和 SQL 數(shù)據(jù)庫
初學者最好先使用 ACCESS 數(shù)據(jù)庫,裝個 OFFIEC 就已經(jīng)自帶 ACCESS 數(shù)據(jù)庫了
ACCESS 版本從 ACCESS98 → ACCESS2000 → ACCESS2003 → ACCESS2007
安裝什么版本的 OFFIEC 就是什么版本的 ACCESS

SQL數(shù)據(jù)庫是微軟的產(chǎn)品,目前一般使用的SQL數(shù)據(jù)庫為 SQL2000 → SQL2005

ASP讀取數(shù)據(jù):
<%
Set rs=Server.CreateObject("ADODB.Recordset")
rs.open "select * from 表名 order by id desc",conn,1,1  'order by用來排序 id為排序字段,desc為倒序,asc為順序,1,1為只讀,1,3為可操作
do while not rs.eof            '循環(huán)開始
   response.write rs("abc")      '顯示數(shù)據(jù)
rs.movenext            '循環(huán)下一條數(shù)據(jù)
loop
rs.close            '關閉rs記錄
set rs=nothing            '清除rs記錄集
%>
瞧,讀取數(shù)據(jù)就這么簡單

 

ASP添加新數(shù)據(jù):
第一種添加方式代碼:
<%
Set rs=Server.CreateObject("ADODB.Recordset")
rs.open "select * from 表名",conn,1,3   '這里添加新數(shù)據(jù)就不需要排序了,1,3上面我們已經(jīng)說了,是可對數(shù)據(jù)庫操作的意思
rs.addnew            '開始新數(shù)據(jù)
rs("字段1")="123456"     '將數(shù)據(jù)添加到字段1
rs("字段2")="123456"     '同上
rs.update        '開始向數(shù)據(jù)庫寫入
rs.close        '關閉rs記錄
set rs=nothing        '清除rs記錄集
%>
這種添加方式適合ACCESS和SQL數(shù)據(jù)庫的任何方式連接
下面這個添加語句只適合ACCESS的第②種連接方式,同時也適合SQL數(shù)據(jù)庫任何方式連接
第二種添加方式代碼:
<%
conn.execute "insert into 表名(字段1,字段2) values('123456','123456')" '兩個括號中要一一對應,多個內(nèi)容添加用逗號隔開
%>
上面這段添加語句唯一不支持ACCESS第①種數(shù)據(jù)庫連接方式
瞧,添加數(shù)據(jù)我們也學會了

 

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為查詢開始,查詢條件為id等于10的那條數(shù)據(jù)
rs("字段1")="123456"      '無論字段1中是什么值,我們都把它改成123456這個值
rs("字段2")="123456"      '同上
rs.update        '開始向數(shù)據(jù)庫寫入
rs.close        '關閉rs記錄
set rs=nothing        '清除rs記錄集
%>
瞧,修改與添加不同的是少了個rs.addnew,多了個查詢條件,其它完全相同
第二種修改方式代碼:
<%
conn.execute "update 表名 set 字段1='123456',字段2='123456' where id=10" '多個內(nèi)容修改用逗號隔開
%>
上面這段修改代碼和上面的添加一樣唯一不支持ACCESS第①種數(shù)據(jù)庫連接方式

 

ASP刪除數(shù)據(jù):
刪除數(shù)據(jù)也用到查詢,如果沒有查詢,那就是將整個表中的所有內(nèi)容全部刪除了,如果你只需要刪除其中一條,那就必須使用查詢條件
<%
conn.execute "delete 表名 where id=10"  '查詢到id值等于10的那條數(shù)據(jù)并且刪除
%>
如果是ACCESS數(shù)據(jù)庫就要加上from,例如:
<%
conn.execute "delete from 表名 where id=10"
%>
瞧,這個刪除語句就這么簡短,它和上面讀取,添加,修改語句有所不同

 

如果你的數(shù)據(jù)庫連接使用的是ACCESS第②種方式或者使用的是SQL數(shù)據(jù),那么添加,修改,刪除用起來就很簡單了,像下面這樣

添加: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"

看起來是不是很清爽

 

記住,在讀取,添加,修改,刪除,這四個功能之中只有添加不能帶有查詢條件,其他三個根據(jù)自己的需要可以帶查詢條件
一、查詢條件可以多個條件
例如:conn.execute "delete 表名 where 字段1='123456' and 字段2='123456' and id=10" 之間用and隔開,and前后一定要空格
      意思是這三個條件必須同時滿足才能查詢出你想要的結(jié)果

二、查詢條件可以使用or或者的意思
例如:conn.execute "delete 表名 where 字段1='123456' or 字段2='123456' or id=10" 之間用or隔開,or前后一定要空格
      意思是只要查詢的條件滿足其中之一就能查詢出你想要的結(jié)果

三、查詢條件還可以使用and和or同時使用
例如:conn.execute "delete 表名 where (字段1='123456' or 字段2='123456') and id=10"
      意思是只要查詢條件滿足 字段1 或者 字段2 中的一條,并且id等于10的條件,注意:括號要括起來

以上三種查詢條件適合讀取,修改,刪除三個功能

 

統(tǒng)計使用函數(shù)sum,recordcount
統(tǒng)計價格:sum
<%
Set rs=Server.CreateObject("ADODB.Recordset")
rs.open "select sum(價格字段) as price from 表名 order by id desc",conn,1,1  'as就是將統(tǒng)計出來的結(jié)果賦值給臨時變量price
   response.write rs("price")      '顯示統(tǒng)計出來的總價格

rs.close
set rs=nothing
%>

統(tǒng)計總數(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)計出來的總條數(shù)

rs.close
set rs=nothing
%>

代碼是死的,人的大腦是靈活的,就要看你如何去靈活運用吧!

下面我們來說說字段為空的判斷:
字段為空有兩種,一種是默認值設置為字符的比如SQL數(shù)據(jù)庫字段默認值可以填寫 N''
另一種默認值為空的,字段顯示內(nèi)容為 null 的
平時我們查詢判斷字段為空的把兩種空都寫上
查詢所有為空的字段:
<%
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
%>

那么在讀取字段的時候判斷是否為空的:
<%
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ù)庫多表連接查詢
學習數(shù)據(jù)庫查詢的時候?qū)Χ啾磉B接查詢的有些概念還比較模糊。而連接查詢是在數(shù)據(jù)庫查詢操作的時候肯定要用到的。對于此概念,我用通俗一些的語言和例子來進行講解。
首先我們做兩張表:員工信息表和部門信息表,在此,表的建立只為講述連接的概念,所以字段非常的簡單
eTB(員工信息表):
eid   ename tid
0001  張三  01
0002  李四  01
0003  王五  02
0004  趙六  02
0005  鄭七  NULL

tTB(部門信息表)
tid tname
01  技術(shù)部
02  市場部
03  工程部

我們現(xiàn)在需要進行連接查詢,連接兩張表檢索數(shù)據(jù)。分別檢索員工信息表的員工編號、員工姓名和部門信息表中的部門名稱。
顯然,兩個表的連接條件是 員工表的部門編號=部門表的部門編號
注意:鄭七不屬于任何部門(新來的員工,還沒有分配到任何的部門),而工程部不存在任何的員工(比如是一個新成立的部門,還沒有員工)
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  王五  市場部
0004  趙六  市場部

而“鄭七”和“工程部”的信息是不會檢索出來。因為采用內(nèi)連接計算的時候必須要保證連接的條件e.tid=d.tid匹配,結(jié)果才會被檢索出來。當我們連接兩張檢索數(shù)據(jù)的時候,檢索的方式是首先逐行掃描“員工信息表”中的記錄,然后根據(jù)連接條件來決定此記錄是否被檢索。比如對于張三,這條記錄的tid是01(部門編號),它在部門表中能找到和它匹配的編號01,而編號01的部門名稱(tname)是“技術(shù)部”所以張三這條記錄會被檢索,最終的結(jié)果肯定是:

0001  張三  技術(shù)部

同樣,李四、王五、趙六也能。但是鄭七的部門編號是NULL,它在部門信息表中找不到匹配的項(因為部門信息表中不存在部門編號為NULL的部門),所以鄭七不會被檢索。
同理,沒有任何人員的部門編號為03,所以工程部的記錄也不會被檢索

2、左外聯(lián)結(jié)
但是有些情況下,我們需要知道所有員工的信息,即使他不屬于任何部門。這樣我們就可以采用外連接,在這里為左外連接,也就是連接中的左表的表中的記錄,無論能不能在右表中找到匹配的項,都要檢索,如果沒有匹配的項目,那么右表中的字段值為NULL(空),在這里就代表,此員工不屬于任何部門。
檢索語句為: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  王五  市場部
0004  趙六  市場部
0005  鄭七  NULL

但是在這里,工程部同樣不會被檢索,因為,tname是在連接的右邊的表中,“工程部”在左表中不存在任何的記錄,所以不會被檢索。這里關注的是“連接中的左邊的表”


3、右外連接
有時,我們需要知道,全部部門的信息,即使它沒有任何的員工。在我們的查詢中部門表在連接的右邊,如果我們想知道右邊表中的所有記錄信息,那么就可以采用右外連接,如果此記錄在左邊的表中找不到匹配項,則相應字段(eid,ename)為NULL
檢索語句為: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  王五  市場部
0004  趙六  市場部
NULL  NULL  工程部

但在這里,鄭七是不會被檢索了,因為它在右表中找不到匹配項,這里關注的是“連接中的右邊的表”

4、完全外連接
如果我們想知道所有的記錄呢?無論員工有沒有部門,部門有沒有員工,我們都需要檢索。這里就可以使用完全外連接。關注連接中的兩部分。如果沒有部門,部門為空,沒有員工,員工信息為空。
檢索語句為: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  王五  市場部
0004  趙六  市場部
0005  鄭七  NULL
NULL  NULL  工程部

經(jīng)??吹接行率謥韱柸绾谓邮諅魉偷闹?br /> 下面我來詳細的說一下接收傳送值的多種方式
獲取傳送值通常使用三種方式來獲取
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的,當然我們也可以改成 method="get",這樣提交過去會自動在地址欄顯示傳送的值了,例如:http://bbs.bccn.net/abc.asp?Uname=hmhz&Pass=123456
多個參數(shù)傳送用 & 符號分隔,格式如上

從地址欄傳送的都為get方式傳送
get傳送形式上面已經(jīng)寫了,但get方式不一定非得使用表單來傳送,我們可以使用超連接,或用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>

如果一個頁面很有可能會post方式提交來的參數(shù),也有可能以get方式傳送的,那我們可以使用第一種接收方式
id=Request("id")
就行了,如果這個值只有一種方式傳送的,那最好使用對應的接收方式,因為這樣接收效率才會提高,也在安全上加了道門檻

未經(jīng)允許不得轉(zhuǎn)載:445IT之家 » 新手asp編程的基本法則

贊 (0) 打賞

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

微信掃一掃打賞