javascript asp教程第十二課---session對象
ASP常用技巧 (1)2009-08-17 13:26:47
www.hackbase.com 來(lái)源:互聯(lián)網(wǎng)
1.獲得系統時(shí)間: <%=now()%> 2.取得來(lái)訪(fǎng)用的IP: <%=request.server<I>var</I>iables("remote_host")%> 3.獲得系統,瀏覽器版本: <<I>script</I>> window.document.write("版本:"+navigator.appName+navigat ...
1.獲得系統時(shí)間:
<%=now()%>
2.取得來(lái)訪(fǎng)用的IP:
<%=request.server<I>var</I>iables("remote_host")%>
3.獲得系統,瀏覽器版本:
<<I>script</I>>
window.document.write("版本:"+navigator.appName+navigator.appVersion+" browser.")
</<I>script</I>>
4.去除IE混動(dòng)條:
<body scroll="no">
<body style="overflow-y:hidden">
5.進(jìn)入網(wǎng)站,跳出廣告:
<<I>script</I> language="java<I>script</I>">
<!--
<!-- 注意更改文件所在路徑-->
window.open(''http://www.******.com<;I></I>39;','''',''height=200,width=300,top=0,left=30'');
// -->
</<I>script</I>>
6.隨機數:
<%randomize%>
<%=(int(rnd()*n)+1)%>
N為可改變數
7.向上混動(dòng)代碼:
<marquee direction="up" scrolldelay="200" style="font-size: 9pt; color: #FF0000; line-height: 150%; font-style:italic; font-weight:bold" scrollamount="2" width="206" height="207" bgcolor="#FFFF00">hhhhhhhhhhhhhhhhhhh</marquee>
8.自動(dòng)關(guān)閉網(wǎng)頁(yè):
<<I>script</I> LANGUAGE="java<I>script</I>">
<!--
setTimeout(''window.close();'', 10000); //60秒后關(guān)閉
// -->
</<I>script</I>>
<p align="center">本頁(yè)10秒后自動(dòng)關(guān)閉,請注意刷新頁(yè)面</p>
9.隨機背景音樂(lè ):
<%randomize%>
<bgsound src="mids/<%=(int(rnd()*60)+1)%>.mid" loop="-1">
可以修改數字,限制調用個(gè)數,我這里是60個(gè).
10.自動(dòng)刷新本頁(yè)面:
<<I>script</I>>
<!--
<I>var</I> limit="0:10"
if (document.images){
<I>var</I> parselimit=limit.split(":")
parselimit=parselimit[0]*60+parselimit[1]*1
}
<I>function</I> beginrefresh(){
if (!document.images)
return
if (parselimit==1)
window.location.reload()
else{
parselimit-=1
curmin=Math.floor(parselimit/60)
cursec=parselimit%60
if (curmin!=0)
curtime=curmin+"分"+cursec+"秒后重刷本頁(yè)!"
else
curtime=cursec+"秒后重刷本頁(yè)!"
window.status=curtime
setTimeout("beginrefresh()",1000)
}
}
window.<I>onload</I>=beginrefresh
<I>file:</I>//-->
</<I>script</I>>
11.ACCESS數據庫連接:
<%
option explicit
dim startime,endtime,conn,connstr,db
startime=timer()
'更改數據庫名字
db="data/dvBBS5.mdb"
Set conn = Server.CreateObject("ADODB.Connection")
connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(db)
'如果你的服務(wù)器采用較老版本Access驅動(dòng),請用下面連接方法
'connstr="driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath(db)
conn.Open connstr
<I>function</I> CloseDatabase
Conn.close
Set conn = Nothing
End <I>function</I>
%>
12.SQL數據庫連接:
<%
option explicit
dim startime,endtime,conn,connstr,db
startime=timer()
connstr="driver={SQL Server};server=HUDENQ-N11T33NB;uid=sa;pwd=xsfeihu;database=dvbbs"
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open connstr
<I>function</I> CloseDatabase
Conn.close
Set conn = Nothing
End <I>function</I>
%>
13.用鍵盤(pán)打開(kāi)網(wǎng)頁(yè)代碼:
<<I>script</I> language="java<I>script</I>">
<I>function</I> ctlent(eventobject)
{
if((event.ctrlKey && window.event.keyCode==13)||(event.altKey && window.event.keyCode==83))
{
window.open('網(wǎng)址','','')
}
}
</<I>script</I>>
這里是Ctrl+Enter和Alt+S的代碼 自己查下鍵盤(pán)的ASCII碼再換就行
14.讓層不被控件復蓋代碼:
<div z-Index:2><object ***></object></div> # 前面
<div z-Index:1><object ***></object></div> # 后面
<div id="Layer2" style="position:absolute; top:40;width:400px; height:95px;z-index:2"><table height=100% width=100% bgcolor="#ff0000"><tr><td height=100% width=100%></td></tr></table><<I>iframe</I> width=0 height=0></<I>iframe</I>></div>
<div id="Layer1" style="position:absolute; top:50;width:200px; height:115px;z-index:1"><<I>iframe</I> height=100% width=100%></<I>iframe</I>></div>
15.FLASH廣告代碼:
<object classid="clsid27CDB6E-AE6D-11cf-96B8-444553540000" codebase="
16.VBS彈出窗口小代碼:
<<I>script</I> language=vb<I>script</I>>
msgbox"你還沒(méi)有注冊或登陸論壇","0","精品論壇"
location.href = "login.asp"
</<I>script</I>>
簡(jiǎn)單介紹
asp是很簡(jiǎn)單的,以至于許多的研發(fā)者不會(huì )去思考錯誤處理。錯誤處理能夠讓您的應用程式更加合理。我看到過(guò)很多個(gè)用asp編寫(xiě)的商業(yè)網(wǎng)站,大多數都忽略了錯誤處理。
錯誤的類(lèi)型
有三種主要的錯誤類(lèi)型:
編譯錯誤:
這種錯誤出現一般都是代碼的語(yǔ)法問(wèn)題。因為編譯錯誤而導致辭asp停止運行。
運行錯誤
這個(gè)錯誤是發(fā)生在您準備運行asp時(shí)的。例如:假如您試圖給一個(gè)變量賦值,但是卻超出了該變量允許的范圍。
邏輯錯誤
邏輯錯誤是最難被發(fā)現的,這種錯誤經(jīng)常是一種結構錯誤,電腦是發(fā)現不了的。這就需要我們徹頭徹尾地檢查我們的代碼。
因為編譯錯誤一般是和邏輯錯誤一起發(fā)生的,一般都能顯示出來(lái),所以我們擔心的就只是運行錯誤。他都終止asp的運行,而且給用戶(hù)丟下一堆很不友好的文字。
那么我們要怎樣處理運行錯誤呢???我們先來(lái)看看,asp唯一提供給我們的錯誤命令---on error resume next(這里提醒一下初學(xué)者,在asp中只有on error resume next語(yǔ)句,沒(méi)有on error resume goto語(yǔ)句)
假如您不使用on error resume next語(yǔ)句的話(huà),一切運行錯誤都會(huì )發(fā)生,這個(gè)是致命的,那么就會(huì )有一段錯誤代碼“展現”給用戶(hù),而且asp程式也會(huì )停止。
下面就是個(gè)錯誤代碼:
microsoft ole db provider for odbc drivers error 80004005
[microsoft][odbc driver manager] data source name not found and no default driver specified
/test.asp, line 60
當我們在程式最上面使用on error resume next語(yǔ)句時(shí),任何的錯誤都會(huì )被忽略,程式會(huì )自動(dòng)執行下一條語(yǔ)句。這樣程式就會(huì )完全執行,出錯后用戶(hù)也不會(huì )看到出錯信息。但是這樣也有不好的地方,那就是假如程式?jīng)]有按照您想像的執行的話(huà),您就很難找到到底是哪里出了問(wèn)題,所以您就得在必要的地方對錯誤進(jìn)行處理。
處理錯誤
在asp中,處理錯誤的最好的辦法就是在程式最底端放上代碼來(lái)處理錯誤。我也推薦在每個(gè)asp程式都使用緩沖區。這樣的話(huà),假如錯誤發(fā)生,頁(yè)面就會(huì )停止,頁(yè)面內容也會(huì )被清除,這樣用戶(hù)就不會(huì )看到錯誤信息,對您們的抱怨也就少了!下面是個(gè)例子:
<%@ language="vbscript" %>
<% 配置buffer為true
response.buffer = true
開(kāi)始錯誤處理
on error resume next
%>
<% 錯誤處理
if err.number <> 0 then
清除頁(yè)面
response.clear
顯示錯誤信息給用戶(hù)
%>
<html>
<head>
<title></title>
</head>
<body bgcolor="#c0c0c0">
<font face="arial">an error occurred in the execution of this asp page<br>
please report the following information to the support desk<p>
<b>page error object</b><br>
錯誤 number: <%= err.number %><br>
錯誤信息: <%= err.description %><br>
出錯文檔: <%= err.source %><br>
出錯行: <%= err.line %><br>
</font>
</body>
</html>
<%end if%>
您們上面看到了,我首先配置on error resume next ,這樣出現錯誤就不會(huì )影響程式的執行。
錯誤處理和數據庫
在錯誤處理中加入數據庫的執行是很復雜的。假若我們有一個(gè)程式,有很多的命令去向數據庫中添加記錄,假如insert/update在程式的最底部執行,假如我們前面又錯誤發(fā)生,那就完了!我們就會(huì )向數據庫中添加了一個(gè)錯誤的信息。因為我們用了on error resume next 一切的錯誤都被忽略了!即使前面出錯,程式依舊會(huì )向數據庫中添加數據的。
為避免這種情況,我們就先得做些手腳,正確處理的方法如下:
if err.number = 0 and objconnection.errors.count = 0 then
這里才能執行語(yǔ)句,因為沒(méi)有錯誤
set rstresults = dbdata.execute(txtsql)
end if
更多高級的處理辦法
當一個(gè)錯誤發(fā)生時(shí),您們也能夠顯示更多的錯誤信息。下面是同時(shí)處理數據庫和頁(yè)面錯誤的例子,有了他我們一下就能發(fā)現我們程式中的任何錯誤。(由于有些地方我覺(jué)得英文更能說(shuō)時(shí)問(wèn)題,所以沒(méi)有翻譯)。
<%
if err.number <> 0 then
response.clear
select case err.number
case 8 指定錯誤的number
在這里處理自定義錯誤
case else 一般錯誤
if isobject(objconnection) then
if objconnection.errors.count > 0 then
%>
<b>database connection object</b>
<% for intloop = 0 to objconnection.errors.count - 1 %>
error no: <%= objconnection.errors(intloop).number %><br>
description: <%= objconnection.errors(intloop).description %><br>
source: <%= objconnection.errors(intloop).source %><br>
sqlstate: <%= objconnection.errors(intloop).sqlstate %><br>
nativeerror: <%= objconnection.errors(intloop).nativeerror %><p>
<% next
end if
end if
if err.number <> 0 then
%>
<b>page error object</b><br>
error number <%= err.number %><br>
error description <%= err.description %><br>
source <%= err.source %><br>
linenumber <%= err.line %><p>
<% end if
end select
end if
%>
上面的例子讓我們一下了處理了很多在數據庫中出現的問(wèn)題,這個(gè)在我們日常編程也是常用的!我們也應該看到那個(gè)select case 語(yǔ)句,他能讓我們來(lái)處理特定的錯誤。
redirect 和錯誤處理
有一點(diǎn)我們就當注意一下,就是我們常用到的redirect對象,假如一個(gè)頁(yè)面中出現了redirect對象,那么錯誤處理就失去了意義。所以在轉向之前我們還得處理一下,如下:
if err.number = 0 and objconnection.errors.count = 0 then
response.clear
response.redirect ?lt;url here>?
end if
把代碼變得更整齊
為了讓代碼變得更整齊,首先把錯誤處理的文檔放在一個(gè)包含文檔中。這樣您就能夠在任何文檔中使用他。這樣修改也方便。
在您程式的最上方加入(當然在語(yǔ)言聲明之后)on error resume next語(yǔ)句。
在您執行sql以前進(jìn)行錯誤檢查。
使用redirect以前也要進(jìn)行錯誤處理。
讓您處理錯誤的包含文檔在代碼的最上面
ActiveServerPages,ASP0126(0x80004005)-->找不到包含文件
MicrosoftOLEDBProviderforODBCDrivers(0x80040E21)-->sql語(yǔ)句出錯(數據類(lèi)型不匹配或表名(字段名)錯誤或表處于編輯狀態(tài),或表不存在于conn打開(kāi)的數據庫中)
MicrosoftOLEDBProviderforODBCDrivers(0x80040E14)-->sql語(yǔ)句出錯(字段名錯誤,或數據類(lèi)型不匹配)
MicrosoftOLEDBProviderforODBCDrivers(0x80040E07)-->sql語(yǔ)句出錯(要插入或更新的字段的類(lèi)型與變量數據類(lèi)型不匹配)
MicrosoftOLEDBProviderforODBCDrivers(0x80040E57)-->sql語(yǔ)句出錯(要插入或更新的數據溢出)
MicrosoftOLEDBProviderforODBCDrivers(0x80040E10)-->sql語(yǔ)句出錯(update字段名或要更新的數據類(lèi)型錯誤)
MicrosoftOLEDBProviderforODBCDrivers(0x80004005)-->sql語(yǔ)句出錯(要插入或更新的字段的數值不能為空值)
MicrosoftOLEDBProviderforODBCDrivers(0x80004005) -->打開(kāi)數據庫出錯,沒(méi)有在指定目錄發(fā)現數據庫
MicrosoftOLEDBProviderforODBCDrivers(0x80040E37)-->沒(méi)有發(fā)現表
MicrosoftVBscript運行時(shí)錯誤(0x800A000D)-->錯誤引用rs變量(rs對像已關(guān)閉或未定義)
MicrosoftVBscript運行時(shí)錯誤(0x800A01C2)-->vbscript腳本錯誤(vbscript語(yǔ)句出錯)
MicrosoftVBscript運行時(shí)錯誤(0x800A0006)-->vbscript腳本錯誤(溢出錯誤)
MicrosoftVBscript編譯器錯誤(0x800A040E)-->缺少loop
MicrosoftVBscript編譯器錯誤(0x800A03EA)-->缺少if或endif
MicrosoftVBscript編譯器錯誤(0x800A03EE)--> 語(yǔ)句未結束(缺少")")
MicrosoftVBscript編譯器錯誤(0x800A03F6)-->if語(yǔ)句出錯(缺少endif)
MicrosoftVBscript運行時(shí)錯誤(0x800A005B)-->缺少set
MicrosoftVBscript運行時(shí)錯誤(0x800A0005)-->變量未定義
MicrosoftVBscript編譯器錯誤(0x800A03F9)-->if語(yǔ)句缺少then
MicrosoftVBscript編譯器錯誤(0x800A0411)-->dim語(yǔ)句定義錯誤
MicrosoftVBscript編譯器錯誤(0x800A0408)-->sql語(yǔ)句錯誤(?????????????????)
Microsoft VBScript 運行時(shí)錯誤 (0x800A01B6)錯誤原因:set rs=server.create......你少了 set
ADODB.Recordset(0x800A0BB9)-->sql語(yǔ)句出錯(sql語(yǔ)句或conn語(yǔ)句未定義或對一個(gè)rs屬性進(jìn)行賦值時(shí)發(fā)生錯誤)
ADODB.Recordset(0x800A0CC1)-->rs對像出錯(rs對像本身不存在或錯誤地引用了一個(gè)不存在的字段名)
ADODB.Recordset(0x800A0BCD)-->rs對像出錯(記錄集中沒(méi)有記錄卻對記錄集進(jìn)行操作)
ADODB.Recordset(0x800A0E78)-->rs對像出錯(記錄集不存在,缺少rs.open語(yǔ)句)
ADODB.Recordset(0x800A0CC1) -->rs對像出錯(引用了一個(gè)不存在的字段名)
ADODB.Recordset(0x800A0E7D)-->conn定義錯誤
ADODB.Recordset(0x800A0CB3)-->數據庫以只讀方式打開(kāi),無(wú)法更新數據
如果 VBScript 語(yǔ)句結構違反了一個(gè)或多個(gè) VBScript 腳本語(yǔ)言語(yǔ)法規則,就會(huì )產(chǎn)生 VBScript 語(yǔ)法錯誤。
錯誤通常在執行程序前,編譯程序時(shí)產(chǎn)生。 以下是53個(gè)語(yǔ)法錯誤:
錯誤編號 描述
十進(jìn)制 十六進(jìn)制 說(shuō)明
1001 800A03E9 內存不足
1002 800A03EA 語(yǔ)法錯誤
1003 800A03EB 缺少“:”
1005 800A03ED 需要 '('
1006 800A03EE 需要 ')'
1007 800A03EF 缺少“]”
1010 800A03F2 需要標識符
1011 800A03F3 需要 '='
1012 800A03F4 需要 'If'
1013 800A03F5 需要 'To'
1014 800A03F6 需要 'End'
1015 800A03F7 需要 'Function'
1016 800A03F8 需要 'Sub'
1017 800A03F9 需要 'Then'
1018 800A03FA 需要 'Wend'
1019 800A03FB 需要 'Loop'
1020 800A03FC 需要 'Next'
1021 800A03FD 需要 'Case'
1022 800A03FE 需要 'Select'
1023 800A03FF 需要表達式
1024 800A0400 需要語(yǔ)句
1025 800A0401 需要語(yǔ)句的結束
1026 800A0402 需要整數常數
1027 800A0403 需要 'While' 或 'Until'
1028 800A0404 需要 'While,'、 'Until,' 或語(yǔ)句未結束
1029 800A0405 需要 'With'
1030 800A0406 標識符太長(cháng)
1031 800A0407 無(wú)效的數
1032 800A0408 無(wú)效的字符
1033 800A0409 未結束的串常量
1034 800A040A 未結束的注釋
1037 800A040D 無(wú)效使用關(guān)鍵字 'Me'
1038 800A040E 'loop' 沒(méi)有 'do'
1039 800A040F 無(wú)效 'exit' 語(yǔ)句
1040 800A0410 無(wú)效 'for' 循環(huán)控制變量
1041 800A0411 名稱(chēng)重定義
1042 800A0412 必須為行的第一個(gè)語(yǔ)句
1043 800A0413 不能賦給非Byval參數
1044 800A0414 調用 Sub 時(shí)不能使用圓括號
1045 800A0415 需要文字常數
1046 800A0416 需要 'In'
1047 800A0417 需要 'Class'
1048 800A0418 必須在一個(gè)類(lèi)的內部定義
1049 800A0419 在屬性聲明中需要 Let , Set 或 Get
1050 800A041A 需要 'Property'
1051 800A041B 參數數目必須與屬性說(shuō)明一致
1052 800A041C 在類(lèi)中不能有多個(gè)缺省的屬性/方法
1053 800A041D 類(lèi)初始化或終止不能帶參數
1054 800A041E Property Let 或 Set 至少應該有一個(gè)參數
1055 800A041F 不需要的 'Next'
1056 800A0420 只能在 ‘Property’ 或 ’Function’ 或 ’Sub’ 上指定 ’Default’
1057 800A0421 說(shuō)明 'Default' 必須同時(shí)說(shuō)明 'Public' "
1058 800A0422 只能在 Property Get 中指定 'Default'
VBScript 運行時(shí)錯誤
如果 VBScript 腳本執行系統無(wú)法實(shí)施的操作,則會(huì )產(chǎn)生 VBScript 運行時(shí)錯誤。只有在運行腳本、為變量表達式賦值或
分配內存時(shí),才會(huì )產(chǎn)生 VBScript 運行時(shí)錯誤。 以下是65個(gè)運行時(shí)錯誤:
錯誤編號 描述
十進(jìn)制 十六進(jìn)制 說(shuō)明
5 800A0005 無(wú)效過(guò)程調用或參數
6 800A0006 溢出
7 800A0007 內存不足
9 800A0009 下標越界
10 800A000A 該數組為定長(cháng)的或臨時(shí)被鎖定
11 800A000B 被零除
13 800A000D 類(lèi)型不匹配
14 800A000E 字符串空間溢出
17 800A0011 無(wú)法
執行請求的操作
28 800A001C 堆棧溢出
35 800A0023 未定義 Sub 或 Function
48 800A0030 加載 DLL 錯誤
51 800A0033 內部錯誤
52 800A0034 壞文件名或數
53 800A0035 文件未找到
54 800A0036 壞文件模式
55 800A0037 文件已經(jīng)打開(kāi)
57 800A0039 設備I/O錯誤
58 800A003A 文件已經(jīng)存在
61 800A003D 磁盤(pán)空間已滿(mǎn)
62 800A003E 輸入超出文件尾
67 800A0043 文件太多
68 800A0044 設備不可用
70 800A0046 權限禁用
71 800A0047 磁盤(pán)未準備好
74 800A004A 不能用不同的驅動(dòng)器重新命名
75 800A004B 路徑/文件訪(fǎng)問(wèn)錯誤
76 800A004C 路徑未找到
91 800A005B 未設置對象變量
92 800A005C For 循環(huán)未初始化
94 800A005E 非法使用 Null
322 800A0142 不能建立所需臨時(shí)文件
424 800A01A8 需要對象
429 800A01AD ActiveX 部件無(wú)法創(chuàng )建對象
430 800A01AE 類(lèi)不支持自動(dòng)化
432 800A01B0 在自動(dòng)化操作中未找到文件名或類(lèi)名
438 800A01B6 對象不支持該屬性或方法
440 800A01B8 Automation錯誤
445 800A01BD 對象不支持此操作
446 800A01BE 對象不支持指定的參數
447 800A01BF 對象不支持當前的區域設置
448 800A01C0 未找到命名參數
449 800A01C1 參數不可選
450 800A01C2 錯誤的參數個(gè)數或無(wú)效的參數屬性值
451 800A01C3 對象不是一個(gè)集合
453 800A01C5 指定的dll函數未找到
455 800A01C7 代碼源鎖錯誤
457 800A01C9 這個(gè)鍵已經(jīng)是本集合的一個(gè)元素關(guān)聯(lián)
458 800A01CA 變量使用了一個(gè) VBScript 中不支持的自動(dòng)化(Automation)類(lèi)型
462 800A01CE 遠程服務(wù)器不存在或不能訪(fǎng)問(wèn)
481 800A01E1 無(wú)效圖片
500 800A01F4 變量未定義
501 800A01F5 違法的分配
502 800A01F6 腳本對象不安全
503 800A01F7 對象不能安全初始化
504 800A01F8 對象不能安全創(chuàng )建
505 800A01F9 無(wú)效的或不合格的引用
506 800A01FA 類(lèi)未被定義
507 800A01FB 發(fā)生異常
5016 800A1398 需要正則表達式對象
5017 800A1399 正則表達式中的語(yǔ)法錯誤
5018 800A139A 錯誤的數量詞
5019 800A139B 在正則表達式中需要 ']'
5020 800A139C 在正則表達式中需要 ')'
5021 800A139D 字符集越界
32811 800A802B 元素未找到
Request對象功能是從客戶(hù)端得到數據,常用的三種取得數據的方法是:Request.Form、Request.QueryString,Request。其第三種是前兩種的一個(gè)縮寫(xiě),可以取代前兩種情況。而前兩種主要對應的Form提交時(shí)的兩種不同的提交方法:分別是Post方法和Get方法。
Request 對象的屬性和方法比較多,常用的幾個(gè)為:UserAgent 傳回客戶(hù)端瀏覽器的版本信息,UserHostAddress 傳回遠方客戶(hù)端機器的主機IP 地址,UserHostName 傳回遠方客戶(hù)端機器的DNS 名稱(chēng),PhysicalApplicationPath 傳回目前請求網(wǎng)頁(yè)在Server 端的真實(shí)路徑。
從瀏覽器獲取數據
利用Request方法,可以讀取其他頁(yè)面提交過(guò)來(lái)的數據。提交的數據有兩種形式:一種是通過(guò)Form表單提交過(guò)來(lái),另一種是通過(guò)超級鏈接后面的參數提交過(guò)來(lái),兩種方式都可以利用Request對象讀取。
<%@ Page Language="C#"%>
<%
string strUserName = Request["Name"];
string strUserLove = Request["Love"];
%>
姓名:<%=strUserName%>
愛(ài)好:<%=strUserLove%>
<form action="" method="post">
<P>姓名:<input type="TEXT" size="20" name="Name"></P>
<P>興趣:<input type="TEXT" size="20" name="Love"></P>
<P><input type="submit" value="提 交"></P>
</form>
得到客戶(hù)端的信息
利用Request對象內置的屬性,可以得到一些客戶(hù)端的信息,比如客戶(hù)端瀏覽器版本和客戶(hù)端地址等等
<%@ Page Language="C#"%>
客戶(hù)端瀏覽器:<%=Request.UserAgent %>
客戶(hù)端IP地址:<%=Request.UserHostAddress %>
當前文件服務(wù)端物理路徑:<%=Request.PhysicalApplicationPath %>
Request 對象的屬性
UserLanguages 客戶(hù)端主機所使用的語(yǔ)言
UserHostName 客戶(hù)端主機的DNS名稱(chēng)
userHostArrress 客戶(hù)端主機的IP地址
UserAgent 客戶(hù)端瀏覽器版本
Url 當前要求的URL
TotalBytes 當前輸入的容量大小
ServerVariables 網(wǎng)頁(yè)的Server變量
RequestType 客戶(hù)端網(wǎng)頁(yè)的傳送方式(Get/Post)
RawUrl 當前頁(yè)面的U『RL
QueryString 瀏覽器地址欄后的參數
PhysicalPath 當前網(wǎng)頁(yè)在服務(wù)器端的實(shí)際路徑
PhysicalApplicationPath 當前在服務(wù)器端執行的程序的實(shí)際路徑
Pathq 當前網(wǎng)頁(yè)的相對地址
Params 返回QueryString、Form、Cookies、ServerVariables的全部集合
IsSecureConnection 目前聯(lián)機的安全性
IsAuthenticated 目前聯(lián)機是否有效
HttpMethod 目前客戶(hù)端網(wǎng)頁(yè)的傳送方式(Get/Post)
Headers 網(wǎng)頁(yè)的標題集合
Form 窗體變量
Files 客戶(hù)端上傳的文件
FilePath 當前執行網(wǎng)頁(yè)的相對地址
Cookies HttpCookieCollection對象集合
ContentType 當前需求的MIME內容類(lèi)型
ContentEncoding 客戶(hù)端瀏覽器的字符設置 -
ConnectionlD 客戶(hù)端所提出的網(wǎng)頁(yè)瀏覽請求的聯(lián)機的ID
ClientCertificate 客戶(hù)端安全認證信息
Browser 客戶(hù)端瀏覽器的信息
AnnlicationPath 當前運行程序的服務(wù)器端虛擬目錄
-ASP重點(diǎn)整理 ASP重點(diǎn)整理
HTML語(yǔ)言重點(diǎn) HTML語(yǔ)言重點(diǎn)
<!-- 這是註解 --> <!-- 這是注解 --> HTML 語(yǔ)言中的註解 HTML 語(yǔ)言中的注解
傳送資料至 ASP 傳送資料至 ASP
<form action= 接收檔 .asp metcho=post> <form action= 接收檔 .asp metcho=post> 輸入資料傳送至 ASP 檔案帳號: <input type=text name=name size=20><p> 輸入資料傳送至 ASP 檔案賬號: <input type=text name=name size=20><p> 文字輸入區塊 文字輸入區塊
密碼: <input type=password name=pws size=10><p> 密碼: <input type=password name=pws size=10><p> 密碼輸入區塊 密碼輸入區塊
<input type=submit value=” 確定 ”> <input type=submit value=” 確定 ”> 傳送資料按鈕 傳送資料按鈕
</form> </form>
response.redirect “example.asp” à 將網(wǎng)頁(yè)轉向到其它的網(wǎng)址 response.redirect “example.asp” à 將網(wǎng)頁(yè)轉向到其它的網(wǎng)址
response.write “<a href=menu.asp?name=” 資料 ”&email=” 資料 ”> 進(jìn)入 ” à 傳資料至 menu.asp response.write “<a href=menu.asp?name=” 資料 ”&email=” 資料 ”> 進(jìn)入 ” à 傳資料至 menu.asp
接收 ASP 傳來(lái)的資料 接收 ASP 傳來(lái)的資料
<!--#include virtual=”/lib.inc”--> <!--#include virtual=”/lib.inc”--> 插入存放在 Web 伺服器主目錄的 lib.inc 函式檔 插入存放在 Web 伺服器主目錄的 lib.inc 函式檔
<!--#include file=”lib.inc”--> <!--#include file=”lib.inc”--> 將同一個(gè)子目錄的 lib.inc 檔案插入 將同一個(gè)子目錄的 lib.inc 檔案插入
name=request(“name”) , pws=request(“pws”) name=request(“name”) , pws=request(“pws”) 取得傳遞的內容 取得傳遞的內容
Session(“username”)=” 陳小明 ” à 建立 Session 物件 Session(“username”)=” 陳小明 ” à 建立 Session 物件
Session.Abandon à 結束 Session ,也就是登出網(wǎng)站。 Session.Abandon à 結束 Session ,也就是登出網(wǎng)站。
開(kāi)啟資料庫檔案 開(kāi)啟資料庫檔案
Set conn=Server.CreateObject("ADODB.Connection") Set conn=Server.CreateObject("ADODB.Connection")
Conn.open "provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("資料庫.mdb") & ";Jet OLEDB:Database Password=" & "xxxxxxxx" Conn.open "provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("資料庫.mdb") & ";Jet OLEDB:Database Password=" & "xxxxxxxx"
set rs=Server.CreateObject("ADODB.Recordset") set rs=Server.CreateObject("ADODB.Recordset")
set rs1=Server.CreateObject("ADODB.Recordset") set rs1=Server.CreateObject("ADODB.Recordset")
set rs2=Server.CreateObject("ADODB.Recordset") set rs2=Server.CreateObject("ADODB.Recordset")
sql="where name like '%" & i_name & "%' or department=" & i_department sql="where name like '%" & i_name & "%' or department=" & i_department
rs.open "select * from 資料表1 " & sql & " order by欄位名稱(chēng)" , Conn , 3 , 2 rs.open "select * from資料表1 " & sql & " order by欄位名稱(chēng)" , Conn , 3 , 2
rs1.open "select * from 資料表2" , Conn , 3 , 2 rs1.open "select * from資料表2" , Conn , 3 , 2
rs2.open "select * from 資料表3" , Conn , 3 , 2 rs2.open "select * from資料表3" , Conn , 3 , 2
addsql="insert Into 閱讀記錄 (id, ip, readdate) values (" & sqlstr(rs("id")) à 建立新增記錄的 SQL 指令 addsql="insert Into 閱讀記錄 (id, ip, readdate) values (" & sqlstr(rs("id")) à 建立新增記錄的 SQL 指令
conn.Execute conn.Execute addsql à 執行新增記錄的 SQL 指令 addsql à 執行新增記錄的 SQL 指令
rs1.close 關(guān)閉資料庫的連接,set rs1=nothing 釋放rs1物件所佔用的空間 rs1.close關(guān)閉資料庫的連接,set rs1=nothing釋放rs1物件所占用的空間
conn.close 關(guān)閉資料庫連接,set conn=nothing 釋放conn物件所佔用的空間 conn.close關(guān)閉資料庫連接,set conn=nothing釋放conn物件所占用的空間
資料庫的記錄處理 資料庫的記錄處理
rs.BOF à 第一筆記錄之前, rs.EOF à 最後一筆記錄之後 rs.BOF à 第一筆記錄之前, rs.EOF à 最后一筆記錄之后
rs.AbsolutePosition=N à 目前指標的位置,如為負數表示為 BOF 或 EOF rs.AbsolutePosition=N à 目前指標的位置,如為負數表示為 BOF 或 EOF
rs.RecordCount à 記錄的總筆數 rs.RecordCount à 記錄的總筆數
rs.pagesize=10 à 設每頁(yè) 10 筆, rs.absolutepage à 目前所在頁(yè), rs.pagecount à 總頁(yè)數 rs.pagesize=10 à 設每頁(yè) 10 筆, rs.absolutepage à 目前所在頁(yè), rs.pagecount à 總頁(yè)數
rs.delete à 刪除一筆, rs.update à 更新, rs.cancelupdate à 取消 rs.delete à 刪除一筆, rs.update à 更新, rs.cancelupdate à 取消
rs.addnew à 新增一筆資料,再用 rs(“ 欄位 ”)=” 資料 ” ,再用 rs.update 更新或 rs.cancelupdate 取消 rs.addnew à 新增一筆資料,再用 rs(“ 欄位 ”)=” 資料 ” ,再用 rs.update 更新或 rs.cancelupdate 取消
rs.movenext à 下一筆, rs.moveprevious à 上一筆, rs.movefirst à 第一筆, rs.movelast à 最後一筆 rs.movenext à 下一筆, rs.moveprevious à 上一筆, rs.movefirst à 第一筆, rs.movelast à 最后一筆
rs.close à 關(guān)閉 RecordSet 物件 rs.close à 關(guān)閉 RecordSet 物件
其它重點(diǎn) 其它重點(diǎn)
for/next 中途離開(kāi)必需用 if rs.eof then exit for for/next 中途離開(kāi)必需用 if rs.eof then exit for
取得 IP 位址, IP=request.servervariables(“REMOTE_ADDR”) 取得 IP 位址, IP=request.servervariables(“REMOTE_ADDR”)
response.expires=數字,用來(lái)設定網(wǎng)頁(yè)保留在客戶(hù)端瀏覽器Cache的時(shí)間長(cháng)度,以分鐘為單位,0表不保留 response.expires=數字,用來(lái)設定網(wǎng)頁(yè)保留在客戶(hù)端瀏覽器Cache的時(shí)間長(cháng)度,以分鐘為單位,0表不保留
response.redirect "網(wǎng)址",連結至其它網(wǎng)頁(yè) response.redirect "網(wǎng)址",連結至其它網(wǎng)頁(yè)
response.write "字串",顯示某一段字串訊息,總長(cháng)度不可超過(guò)1022個(gè)字元 response.write "字串",顯示某一段字串訊息,總長(cháng)度不可超過(guò)1022個(gè)字元
request.form("表單欄位名稱(chēng)"),取得表單的某一欄位值,限用POST方法 request.form("表單欄位名稱(chēng)"),取得表單的某一欄位值,限用POST方法
request.querystring("變數名稱(chēng)"),取得URL之?字元符號之後的文字 request.querystring("變數名稱(chēng)"),取得URL之?字元符號之后的文字
1.記錄集關(guān)閉之前再次打開(kāi):
------------------------------------
sql="select * from test"
rs.open sql,conn,1,1
if not rs.eof then
dim myName
myName=rs("name")
end if
sql="select * from myBook"
rs.open sql,conn,1,1
-------------------------------------
解決:在第二次rs.open之前先關(guān)閉 rs.close
或
set rs1=server.createobject
rs1.open sql,conn,1,1
2,用SQL關(guān)鍵字做表名或字段名
-------------------------------------
sql="select * from user"
rs.open sql,conn,1,1
-------------------------------------
user為sql關(guān)鍵字
解決:改為
sql="select * from [user]"
3,用鎖定方式去進(jìn)行update
-------------------------------------
sql="select * from [user]"
rs.open sql,conn,1,1
rs.addnew
或
rs("userName")="aa"
rs.update
-------------------------------------
當前記錄集的打開(kāi)方式為只讀
解決:
改為
rs.open sql,conn,1,3
4,在查詢(xún)語(yǔ)句中采用的對比字段值與字段類(lèi)型不符
-----------------------------------------
sql="select * from [user] where id='" & myID & "'"
rs.open sql,conn,1,1
-----------------------------------------
假設表中設計ID為數字型,那么些時(shí)出錯。
解決:
sql="select * from [user] where id=" & myID
5,未檢查變量值而出錯
-----------------------------------------
sql="select * from [user] where id=" & myID
rs.open sql,conn,1,1
-----------------------------------------
假設myID變量此時(shí)值為null,那么sql將成為
sql="select * from [user] where id="
解決:
在前面加上
if isnull(myID) then 出錯提示
6,未檢查變量值類(lèi)型而出錯
-----------------------------------------
sql="select * from [user] where id=" & myID
rs.open sql,conn,1,1
-----------------------------------------
假設id為數字型,myID變量此時(shí)值不為null,但為字符,比如myID此時(shí)為"aa"
那么sql將成為
sql="select * from [user] where id=aa"
解決:
在前面加上
if isnumeric(myID)=false then 出錯提示
這也可以有效防止 sql injection 漏洞攻擊。
7,由于數據庫文件所在目錄的NTFS權限而引起的'不能更新。數據庫或對象為只讀"錯誤。
說(shuō)明:
WIN2K系統延續了WINNT系統的NTFS權限。
對于系統中的文夾都有默認的安全設置。
而通過(guò)HTTP對WWW訪(fǎng)問(wèn)時(shí)的系統默認用戶(hù)是 iusr_計算機名 用戶(hù) ,它屬于guest組。
當通過(guò)HTTP訪(fǎng)問(wèn)時(shí),可以ASP或JSP,也或是PHP或.NET程序對數據進(jìn)行修改操作:
比如:
當打開(kāi)某一個(gè)文章時(shí),程序設定,文章的閱讀次數=原閱讀次數+1
執行
conn.execute("update arts set clicks=clicks+1 where id=n")
語(yǔ)句時(shí),如果 iusr_計算機名 用戶(hù)沒(méi)有對數據庫的寫(xiě)權限時(shí),就會(huì )出錯.
解決方法:
找到數據庫所在目錄
右鍵》屬性》安全選項卡》設置 iusr_計算機名 用戶(hù)的寫(xiě)權限(當然,也可以是everyone
歡迎光臨!今天是2010年10月27日 星期三
首頁(yè) 基礎教程 留言薄制作 神奇FSO ASP優(yōu)化 ASP實(shí)例 SQL語(yǔ)法 VB教程 安全手冊 綜合技巧 案頭必備 留言
案頭必備
·ASP中時(shí)間函數的使用-1
·ASP中時(shí)間函數的使用-2
·ASP中時(shí)間函數的使用-3
·ASP編程中20個(gè)非常有用的..
·ASP提速技巧
·ASP函數大全-1
·ASP函數大全-2
·ASP函數大全-3
·ASP函數大全-4
·ASP初學(xué)者常犯的幾個(gè)錯誤
·asp函數大全
·用ASP與ADO查詢(xún)Web數..
·用ASP訪(fǎng)問(wèn)數據庫的幾種常見(jiàn)..
·ASP中Cookie使用指南
·最大限度優(yōu)化你的Asp性能
·使用ASP常見(jiàn)問(wèn)題解答
■ 案頭必備 > ASP編程中20個(gè)非常有用的例子
如果內容很多,請先在本機編輯好,以免session過(guò)期導致內容丟失。ASP 編程中 20 個(gè)非常有用的例子
1.如何用Asp判斷你的網(wǎng)站的虛擬物理路徑
答:使用Mappath方法
< p align="center" >< font size="4" face="Arial" >< b >
The Physical path to this virtual website is:
< /b >< /font >
< font color="#FF0000" size="6" face="Arial" >
< %= Server.MapPath("\")% >
< /font >< /p >
2.我如何知道使用者所用的瀏覽器?
答:使用the Request object方法
strBrowser=Request.ServerVariables("HTTP_USER_AGENT")
If Instr(strBrowser,"MSIE") < > 0 Then
Response.redirect("ForMSIEOnly.htm")
Else
Response.redirect("ForAll.htm")
End If
3.如何計算每天的平均反復訪(fǎng)問(wèn)人數
答:解決方法
< % startdate=DateDiff("d",Now,"01/01/1990")
if strdate< 0 then startdate=startdate*-1
avgvpd=Int((usercnt)/startdate) % >
顯示結果
< % response.write(avgvpd) % >
that is it.this page have been viewed since November 10,1998
4.如何顯示隨機圖象
< % dim p,ppic,dpic
ppic=12
randomize
p=Int((ppic*rnd)+1)
dpic="graphix/randompics/"&p&".gif"
% >
顯示
< img src="< %=dpic% >" >
5.如何回到先前的頁(yè)面
答:< a href="< %=request.serverVariables("Http_REFERER")% >" >preivous page< /a >
或用圖片如:< img src="arrowback.gif" alt="< %=request.serverVariables("HTTP_REFERER")% >" >
6.如何確定對方的IP地址
答:< %=Request.serverVariables("REMOTE_ADDR)% >
7.如何鏈結到一副圖片上
答:< % @Languages=vbscript % >
< % response.expires=0
strimagename="graphix/errors/erroriamge.gif"
response.redirect(strimagename)
% >
8.強迫輸入密碼對話(huà)框
答:把這句話(huà)放載頁(yè)面的開(kāi)頭
< % response.status="401 not Authorized"
response.end
% >
9.如何傳遞變量從一頁(yè)到另一頁(yè)
答:用 HIDDEN 類(lèi)型來(lái)傳遞變量
< % form method="post" action="mynextpage.asp" >
< % for each item in request.form % >
< input namee="< %=item% >" type="HIDDEN"
value="< %=server.HTMLEncode(Request.form(item)) % >" >
< % next % >
< /form >
10.為何我在 asp 程序內使用 msgbox,程序出錯說(shuō)沒(méi)有權限
答:由于 asp 是服務(wù)器運行的,如果可以在服務(wù)器顯示一個(gè)對話(huà)框,那么你只好等有人按了確定之后,你的程序才能繼續執行,而一般服務(wù)器不會(huì )有人守著(zhù),所以微軟不得不禁止這個(gè)函數,并胡亂告訴你 (:) 呵呵) 沒(méi)有權限。但是ASP和客戶(hù)端腳本結合倒可以顯示一個(gè)對話(huà)框,as follows:
< % yourVar="測試對話(huà)框"% >
< % script language='javascript' >
alert("< %=yourvar% >")
< /script >
11.有沒(méi)有辦法保護自己的源代碼,不給人看到
答:可以去下載一個(gè)微軟的Windows Script Encoder,它可以對asp的腳本和客戶(hù)端javascript/vbscript腳本進(jìn)行加密。。。不過(guò)客戶(hù)端加密后,只有ie5才能執行,服務(wù)器端腳本加密后,只有服務(wù)器上安裝有script engine 5(裝一個(gè)ie5就有了)才能執行。
12.怎樣才能將 query string 從一個(gè) asp 文件傳送到另一個(gè)?
答:前者文件加入下句: Response.Redirect("second.asp?" & Request.ServerVariables("QUERY_STRING"))
13.global.asa文件總是不起作用?
答:只有web目錄設置為web application, global.asa才有效,并且一個(gè)web application的根目錄下 global.asa才有效。IIS4可以使用Internet Service Manager設置application setting 怎樣才能使得htm文件如同asp文件一樣可以執行腳本代碼?
14.怎樣才能使得htm文件如同asp文件一樣可以執行腳本代碼?
答:Internet Sevices Manager - > 選擇default web site - >右鼠鍵- >菜單屬性-〉主目錄- > 應用程序設置(Application Setting)- > 點(diǎn)擊按鈕 "配置"- > app mapping - >點(diǎn)擊按鈕"Add" - > executable browse選擇 \WINNT\SYSTEM32\INETSRV\ASP.DLL EXTENSION 輸入 htm method exclusions 輸入PUT.DELETE 全部確定即可。但是值得注意的是這樣對htm也要由asp.dll處理,效率將降低。
15.如何注冊組件
答:有兩種方法。
第一種方法:手工注冊 DLL 這種方法從IIs 3.0一直使用到IIs 4.0和其它的Web Server。它需要你在命令行方式下來(lái)執行,進(jìn)入到包含有DLL的目錄,并輸入:regsvr32 component_name.dll 例如 c:\temp\regsvr32 AspEmail.dll 它會(huì )把dll的特定信息注冊入服務(wù)器中的注冊表中。然后這個(gè)組件就可以在服務(wù)器上使用了,但是這個(gè)方法有一個(gè)缺陷。當使用這種方法注冊完畢組件后,該組件必須要相應的設置NT的匿名賬號有權限執行這個(gè)dll。特別是一些組件需要讀取注冊表,所以,這個(gè)注冊組件的方法僅僅是使用在服務(wù)器上沒(méi)有MTS的情況下,要取消注冊這個(gè)dll,使用:regsvr32 /u aspobject.dll example c:\temp\regsvr32 /u aneiodbc.dll
第二種方法:使用MTS(Microsoft Transaction Server) MTS是IIS 4新增特色,但是它提供了巨大的改進(jìn)。MTS允許你指定只有有特權的用戶(hù)才能夠訪(fǎng)問(wèn)組件,大大提高了網(wǎng)站服務(wù)器上的安全性設置。在MTS上注冊組件的步驟如下:
1) 打開(kāi)IIS管理控制臺。
2) 展開(kāi)transaction server,右鍵單擊"pkgs installed"然后選擇"new package"。
3) 單擊"create an empty package"。
4) 給該包命名。
5) 指定administrator賬號或則使用"interactive"(如果服務(wù)器經(jīng)常是使用administrator 登陸的話(huà))。
6) 現在使用右鍵單擊你剛建立的那個(gè)包下面展開(kāi)后的"components"。選擇 "new then component"。
7) 選擇 "install new component" 。
8) 找到你的.dll文件然后選擇next到完成。
要刪除這個(gè)對象,只要選擇它的圖標,然后選擇delete。
附注:特別要注意第二種方法,它是用來(lái)調試自己編寫(xiě)組件的最好方法,而不必每次都需要重新啟動(dòng)機器了。
16. ASP與Access數據庫連接:
<%@ language=VBscript%>
<%
dim conn,mdbfile
mdbfile=server.mappath("數據庫名稱(chēng).mdb")
set conn=server.createobject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};uid=admin;pwd=數據庫密碼;dbq="&mdbfile
%>
17. ASP與SQL數據庫連接:
<%@ language=VBscript%>
<%
dim conn
set conn=server.createobject("ADODB.connection")
con.open "PROVIDER=SQLOLEDB;DATA SOURCE=SQL服務(wù)器名稱(chēng)或IP地址;UID=sa;PWD=數據庫密碼;DATABASE=數據庫名稱(chēng)
%>
建立記錄集對象:
set rs=server.createobject("adodb.recordset")
rs.open SQL語(yǔ)句,conn,3,2
18. SQL常用命令使用方法:
(1) 數據記錄篩選:
sql="select * from 數據表 where 字段名=字段值 order by 字段名 [desc]"
sql="select * from 數據表 where 字段名 like '%字段值%' order by 字段名 [desc]"
sql="select top 10 * from 數據表 where 字段名 order by 字段名 [desc]"
sql="select * from 數據表 where 字段名 in ('值1','值2','值3')"
sql="select * from 數據表 where 字段名 between 值1 and 值2"
(2) 更新數據記錄:
sql="update 數據表 set 字段名=字段值 where 條件表達式"
sql="update 數據表 set 字段1=值1,字段2=值2 …… 字段n=值n where 條件表達式"
(3) 刪除數據記錄:
sql="delete from 數據表 where 條件表達式"
sql="delete from 數據表" (將數據表所有記錄刪除)
(4) 添加數據記錄:
sql="insert into 數據表 (字段1,字段2,字段3 …) valuess (值1,值2,值3 …)"
sql="insert into 目標數據表 select * from 源數據表" (把源數據表的記錄添加到目標數據表)
(5) 數據記錄統計函數:
AVG(字段名) 得出一個(gè)表格欄平均值
COUNT(*|字段名) 對數據行數的統計或對某一欄有值的數據行數統計
MAX(字段名) 取得一個(gè)表格欄最大的值
MIN(字段名) 取得一個(gè)表格欄最小的值
SUM(字段名) 把數據欄的值相加
引用以上函數的方法:
sql="select sum(字段名) as 別名 from 數據表 where 條件表達式"
set rs=conn.excute(sql)
用 rs("別名") 獲取統的計值,其它函數運用同上。
(5) 數據表的建立和刪除:
CREATE TABLE 數據表名稱(chēng)(字段1 類(lèi)型1(長(cháng)度),字段2 類(lèi)型2(長(cháng)度) …… )
例:CREATE TABLE tab01(name varchar(50),datetime default now())
DROP TABLE 數據表名稱(chēng) (永久性刪除一個(gè)數據表)
19. 記錄集對象的方法:
rs.movenext 將記錄指針從當前的位置向下移一行
rs.moveprevious 將記錄指針從當前的位置向上移一行
rs.movefirst 將記錄指針移到數據表第一行
rs.movelast 將記錄指針移到數據表最后一行
rs.absoluteposition=N 將記錄指針移到數據表第N行
rs.absolutepage=N 將記錄指針移到第N頁(yè)的第一行
rs.pagesize=N 設置每頁(yè)為N條記錄
rs.pagecount 根據 pagesize 的設置返回總頁(yè)數
rs.recordcount 返回記錄總數
rs.bof 返回記錄指針是否超出數據表首端,true表示是,false為否
rs.eof 返回記錄指針是否超出數據表末端,true表示是,false為否
rs.delete 刪除當前記錄,但記錄指針不會(huì )向下移動(dòng)
rs.addnew 添加記錄到數據表末端
rs.update 更新數據表記錄
---------------------------------------
20 Recordset對象方法
Open方法
recordset.Open Source,ActiveConnection,CursorType,LockType,Options
Source
Recordset對象可以通過(guò)Source屬性來(lái)連接Command對象。Source參數可以是一個(gè)Command對象名稱(chēng)、一段SQL命令、一個(gè)指定的數據表名稱(chēng)或是一個(gè)Stored Procedure。假如省略這個(gè)參數,系統則采用Recordset對象的Source屬性。
ActiveConnection
Recordset對象可以通過(guò)ActiveConnection屬性來(lái)連接Connection對象。這里的ActiveConnection可以是一個(gè)Connection對象或是一串包含數據庫連接信息(ConnectionString)的字符串參數。
CursorType
Recordset對象Open方法的CursorType參數表示將以什么樣的游標類(lèi)型啟動(dòng)數據,包括adOpenForwardOnly、adOpenKeyset、adOpenDynamic及adOpenStatic,分述如下:
--------------------------------------------------------------
常數 常數值 說(shuō)明
-------------------------------------------------------------
adOpenForwardOnly 0 缺省值,啟動(dòng)一個(gè)只能向前移動(dòng)的游標(Forward Only)。
adOpenKeyset 1 啟動(dòng)一個(gè)Keyset類(lèi)型的游標。
adOpenDynamic 2 啟動(dòng)一個(gè)Dynamic類(lèi)型的游標。
adOpenStatic 3 啟動(dòng)一個(gè)Static類(lèi)型的游標。
-------------------------------------------------------------
以上幾個(gè)游標類(lèi)型將直接影響到Recordset對象所有的屬性和方法,以下列表說(shuō)明他們之間的區別。
-------------------------------------------------------------
Recordset屬性 adOpenForwardOnly adOpenKeyset adOpenDynamic adOpenStatic
-------------------------------------------------------------
AbsolutePage 不支持 不支持 可讀寫(xiě) 可讀寫(xiě)
AbsolutePosition 不支持 不支持 可讀寫(xiě) 可讀寫(xiě)
ActiveConnection 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě)
BOF 只讀 只讀 只讀 只讀
Bookmark 不支持 不支持 可讀寫(xiě) 可讀寫(xiě)
CacheSize 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě)
CursorLocation 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě)
CursorType 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě)
EditMode 只讀 只讀 只讀 只讀
EOF 只讀 只讀 只讀 只讀
Filter 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě)
LockType 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě)
MarshalOptions 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě)
MaxRecords 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě)
PageCount 不支持 不支持 只讀 只讀
PageSize 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě)
RecordCount 不支持 不支持 只讀 只讀
Source 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě)
State 只讀 只讀 只讀 只讀
Status 只讀 只讀 只讀 只讀
AddNew 支持 支持 支持 支持
CancelBatch 支持 支持 支持 支持
CancelUpdate 支持 支持 支持 支持
Clone 不支持 不支持
Close 支持 支持 支持 支持
Delete 支持 支持 支持 支持
GetRows 支持 支持 支持 支持
Move 不支持 支持 支持 支持
MoveFirst 支持 支持 支持 支持
MoveLast 不支持 支持 支持 支持
MoveNext 支持 支持 支持 支持
MovePrevious 不支持 支持 支持 支持
NextRecordset 支持 支持 支持 支持
Open 支持 支持 支持 支持
Requery 支持 支持 支持 支持
Resync 不支持 不支持 支持 支持
Supports 支持 支持 支持 支持
Update 支持 支持 支持 支持
UpdateBatch 支持 支持 支持 支持
--------------------------------------------------------------
其中NextRecordset方法并不適用于Microsoft Access數據庫。
LockType
Recordset對象Open方法的LockType參數表示要采用的Lock類(lèi)型,如果忽略這個(gè)參數,那么系統會(huì )以Recordset對象的LockType屬性為預設值。LockType參數包含adLockReadOnly、adLockPrssimistic、adLockOptimistic及adLockBatchOptimistic等,分述如下:
-------------------------------------------------------------
常數 常數值 說(shuō)明
--------------------------------------------------------------
adLockReadOnly 1 缺省值,Recordset對象以只讀方式啟動(dòng),無(wú)法運行AddNew、Update及Delete等方法
adLockPrssimistic 2 當數據源正在更新時(shí),系統會(huì )暫時(shí)鎖住其他用戶(hù)的動(dòng)作,以保持數據一致性。
adLockOptimistic 3 當數據源正在更新時(shí),系統并不會(huì )鎖住其他用戶(hù)的動(dòng)作,其他用戶(hù)可以對數據進(jìn)行增、刪、改的操作。
adLockBatchOptimistic 4 當數據源正在更新時(shí),其他用戶(hù)必須將CursorLocation屬性改為adUdeClientBatch才能對數據進(jìn)行增、
刪、改的操作。
■今日推薦:用ASP與ADO查詢(xún)Web數據庫
顯示頁(yè)面加載時(shí)間
重復域中的斑馬線(xiàn)
顯示字符串前20個(gè)字符并在結尾處添加“……”
如果動(dòng)態(tài)圖片為空,使用默認圖片代替
如果數據為空,使用默認提示信息代替
●顯示頁(yè)面加載時(shí)間
頁(yè)面頂部添加下面的代碼:
<%
Dim strStartTime
Dim strEndTime
strStartTime = Timer '開(kāi)始時(shí)間
%>
頁(yè)面(同一頁(yè))的末尾添加:
<%
' 加載完畢的時(shí)間
strEndTime = Timer
Response.Write ("頁(yè)面加載時(shí)間: ")
Response.Write FormatNumber(strEndTime - strStartTime, 4)
Response.Write (" 秒.")
%>
●重復域中的斑馬線(xiàn)
<%
'此模塊放置在重復域之外
Dim RecordCounter
Recordcounter = 0
%>
<tr class =
<%
'將重復域中第一個(gè) <tr>標簽的CLASS屬性代碼用本模塊替換
'本模塊基于CSS來(lái)改變單元格背景色,你也可以直接設置背景色來(lái)實(shí)現斑馬線(xiàn)
RecordCounter = Recordcounter + 1
If RecordCounter Mod 2 = 1 Then
Response.Write "altRow1"
Else
Response.write "altRow2"
End If
%>
●顯示字符串前20個(gè)字符并在結尾處添加“……”
<%
Dim CutShort
CutShort = rsYourRecordset.Fields.Item("YourField").Value
Response.Write LEFT (CutShort, 20) & "........"
%>
●如果動(dòng)態(tài)圖片為空,用默認圖片代替
<%
Dim PicShow
PicShow = rsShowHide.Fields.Item("shMainPix").Value
IF PicShow <>"" THEN %>
<img src="<%=rsShowHide.Fields.Item("shMainPix").Value%>">
<% ELSE %>
<img src="StaticPic.gif">
<% End If %>
●如果數據為空,用默認提示信息代替。
<%
Dim strShowHide
strShowHide = rsYourRecordset.Fields.Item("YourDataField").Value
IF stShowHide <>"" THEN%>
數據為空
<%END IF%>
純編碼實(shí)現Access數據庫的建立或壓縮
<%
'#######以下是一個(gè)類(lèi)文件,下面的注解是調用類(lèi)的方法################################################
'# 注意:如果系統不支持建立Scripting.FileSystemObject對象,那么數據庫壓縮功能將無(wú)法使用
'# Access 數據庫類(lèi)
'# CreateDbFile 建立一個(gè)Access 數據庫文件
'# CompactDatabase 壓縮一個(gè)Access 數據庫文件
'# 建立對象方法:
'# Set a = New DatabaseTools
'# by (蕭寒雪) s.f.
'#########################################################################################
Class DatabaseTools
Public function CreateDBfile(byVal dbFileName,byVal DbVer,byVal SavePath)
'建立數據庫文件
'If DbVer is 0 Then Create Access97 dbFile
'If DbVer is 1 Then Create Access2000 dbFile
On error resume Next
If Right(SavePath,1)<>"\" Or Right(SavePath,1)<>"/" Then SavePath = Trim(SavePath) & "\"
If Left(dbFileName,1)="\" Or Left(dbFileName,1)="/" Then dbFileName = Trim(Mid(dbFileName,2,Len(dbFileName)))
If DbExists(SavePath & dbFileName) Then
Response.Write ("對不起,該數據庫已經(jīng)存在!")
CreateDBfile = False
Else
Dim Ca
Set Ca = Server.CreateObject("ADOX.Catalog")
If Err.number<>0 Then
Response.Write ("無(wú)法建立,請檢查錯誤信息
" & Err.number & "
" & Err.Description)
Err.Clear
Exit function
End If
If DbVer=0 Then
call Ca.Create("Provider=Microsoft.Jet.OLEDB.3.51;Data Source=" & SavePath & dbFileName)
Else
call Ca.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & SavePath & dbFileName)
End If
Set Ca = Nothing
CreateDBfile = True
End If
End function
Public function CompactDatabase(byVal dbFileName,byVal DbVer,byVal SavePath)
'壓縮數據庫文件
'0 為access 97
'1 為access 2000
On Error resume next
If Right(SavePath,1)<>"\" Or Right(SavePath,1)<>"/" Then SavePath = Trim(SavePath) & "\"
If Left(dbFileName,1)="\" Or Left(dbFileName,1)="/" Then dbFileName = Trim(Mid(dbFileName,2,Len(dbFileName)))
If DbExists(SavePath & dbFileName) Then
Response.Write ("對不起,該數據庫已經(jīng)存在!")
CompactDatabase = False
Else
Dim Cd
Set Cd =Server.CreateObject("JRO.JetEngine")
If Err.number<>0 Then
Response.Write ("無(wú)法壓縮,請檢查錯誤信息
" & Err.number & "
" & Err.Description)
Err.Clear
Exit function
End If
If DbVer=0 Then
call Cd.CompactDatabase("Provider=Microsoft.Jet.OLEDB.3.51;Data Source=" & SavePath & dbFileName,"Provider=Microsoft.Jet.OLEDB.3.51;Data
Source=" & SavePath & dbFileName & ".bak.mdb;Jet OLEDB;Encrypt Database=True")
Else
call Cd.CompactDatabase("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &
SavePath & dbFileName,"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &
SavePath & dbFileName & ".bak.mdb;Jet OLEDB;Encrypt Database=True")
End If
'刪除舊的數據庫文件
call DeleteFile(SavePath & dbFileName)
'將壓縮后的數據庫文件還原
call RenameFile(SavePath & dbFileName & ".bak.mdb",SavePath & dbFileName)
Set Cd = False
CompactDatabase = True
End If
end function
Public function DbExists(byVal dbPath)
'查找數據庫文件是否存在
On Error resume Next
Dim c
Set c = Server.CreateObject("ADODB.Connection")
c.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbPath
If Err.number<>0 Then
Err.Clear
DbExists = false
else
DbExists = True
End If
set c = nothing
End function
Public function AppPath()
'取當前真實(shí)路徑
AppPath = Server.MapPath("./")
End function
Public function AppName()
'取當前程序名稱(chēng)
AppName = Mid(Request.ServerVariables("SCRIPT_NAME"),(InStrRev(Request.ServerVariables("SCRIPT_NAME") ,"/",-1,1))+1,Len(Request.ServerVariables("SCRIPT_NAME")))
End Function
Public function DeleteFile(filespec)
'刪除一個(gè)文件
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
If Err.number<>0 Then
Response.Write("刪除文件發(fā)生錯誤!請查看錯誤信息
" & Err.number & "
" & Err.Description)
Err.Clear
DeleteFile = False
End If
call fso.DeleteFile(filespec)
Set fso = Nothing
DeleteFile = True
End function
Public function RenameFile(filespec1,filespec2)
'修改一個(gè)文件
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
If Err.number<>0 Then
Response.Write("修改文件名時(shí)發(fā)生錯誤!請查看錯誤信息
" & Err.number & "
" & Err.Description)
Err.Clear
RenameFile = False
End If
call fso.CopyFile(filespec1,filespec2,True)
call fso.DeleteFile(filespec1)
Set fso = Nothing
RenameFile = True
End function
End Class
%>
現在已可以壓縮有密碼的數據庫,代碼如下,但是壓縮之后的數據庫密碼就沒(méi)有了!如何解決?
<%
Const JET_3X = 4
Function CompactDB(dbPath, boolIs97)
Dim fso, Engine, strDBPath
strDBPath = left(dbPath,instrrev(DBPath,"\"))
Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FileExists(dbPath) Then
Set Engine = CreateObject("JRO.JetEngine")
If boolIs97 = "True" Then
Engine.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbpath, _
"Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password='XXXXXXXX';Data Source=" & strDBPath & "temp.mdb;" _
& "Jet OLEDB:Engine Type=" & JET_3X
Else
Engine.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password='XXXXXXXX';Data Source=" & dbpath, _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strDBPath & "temp.mdb"
End If
fso.CopyFile strDBPath & "temp.mdb",dbpath
fso.DeleteFile(strDBPath & "temp.mdb")
Set fso = nothing
Set Engine = nothing
CompactDB = "你的數據庫, " & dbpath & ", 已經(jīng)壓縮成功!" & vbCrLf
Else
CompactDB = "數據庫名稱(chēng)或路徑不正確. 請重試!" & vbCrLf
End If
End Function
%>
asp編程有用的例子(一)
1.如何用Asp判斷你的網(wǎng)站的虛擬物理路徑
答:使用Mappath方法
< p align="center" >< font size="4" face="Arial" >< b >
The Physical path to this virtual website is:
< /b >< /font >
< font color="#FF0000" size="6" face="Arial" >
< %= Server.MapPath("\")% >
< /font >< /p >
2.我如何知道使用者所用的瀏覽器?
答:使用the Request object方法
strBrowser=Request.ServerVariables("HTTP_USER_AGENT")
If Instr(strBrowser,"MSIE") < > 0 Then
Response.redirect("ForMSIEOnly.htm")
Else
Response.redirect("ForAll.htm")
End If
3.如何計算每天的平均反復訪(fǎng)問(wèn)人數
答:解決方法
< % startdate=DateDiff("d",Now,"01/01/1990")
if strdate< 0 then startdate=startdate*-1
avgvpd=Int((usercnt)/startdate) % >
顯示結果
< % response.write(avgvpd) % >
that is it.this page have been viewed since November 10,1998
4.如何顯示隨機圖象
< % dim p,ppic,dpic
ppic=12
randomize
p=Int((ppic*rnd)+1)
dpic="graphix/randompics/"&p&".gif"
% >
顯示
< img src="< %=dpic% >" >
5.如何回到先前的頁(yè)面
答:< a href="< %=request.serverVariables("Http_REFERER")% >" >preivous page< /a >
或用圖片如:< img src="arrowback.gif" alt="< %=request.serverVariables("HTTP_REFERER")% >" >
6.如何確定對方的IP地址
答:< %=Request.serverVariables("REMOTE_ADDR)% >
7.如何鏈結到一副圖片上
答:< % @Languages=vbs cript % >
< % response.expires=0
strimagename="graphix/errors/erroriamge.gif"
response.redirect(strimagename)
% >
8.強迫輸入密碼對話(huà)框
答:把這句話(huà)放載頁(yè)面的開(kāi)頭
< % response.status="401 not Authorized"
response.end
% >
9.如何傳遞變量從一頁(yè)到另一頁(yè)
答:用 HIDDEN 類(lèi)型來(lái)傳遞變量
< % form method="post" action="mynextpage.asp" >
< % for each item in request.form % >
< input namee="< %=item% >" type="HIDDEN"
value="< %=server.HTMLEncode(Request.form(item)) % >" >
< % next % >
< /form >
10.為何我在 asp 程序內使用 msgbox,程序出錯說(shuō)沒(méi)有權限
答:由于 asp 是服務(wù)器運行的,如果可以在服務(wù)器顯示一個(gè)對話(huà)框,那么你只好等有人按了確定之后,你的程序才能繼續執行,而一般服務(wù)器不會(huì )有人守著(zhù),所以微軟不得不禁止這個(gè)函數,并胡亂告訴你 ( 呵呵) 沒(méi)有權限。但是ASP和客戶(hù)端腳本結合倒可以顯示一個(gè)對話(huà)框,as follows:
< % yourVar="測試對話(huà)框"% >
< % s cript language='javas cript' >
alert("< %=yourvar% >")
< /s cript >
11.有沒(méi)有辦法保護自己的源代碼,不給人看到
答:可以去下載一個(gè)微軟的Windows s cript Encoder,它可以對asp的腳本和客戶(hù)端javas cript/vbs cript腳本進(jìn)行加密。。。不過(guò)客戶(hù)端加密后,只有ie5才能執行,服務(wù)器端腳本加密后,只有服務(wù)器上安裝有s cript engine 5(裝一個(gè)ie5就有了)才能執行。
12.怎樣才能將 query string 從一個(gè) asp 文件傳送到另一個(gè)?
答:前者文件加入下句: Response.Redirect("second.asp?" & Request.ServerVariables("QUERY_STRING"))
13.global.asa文件總是不起作用?
答:只有web目錄設置為web application, global.asa才有效,并且一個(gè)web application的根目錄下 global.asa才有效。IIS4可以使用Internet Service Manager設置application setting 怎樣才能使得htm文件如同asp文件一樣可以執行腳本代碼?
14.怎樣才能使得htm文件如同asp文件一樣可以執行腳本代碼?
答:Internet Sevices Manager - > 選擇default web site - >右鼠鍵- >菜單屬性->主目錄- > 應用程序設置(Application Setting)- > 點(diǎn)擊按鈕 "配置"- > app mapping - >點(diǎn)擊按鈕"Add" - > executable browse選擇 \WINNT\SYSTEM32\INETSRV\ASP.DLL EXTENSION 輸入 htm method exclusions 輸入PUT.DELETE 全部確定即可。但是值得注意的是這樣對htm也要由asp.dll處理,效率將降低。
15.如何注冊組件
答:有兩種方法。
第一種方法:手工注冊 DLL 這種方法從IIs 3.0一直使用到IIs 4.0和其它的Web Server。它需要你在命令行方式下來(lái)執行,進(jìn)入到包含有DLL的目錄,并輸入:regsvr32 component_name.dll 例如 c:\temp\regsvr32 AspEmail.dll 它會(huì )把dll的特定信息注冊入服務(wù)器中的注冊表中。然后這個(gè)組件就可以在服務(wù)器上使用了,但是這個(gè)方法有一個(gè)缺陷。當使用這種方法注冊完畢組件后,該組件必須要相應的設置NT的匿名賬號有權限執行這個(gè)dll。特別是一些組件需要讀取注冊表,所以,這個(gè)注冊組件的方法僅僅是使用在服務(wù)器上沒(méi)有MTS的情況下,要取消注冊這個(gè)dll,使用:regsvr32 /u aspobject.dll example c:\temp\regsvr32 /u aneiodbc.dll
第二種方法:使用MTS(Microsoft Transaction Server) MTS是IIS 4新增特色,但是它提供了巨大的改進(jìn)。MTS允許你指定只有有特權的用戶(hù)才能夠訪(fǎng)問(wèn)組件,大大提高了網(wǎng)站服務(wù)器上的安全性設置。在MTS上注冊組件的步驟如下:
1) 打開(kāi)IIS管理控制臺。
2) 展開(kāi)transaction server,右鍵單擊"pkgs installed"然后選擇"new package"。
3) 單擊"create an empty package"。
4) 給該包命名。
5) 指定administrator賬號或則使用"interactive"(如果服務(wù)器經(jīng)常是使用administrator 登陸的話(huà))。
6) 現在使用右鍵單擊你剛建立的那個(gè)包下面展開(kāi)后的"components"。選擇 "new then component"。
7) 選擇 "install new component" 。
8) 找到你的.dll文件然后選擇next到完成。
要刪除這個(gè)對象,只要選擇它的圖標,然后選擇delete。
附注:特別要注意第二種方法,它是用來(lái)調試自己編寫(xiě)組件的最好方法,而不必每次都需要重新啟動(dòng)機器了。
16. ASP與Access數據庫連接:
<%@ language=VBs cript%>
<%
dim conn,mdbfile
mdbfile=server.mappath("數據庫名稱(chēng).mdb")
set conn=server.createobject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};uid=admin;pwd=數據庫密碼;dbq="&mdbfile
%>
接著(zhù)來(lái),希望大家也參與近來(lái)
-------------------------------
asp編程有用的例子(二)
17. ASP與SQL數據庫連接:
<%@ language=VBs cript%>
<%
dim conn
set conn=server.createobject("ADODB.connection")
con.open "PROVIDER=SQLOLEDB;DATA SOURCE=SQL服務(wù)器名稱(chēng)或IP地址;UID=sa;PWD=數據庫密碼;DATABASE=數據庫名稱(chēng)
%>
建立記錄集對象:
set rs=server.createobject("adodb.recordset")
rs.open SQL語(yǔ)句,conn,3,2
18. SQL常用命令使用方法:
(1) 數據記錄篩選:
sql="select * from 數據表 where 字段名=字段值 order by 字段名 [desc]"
sql="select * from 數據表 where 字段名 like '%字段值%' order by 字段名 [desc]"
sql="select top 10 * from 數據表 where 字段名 order by 字段名 [desc]"
sql="select * from 數據表 where 字段名 in ('值1','值2','值3')"
sql="select * from 數據表 where 字段名 between 值1 and 值2"
(2) 更新數據記錄:
sql="update 數據表 set 字段名=字段值 where 條件表達式"
sql="update 數據表 set 字段1=值1,字段2=值2 …… 字段n=值n where 條件表達式"
(3) 刪除數據記錄:
sql="delete from 數據表 where 條件表達式"
sql="delete from 數據表" (將數據表所有記錄刪除)
(4) 添加數據記錄:
sql="insert into 數據表 (字段1,字段2,字段3 …) valuess (值1,值2,值3 …)"
sql="insert into 目標數據表 select * from 源數據表" (把源數據表的記錄添加到目標數據表)
(5) 數據記錄統計函數:
AVG(字段名) 得出一個(gè)表格欄平均值
COUNT(*字段名) 對數據行數的統計或對某一欄有值的數據行數統計
MAX(字段名) 取得一個(gè)表格欄最大的值
MIN(字段名) 取得一個(gè)表格欄最小的值
SUM(字段名) 把數據欄的值相加
引用以上函數的方法:
sql="select sum(字段名) as 別名 from 數據表 where 條件表達式"
set rs=conn.excute(sql)
用 rs("別名") 獲取統的計值,其它函數運用同上。
(5) 數據表的建立和刪除:
CREATE TABLE 數據表名稱(chēng)(字段1 類(lèi)型1(長(cháng)度),字段2 類(lèi)型2(長(cháng)度) …… )
例:CREATE TABLE tab01(name varchar(50),datetime default now())
DROP TABLE 數據表名稱(chēng) (永久性刪除一個(gè)數據表)
19. 記錄集對象的方法:
rs.movenext 將記錄指針從當前的位置向下移一行
rs.moveprevious 將記錄指針從當前的位置向上移一行
rs.movefirst 將記錄指針移到數據表第一行
rs.movelast 將記錄指針移到數據表最后一行
rs.absoluteposition=N 將記錄指針移到數據表第N行
rs.absolutepage=N 將記錄指針移到第N頁(yè)的第一行
rs.pagesize=N 設置每頁(yè)為N條記錄
rs.pagecount 根據 pagesize 的設置返回總頁(yè)數
rs.recordcount 返回記錄總數
rs.bof 返回記錄指針是否超出數據表首端,true表示是,false為否
rs.eof 返回記錄指針是否超出數據表末端,true表示是,false為否
rs.delete 刪除當前記錄,但記錄指針不會(huì )向下移動(dòng)
rs.addnew 添加記錄到數據表末端
rs.update 更新數據表記錄
---------------------------------------
20 Recordset對象方法
Open方法
recordset.Open Source,ActiveConnection,CursorType,LockType,Options
Source
Recordset對象可以通過(guò)Source屬性來(lái)連接Command對象。Source參數可以是一個(gè)Command對象名稱(chēng)、一段SQL命令、一個(gè)指定的數據表名稱(chēng)或是一個(gè)Stored Procedure。假如省略這個(gè)參數,系統則采用Recordset對象的Source屬性。
ActiveConnection
Recordset對象可以通過(guò)ActiveConnection屬性來(lái)連接Connection對象。這里的ActiveConnection可以是一個(gè)Connection對象或是一串包含數據庫連接信息(ConnectionString)的字符串參數。
CursorType
Recordset對象Open方法的CursorType參數表示將以什么樣的游標類(lèi)型啟動(dòng)數據,包括adOpenForwardOnly、adOpenKeyset、adOpenDynamic及adOpenStatic,分述如下:
--------------------------------------------------------------
常數 常數值 說(shuō)明
-------------------------------------------------------------
adOpenForwardOnly 0 缺省值,啟動(dòng)一個(gè)只能向前移動(dòng)的游標(Forward Only)。
adOpenKeyset 1 啟動(dòng)一個(gè)Keyset類(lèi)型的游標。
adOpenDynamic 2 啟動(dòng)一個(gè)Dynamic類(lèi)型的游標。
adOpenStatic 3 啟動(dòng)一個(gè)Static類(lèi)型的游標。
-------------------------------------------------------------
以上幾個(gè)游標類(lèi)型將直接影響到Recordset對象所有的屬性和方法,以下列表說(shuō)明他們之間的區別。
-------------------------------------------------------------
Recordset屬性 adOpenForwardOnly adOpenKeyset adOpenDynamic adOpenStatic
-------------------------------------------------------------
AbsolutePage 不支持 不支持 可讀寫(xiě) 可讀寫(xiě)
AbsolutePosition 不支持 不支持 可讀寫(xiě) 可讀寫(xiě)
ActiveConnection 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě)
BOF 只讀 只讀 只讀 只讀
Bookmark 不支持 不支持 可讀寫(xiě) 可讀寫(xiě)
CacheSize 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě)
CursorLocation 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě)
CursorType 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě)
EditMode 只讀 只讀 只讀 只讀
EOF 只讀 只讀 只讀 只讀
Filter 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě)
LockType 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě)
MarshalOptions 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě)
MaxRecords 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě)
PageCount 不支持 不支持 只讀 只讀
PageSize 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě)
RecordCount 不支持 不支持 只讀 只讀
Source 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě) 可讀寫(xiě)
State 只讀 只讀 只讀 只讀
Status 只讀 只讀 只讀 只讀
AddNew 支持 支持 支持 支持
CancelBatch 支持 支持 支持 支持
CancelUpdate 支持 支持 支持 支持
Clone 不支持 不支持
Close 支持 支持 支持 支持
Delete 支持 支持 支持 支持
GetRows 支持 支持 支持 支持
Move 不支持 支持 支持 支持
MoveFirst 支持 支持 支持 支持
MoveLast 不支持 支持 支持 支持
MoveNext 支持 支持 支持 支持
MovePrevious 不支持 支持 支持 支持
NextRecordset 支持 支持 支持 支持
Open 支持 支持 支持 支持
Requery 支持 支持 支持 支持
Resync 不支持 不支持 支持 支持
Supports 支持 支持 支持 支持
Update 支持 支持 支持 支持
UpdateBatch 支持 支持 支持 支持
--------------------------------------------------------------
其中NextRecordset方法并不適用于Microsoft Access數據庫。
LockType
Recordset對象Open方法的LockType參數表示要采用的Lock類(lèi)型,如果忽略這個(gè)參數,那么系統會(huì )以Recordset對象的LockType屬性為預設值。LockType參數包含adLockReadOnly、adLockPrssimistic、adLockOptimistic及adLockBatchOptimistic等,分述如下:
-------------------------------------------------------------
常數 常數值 說(shuō)明
--------------------------------------------------------------
adLockReadOnly 1 缺省值,Recordset對象以只讀方式啟動(dòng),無(wú)法運行AddNew、Update及Delete等方法
adLockPrssimistic 2 當數據源正在更新時(shí),系統會(huì )暫時(shí)鎖住其他用戶(hù)的動(dòng)作,以保持數據一致性。
adLockOptimistic 3 當數據源正在更新時(shí),系統并不會(huì )鎖住其他用戶(hù)的動(dòng)作,其他用戶(hù)可以對數據進(jìn)行增、刪、改的操作。
adLockBatchOptimistic 4 當數據源正在更新時(shí),其他用戶(hù)必須將CursorLocation屬性改為adUdeClientBatch才能對數據進(jìn)行增、
刪、改的操作。
將你的網(wǎng)站設置為客戶(hù)的信任站點(diǎn)--WSH方案
ar SiteName="Acmnet"
SetTrustSite(SiteName);
WScript.Echo("You have accept 'http://acmnet/' as your Trusted Site");
要解決這個(gè)問(wèn)題,首先要了解一下Windows Scripting Host,簡(jiǎn)稱(chēng)為WSH!下面引用一下微軟給的解釋?zhuān)?
************************************************************************
* WSH是微軟腳本技術(shù)系列中的一種,簡(jiǎn)單講,就是提供了一種腳本環(huán)境, *
* 在這個(gè)環(huán)境中,預定義了一些對象,同時(shí)也可以使用COM里的其他對象。 *
* 他使用一種腳本引擎來(lái)對腳本解釋執行,微軟自己支持VBSCRIPT和JSCRIPT, *
* 第三方也可以開(kāi)發(fā)自己的腳本引擎。 *
************************************************************************
具體點(diǎn),就是你先編好一些腳本文件(微軟自帶例子若干,后綴.vbs或 .js),
然后用一個(gè)程序對他解釋執行,這個(gè)程序就叫Windows Scripting Host,程序
的名字是Wscript.exe(或者命令行的Cscript.exe),你可以查看一下你的機器
里有沒(méi)有這兩個(gè)文件,就知道有沒(méi)有WSH了。(win2000是在winnt/system32/下)
這非常像批處理文件,只不過(guò)文件里不是命令行,而是腳本語(yǔ)言寫(xiě)的腳本。
再來(lái)簡(jiǎn)單介紹一下WSH自帶的幾個(gè)內置對象包括:
1.由 Wscript.exe 提供的對象
Wscript 作為 Wscript 公開(kāi)給腳本引擎。
WshArguments 未公開(kāi);通過(guò) Wscript.Arguments 屬性訪(fǎng)問(wèn)。 入
2.由 WSHom.Ocx 提供的對象。
WshShell 自動(dòng)對象。ProgID 是 Wscript.WshShell。
(注:這個(gè)就是我們要用到的,可以執行dos命令)
WshNetwork 自動(dòng)對象。ProgID 是 Wscript.WshNetwork。
WshShortcut 未公開(kāi);通過(guò) WshShell.CreateShortcut 方法訪(fǎng)問(wèn)。
WshUrlShortcut 未公開(kāi);通過(guò) WshShell.CreateShortcut 方法訪(fǎng)問(wèn)。
WshCollection 未公開(kāi);通過(guò) WshNetwork.EnumNetworkDrives 或 WshNetwork.EnumPrinterConnection 方法訪(fǎng)問(wèn)。
WshEnvironment 未公開(kāi);通過(guò) WshShell.Environment 屬性訪(fǎng)問(wèn)。
WshSpecialFolders 未公開(kāi);通過(guò) WshShell.Folder 屬性訪(fǎng)問(wèn)。
他們主要可以完成環(huán)境變量的獲取,網(wǎng)絡(luò )登陸,驅動(dòng)器映射,快截方式創(chuàng )建,
程序加載,特殊文件夾(如系統文件夾)信息獲取等功能。
如果你的系統里支持ADO等COM部件,你同樣可以使用,
下面這個(gè)例子演示打開(kāi)寫(xiě)字板查看文本文件,同時(shí)創(chuàng )建一個(gè)文本文件并寫(xiě)入一
段話(huà),你可以把他拷貝到寫(xiě)字板中,然后以.vbs為后綴存盤(pán),之后雙擊他,
'test.vbs
'*********************
'下面用SHELL對象啟動(dòng)程序
'*********************
Set WshShell = Wscript.CreateObject("Wscript.Shell")
WshShell.Run ("notepad " & Wscript.ScriptFullName)
'***********************************************
'用COM對象Scripting.FileSystemObject操作文本文件
'***********************************************
Set fs = Wscript.CreateObject("Scripting.FileSystemObject")
Set a = fs.CreateTextFile("c:\testfile.txt", True)
a.WriteLine("這是一個(gè)測試。")
a.Close
也可以在asp等web編程語(yǔ)言中應用
<script language="VBScript.Encode" runat=server>
'上面用SHELL對象啟動(dòng)程序
Set WshShell = server.CreateObject("Wscript.Shell")
IsSuccess = WshShell.Run ("D:\winnt\system32\cmd.exe" ,1, true)
if IsSuccess = 0 Then
Response.write " 命令成功執行!"
else
Response.write " 命令執行失??!權限不夠或者該程序無(wú)法在DOS狀態(tài)下運行"
end if
</script>
注:
1.其中runat=server必須要有
2.Set WshShell = Wscript.CreateObject("Wscript.Shell")
要改為Set WshShell = server.CreateObject("Wscript.Shell"),
3.參數1代表SW_SHOWNORMAL, 激活并顯示一個(gè)窗口。若窗口是最小化或最大化,則恢復到其原來(lái)的大小和位置。
4.TRUE代表返回執行的錯誤,False或者為指定代表腳本繼續執行而不等待進(jìn)程結束。
5.調用WSH的內置對象了,可以象調用函數和過(guò)程一樣。
如call WshShell.Run ("D:\winnt\system32\cmd.exe" ,1, true)
下載后,直接安裝就可以!
就會(huì )在winzip的目錄中產(chǎn)生winzip命令行幫助文件和程序WZZIP.exe,WZUNZIP.EXE。
你可以開(kāi)始運行里調用:
如:"c:\program files\winzip\wzzip" myfile.zip
也可以拷貝這里兩個(gè)文件到任意目錄下,直接在dos窗口下運行
如:wzzip.exe myfile.zip
你可以在系統的環(huán)境變量里加入set path=c:\windows;c:\program files\winzip;
就可以在任何地方不用加入路經(jīng)調用了!
現在來(lái)簡(jiǎn)單的了解一下幫助中兩個(gè)命令的基本用法
壓縮文件用 WZZIP.exe :
通用格式:wzzip [options] zipfile [@listfile] [files...]
[options]包括:
-a 默認的操作,壓縮文件
-a+ 壓縮文件,并刪除要壓縮的文件
-b[drivepath] 是在另外的驅動(dòng)器上創(chuàng )建臨時(shí)壓縮文件
-d 刪除zip文件中指定的目標文件
-e<xnfs0> 是設置壓縮比率,x最大,0最小
-f 替換zip文件中存在的文件
-h-? 察看幫助
-v 創(chuàng )建一個(gè)壓縮文件的列表信息
-@list 先創(chuàng )建一個(gè)包含所有要解壓的文件的文件,然后按所包含的的文件名壓縮
...............(其他具體看幫助文件)
[@listfile] 是壓縮文件的列表信息紀錄
[files...] 則是要壓縮的多個(gè)文件,用空格隔開(kāi),也可以用通配符
例:
壓縮當前目錄的所有文件
wzzip test.zip *.*
壓縮類(lèi)型為txt的所有文件
wzzip test.zip *.txt
壓縮兩個(gè)文件
wzzip test.zip abc.txt def.txt
壓縮類(lèi)型為txt的所有文件除了abc.txt
wzzip -xABC.TXT test.zip *.txt
壓縮D:\docs下的所有類(lèi)型為txt的文件及子目錄
wzzip -rp test.zip d:\docs\*.txt
把zipit.1st里的文件更新到test.zip
wzzip -u test.zip @Zipit.lst
列出一個(gè)壓縮文件的列表內容
wzzip -v test.zip
解壓文件用WZUNZIP.exe :
通過(guò)格式:wzunzip [options] zipfile [@listfile] [path] [files...]
[options]包括:
-c[m] 解壓是顯示文件列表在dos屏幕中
-d 重建zip文件中的目錄結構
-f 只解壓在zip文件里同目前文件夾存在的同名的文件,如果沒(méi)有則不解壓
-jhrs 忽視zip文件里的文件的隱藏、只讀、系統屬性
-Jhrs 只解壓帶有隱藏、只讀、系統屬性的文件
-n 只解壓叫新的文件,如果要解壓的文件比已存在的新則替換。
-o 不用通過(guò)yes來(lái)確定是否要替換文件
-v 創(chuàng )建一個(gè)壓縮文件的列表信息
-@list 先創(chuàng )建一個(gè)包含所有要解壓的文件的文件,然后按所包含的的文件名解壓
...............(其他具體看幫助文件)
例如:
創(chuàng )建所有文件到當前目錄下
wzunzip test.zip
從test.zip中創(chuàng )建abc.txt到當前目錄下
wzunzip test.zip abc.txt
創(chuàng )建在test.zip中的目錄結構及文件到當前目錄下
wzunzip -d test.zip
創(chuàng )建在test.zip中的目錄結構及文件到c:\docs下
wzunzip -d test.zip c:\docs從test.zip中創(chuàng )建包含在files.ist中的文件名的文件
wzunzip test.zip @files.lst
顯示test.zip的文件列表內容
wzunzip -v test.zip
顯示壓縮文件中所有類(lèi)型為txt的文件列表內容
wzunzip -v test.zip *.txt
有了以上的準備,那么我們現在來(lái)編寫(xiě)VBS來(lái)執行文件解壓和壓縮就易如反掌了:
'test.vbs
'*********************
'上面用SHELL對象啟動(dòng)程序
'*********************
Set WshShell = Wscript.CreateObject("Wscript.Shell")
WshShell.Run ("c:\wzzip.exe c:\test.zip c:\a.txt c:\b.txt")
'test.asp
'*********************
'上面用SHELL對象啟動(dòng)程序
'*********************
<script language="VBScript.Encode" runat=server>
'上面用SHELL對象啟動(dòng)程序
Set WshShell = server.CreateObject("Wscript.Shell")
IsSuccess = WshShell.Run (" c:\wzzip.exe c:\test.zip c:\a.txt c:\b.txt" ,1, true)
if IsSuccess = 0 Then
Response.write " 命令成功執行!"
else
Response.write " 命令執行失??!權限不夠或者該程序無(wú)法在DOS狀態(tài)下運行"
end if
</script>
利用ASP遠程注冊DLL的方法
--------------------------
<% Response.Buffer = True %>
<% Server.ScriptTimeout = 500
Dim frmFolderPath, frmFilePath
frmFolderPath = Request.Form("frmFolderPath")
frmFilePath = Request.Form("frmDllPath")
frmMethod = Request.Form("frmMethod")
btnREG = Request.Form("btnREG")
%>
<HTML>
<HEAD>
<TITLE>Regsvr32.asp</TITLE>
<STYLE TYPE="TEXT/CSS">
.Legend {FONT-FAMILY: veranda; FONT-SIZE: 14px; FONT-WEIGHT: bold; COLOR: blue}
.FS {FONT-FAMILY: veranda; FONT-SIZE: 12px; BORDER-WIDTH: 4px; BORDER-COLOR: green;
MARGIN-LEFT:2px; MARGIN-RIGHT:2px}
TD {MARGIN-LEFT:6px; MARGIN-RIGHT:6px; PADDING-LEFT:12px; PADDING-RIGHT:12px}
</STYLE>
</HEAD>
<BODY>
<FORM NAME="regForm" METHOD="POST">
<TABLE BORDER=0 CELLSPACING=6 CELLPADDING=6 MARGINWIDTH=6>
<TR>
<TD VALIGN=TOP>
<FIELDSET ID=FS1 NAME=FS1 CLASS=FS>
<LEGEND CLASS=Legend>Regsvr Functions</LEGEND>
Insert Path to DLL Directory<BR>
<INPUT TYPE=TEXT NAME="frmFolderPath" VALUE="<%=frmFolderPath%>"><BR>
<INPUT TYPE=SUBMIT NAME=btnFileList VALUE="Build File List"><BR>
<%
IF Request.Form("btnFileList") <> "" OR btnREG <> "" Then
Set RegisterFiles = New clsRegister
RegisterFiles.EchoB("<B>Select File</B>")
Call RegisterFiles.init(frmFolderPath)
RegisterFiles.EchoB("<BR><INPUT TYPE=SUBMIT NAME=btnREG VALUE=" & Chr(34) _
& "REG/UNREG" & Chr(34) & ">")
IF Request.Form("btnREG") <> "" Then
Call RegisterFiles.Register(frmFilePath, frmMethod)
End IF
Set RegisterFiles = Nothing
End IF
%>
</FIELDSET>
</TD>
</TR>
</TABLE>
</FORM>
</BODY>
</HTML>
<%
Class clsRegister
Private m_oFS
Public Property Let oFS(objOFS)
m_oFS = objOFS
End Property
Public Property Get oFS()
Set oFS = Server.CreateObject("Scripting.FileSystemObject")
End Property
Sub init(strRoot) 'Root to Search (c:, d:, e:)
Dim oDrive, oRootDir
IF oFS.FolderExists(strRoot) Then
IF Len(strRoot) < 3 Then 'Must Be a Drive
Set oDrive = oFS.GetDrive(strRoot)
Set oRootDir = oDrive.RootFolder
Else
Set oRootDir = oFS.GetFolder(strRoot)
End IF
Else
EchoB("<B>Folder ( " & strRoot & " ) Not Found.")
Exit Sub
End IF
setRoot = oRootDir
Echo("<SELECT NAME=" & Chr(34) & "frmDllPath" & Chr(34) & ">")
Call getAllDlls(oRootDir)
EchoB("</SELECT>")
BuildOptions
End Sub
Sub getAllDlls(oParentFolder)
Dim oSubFolders, oFile, oFiles
Set oSubFolders = oParentFolder.SubFolders
Set opFiles = oParentFolder.Files
For Each oFile in opFiles
IF Right(lCase(oFile.Name), 4) = ".dll" OR Right(lCase(oFile.Name), 4) = ".ocx" Then
Echo("<OPTION VALUE=" & Chr(34) & oFile.Path & Chr(34) & ">" _
& oFile.Name & "</Option>")
End IF
Next
On Error Resume Next
For Each oFolder In oSubFolders 'Iterate All Folders in Drive
Set oFiles = oFolder.Files
For Each oFile in oFiles
IF Right(lCase(oFile.Name), 4) = ".dll" OR Right(lCase(oFile.Name), 4) = ".ocx" Then
Echo("<OPTION VALUE=" & Chr(34) & oFile.Path & Chr(34) & ">" _
& oFile.Name & "</Option>")
End IF
Next
Call getAllDlls(oFolder)
Next
On Error GoTo 0
End Sub
Sub Register(strFilePath, regMethod)
Dim theFile, strFile, oShell, exitcode
Set theFile = oFS.GetFile(strFilePath)
strFile = theFile.Path
Set oShell = CreateObject ("WScript.Shell")
IF regMethod = "REG" Then 'Register
oShell.Run "c:\WINNT\system32\regsvr32.exe /s " & strFile, 0, False
exitcode = oShell.Run("c:\WINNT\system32\regsvr32.exe /s " & strFile, 0, False)
EchoB("regsvr32.exe exitcode = " & exitcode)
Else 'unRegister
oShell.Run "c:\WINNT\system32\regsvr32.exe /u/s " & strFile, 0, False
exitcode = oShell.Run("c:\WINNT\system32\regsvr32.exe /u/s " & strFile, 0, False)
EchoB("regsvr32.exe exitcode = " & exitcode)
End IF
Cleanup oShell
End Sub
Sub BuildOptions
EchoB("Register: <INPUT TYPE=RADIO NAME=frmMethod VALUE=REG CHECKED>")
EchoB("unRegister: <INPUT TYPE=RADIO NAME=frmMethod VALUE=UNREG>")
End Sub
Function Echo(str)
Echo = Response.Write(str & vbCrLf)
End Function
Function EchoB(str)
EchoB = Response.Write(str & "<BR>" & vbCrLf)
End Function
Sub Cleanup(obj)
If isObject(obj) Then
Set obj = Nothing
End IF
End Sub
Sub Class_Terminate()
Cleanup oFS
End Sub
End Class
%>
詳細出處參考:
http://www.jb51.net/article/5631.htm 1、避免使用DSN連接數據庫
是否仍舊在使用ODBC系統或文件DSN連接數據庫?請用OLEDB提供者代替它,這是一種速度更快而且不需要使用DSN的數據庫連接技術(shù)。使用OLEDB提供者,你不必再為了創(chuàng )建系統DSN懇求ISP(或數據庫管理員/網(wǎng)站管理員),也不必為了網(wǎng)站文件位置的變化而修改配置。
問(wèn):
我看到過(guò)大量通過(guò)數據資源名字(DSN)連接數據庫的例子,不過(guò)我現在想不通過(guò)DSN連接數據庫。在A(yíng)SP中可以實(shí)現這一點(diǎn)嗎?能否舉幾個(gè)具體的例子說(shuō)明?我希望新的連接方法不依賴(lài)于系統DSN,但又可以在數據庫連接串中指定驅動(dòng)程序、服務(wù)器名字、數據庫、數據庫賬號和密碼。
答:
如果你使用的是SQL Server 7,請使用下面的數據庫連接串:
strConnString = "DSN='';DRIVER={SQL SERVER};" & _
"UID=myuid;PWD=mypwd;" & _
"DATABASE=MyDb;SERVER=MyServer;"
其中最重要的參數在于“DRIVER=”部分。如果你希望繞過(guò)ODBC,直接通過(guò)OLEDB訪(fǎng)問(wèn)SQL Server(一般來(lái)講這種方法速度更快),請使用下面這種連接串:
strConnString ="Provider=SQLOLEDB.1;Password=mypassword;" & _
"Persist Security Info=True;User ID=myuid;" & _
"Initial Catalog=mydbname;" & _
"Data Source=myserver;Connect Timeout=15"
如果你要使用數據庫連接串,但又不熟悉OLEDB提供者的連接串語(yǔ)法,請使用Visual Basic的數據環(huán)境設計器或ADO數據控件創(chuàng )建一個(gè),然后把它拷貝出來(lái)用于A(yíng)DO連接對象就可以了。在立即窗口中,輸入命令? dataenvironment1.connection1.ConnectionString可以得到連接串的代碼。請注意Microsoft Access連接串的語(yǔ)法有所不同,參見(jiàn)《Syntax for DSN-Less Connection for MS Access》
參見(jiàn):《ASP性能優(yōu)化指南》中的數據庫連接部分。
2、記錄集中記錄總數的計算
1062
剛開(kāi)始在A(yíng)SP頁(yè)面中使用記錄集的時(shí)候可能經(jīng)常會(huì )遇到這個(gè)問(wèn)題。如果你想訪(fǎng)問(wèn)記錄集中的數據,首先必須保證記錄集中確實(shí)包含數據。請記住,如果記錄集中沒(méi)有數據,系統將顯示非常不友好的運行時(shí)錯誤信息。你可以使用下面的代碼去解決這種問(wèn)題。
問(wèn):
我已經(jīng)有數年的VB經(jīng)驗,但剛剛開(kāi)始學(xué)習ASP和VBScript?,F在我要打開(kāi)一個(gè)Access數據庫,計算其中的記錄總數并在Web頁(yè)面中顯示這些信息。數據庫的名字叫sean.mdb,其中包含一個(gè)people表,表中有三個(gè)記錄。然而,當我運行腳本時(shí)它總是說(shuō)有-1個(gè)記錄。
是否可以告訴我下面的代碼什么地方出錯了?
< %
Set objConn = Server.CreateObject("ADODB.Connection")
Set objRst = Server.CreateObject("ADODB.Recordset")
objConn.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=
" & Server.Mappath("seannewelldbsean.mdb"))
strSQL = "SELECT * FROM people"
objRst.Open strSQL, objConn
Response.write( "< P >" & strSQL & "< /P >" )
Response.write("< H2 >There are " & objRst.RecordCount &
" People in the database< /H2 >")
If objRst.RecordCount > 0 Then
objRst.MoveFirst
Do While Not objRst.EOF
Response.write( "Name = " & objRst.fields(0) )
objRst.MoveNext
Loop
else
Response.write( "It's EMPTY!" )
End If
objRst.Close
Set objRst = Nothing
objConn.Close
Set objConn = Nothing
% >
答:
如果Web服務(wù)器由ISP管理而你又無(wú)權配置它,無(wú)法升級MDAC文件,那么必須修改代碼。
原來(lái)使用下面的代碼檢查記錄集中是否有記錄:
If objRst.RecordCount > 0 Then ...
請改用下面的代碼:
If objRst.BOF and objRst.EOF Then
' 記錄集為空
Else
Do While not objRst.EOF
' 處理記錄集
objRst.MoveNext
Loop
End If
2000年06月30日更新,新西蘭的Daryl Egarr說(shuō):
可以看出,讀者提問(wèn)中的代碼并沒(méi)有錯誤。問(wèn)題在于“在低版本的MDAC中RecordCount屬性返回-1”,這一判斷本身并沒(méi)有錯誤,然而從提問(wèn)內容來(lái)看作者不應該作出這種假定,因為原問(wèn)題中沒(méi)有任何一行代碼意味著(zhù)使用了低版本的MDAC。
作者考慮問(wèn)題的方向不對,問(wèn)題的要點(diǎn)在于并非所有的游標類(lèi)型都支持所有的屬性和方法(不管采用哪種數據庫系統)。問(wèn)題中代碼出現錯誤的真正原因在于使用默認的CursorLocation時(shí):
Recordset.CursorLocation = adUseServer
RecordCount屬性只有在記錄集的CursorType為1或者3(即adOpenKeyset,adOpenStatic)時(shí)才是可用的。出現錯誤的代碼沒(méi)有指定CursorType,也就是使用了0類(lèi)型的游標(即adOpenForwardOnly,這是速度最快的游標類(lèi)型),此時(shí)對RecordCount的引用將一直返回0。
解決問(wèn)題的方法很簡(jiǎn)單,只要把原來(lái)代碼中的:
objRst.Open strSQL, objConn
改成:
objRst.Open strSQL, objConn ,1
3、數據庫搜索技巧
在數據庫搜索中,如果我們只使用等于符號搜索“Pro”是無(wú)法提取出那些能夠匹配“ASP Pro”的記錄的。下面我們要介紹的是如何使用SQL的LIKE操作符實(shí)現部分文本搜索。
問(wèn):
從數據庫提取記錄集時(shí),是否有可能提取那些包含比我所指定的文本更多內容的記錄,且不對搜索文本的出現位置有具體要求?
例如:
StrName = 'Direct'
RSShops = Server.CreateObject("ADODB.Recordset")
strSql = "SELECT * FROM Shops WHERE Name =
'" & StrName & "'
是否可以提取出商店名字中包含“direct”單詞的記錄集?
答:
不要在SQL命令中使用等于(“=”)操作符,而是改用LIKE操作符。
要提取出那些名字中包含“direct”的記錄,可以使用下面這個(gè)查詢(xún)命令:
SELECT * FROM Shops WHERE Name LIKE '%direct%'
請按照這里的代碼修改實(shí)際使用的查詢(xún)。
4、數值顯示格式化
對于VB程序員來(lái)說(shuō),ASP中一個(gè)非常令人失望的改動(dòng)是VBScript中不再有Format函數。那么,如何格式化數字使得它不再以默認的格式顯示?比如,將數字顯示為百分數、貨幣金額或者加上小數占位符。下面的代碼幫你解決這個(gè)問(wèn)題,告訴你如何通過(guò)用來(lái)取代VB Format的FormatXXXX函數來(lái)格式化輸出。
問(wèn):
在我開(kāi)發(fā)的應用中,某個(gè)頁(yè)面要顯示一些####.####格式的數字。在A(yíng)SP中如何才能實(shí)現?
答:
使用VBScript的FormatNumber函數,該函數能夠返回格式化的數字表達式。語(yǔ)法如下:
FormatNumber(Expression [,NumDigitsAfterDecimal ][,IncludeLeadingDigit
][,UseParensForNegativeNumbers ][,GroupDigits]]]])
例如,FormatNumber("123.45",4)將返回123.4500。
請參考
http://msdn.microsoft.com/scripting的VBScript幫助獲得更多信息。
5、SQL命令中的引號處理
雖然用VBScript代碼構造的SQL命令本身沒(méi)有問(wèn)題,但是由于用戶(hù)輸入的表單數據中包含了單引號或雙引號,本來(lái)合法的SQL語(yǔ)句不再合法。相信有不少讀者已經(jīng)遇到過(guò)這個(gè)問(wèn)題。下面我們要介紹的就是如何解決這類(lèi)問(wèn)題。
問(wèn):
我有一個(gè)關(guān)于SQL Server更新、插入記錄命令的問(wèn)題。我想用帶有一個(gè)或多個(gè)引號的字符串來(lái)更新數據庫,SQL將字符串中的引號看成語(yǔ)法符號并提示錯誤。我應該怎么辦呢?是否有其它的字符串分隔符?我已經(jīng)試過(guò)雙引號、[]、{}等,但都沒(méi)有用。
答:
在執行SQL命令之前,應當把所有字符數據中的單引號用兩個(gè)單引號替代。
也就是說(shuō),如果SQL命令中出現了帶引號的字符串(比如用戶(hù)的名字為O'Brian),就會(huì )出現問(wèn)題:
Update Table Set NameField = 'O'Brian'
要解決問(wèn)題,必須把字符串中的單引號轉換成兩個(gè)單引號:
Update Table Set NameField = 'O''Brian'
可以利用Replace函數實(shí)現這種轉換:
strName = Replace(strName, "'" , "''" )
6、處理數據庫日期值
如果說(shuō)包含引號的字符串會(huì )帶來(lái)問(wèn)題的話(huà),那么對我們的某些讀者來(lái)說(shuō)向數據庫傳遞日期數據更是容易出錯。下面我們根據所用數據庫系統的類(lèi)型分別解釋如何正確地完成這一任務(wù)。
問(wèn):如何使用ASP向數據庫傳遞日期數據?
答:答案與所用數據庫類(lèi)型有關(guān)。假設我們使用名為“strDate”的變量保存日期數據,如果使用Access數據庫,那么生成字符串的代碼為:
strSQL = " 合法的SQL命令 " & "#" & strDate & "#"
如果使用的是SQL Server、Sybase、Oracle等數據庫,則代碼為:
strSQL = "合法的SQL命令" & "'" & strDate & "'"
注意兩者的區別在于發(fā)送日期數據所用的分隔符。Access使用“#”,而其他數據庫使用的是單引號“'”。
7、檢查Cookie是否啟用
用戶(hù)已經(jīng)禁用Cookie?看來(lái),這個(gè)用戶(hù)不那么信任你。不過(guò),既然他這么樂(lè )意搞小動(dòng)作,你也不妨來(lái)一下。使用下面介紹的方法,你可以檢查用戶(hù)是否已經(jīng)禁用了Cookie,然后禮貌地告訴他如果要使用網(wǎng)站的全部功能,那么他必須啟用Cookie。
問(wèn):
如何才能知道用戶(hù)是否關(guān)閉了Cookie?
答:
要檢查用戶(hù)是否已經(jīng)關(guān)閉了Cookie,可按如下步驟進(jìn)行:
設置一個(gè)Cookie。
重定向頁(yè)面。
在重定向頁(yè)面中讀取Cookie。
如果存在Cookie,則用戶(hù)已經(jīng)啟用了Cookie;否則,說(shuō)明用戶(hù)禁用了Cookie。
通過(guò)查詢(xún)字符串確定當前位于步驟1還是3。
代碼實(shí)例如下:
Dim strCookie, strTry
strCookie = Request.Cookies("MyCookie")
strTry = Request.QueryString("Try")
If strCookie = "" Then
' Check to see if this is a redirect
' after setting the cookie
If strTry = "" Then
Response.Cookies("MyCookie") = "Set"
' Redirect to this page and try again.
Response.Redirect(Request.ServerVariables("SCRIPT_NAME")
& "?Try=Yes")
Else
' User/Browser didn't accept cookies
' Do something...
End If
Else
' -- Hooray! User is accepting cookies
' -- Delete our cookie: by setting its
' -- expiry date to waaaay back
Response.Cookies("MyCookie").Expires = "January 1, 1980"
' Do something...
End If
8、檢查文件是否存在
如果你通過(guò)ASP來(lái)管理文件,在處理某個(gè)文件之前必須確認一下該文件確實(shí)存在。下面介紹的簡(jiǎn)單代碼可用于驗證文件是否存在。
問(wèn):
我想訪(fǎng)問(wèn)某個(gè)數據庫中的PDF文件,并在HTML頁(yè)面中創(chuàng )建對這些文件的鏈接。在刷新鏈接之前,我想要驗證文件是否確實(shí)存在。如何在A(yíng)SP中實(shí)現驗證功能?
答:
在A(yíng)SP中可以使用FileSystemObject的FileExists方法驗證文件是否存在。
Dim fs, strFileNameAndPath
strFileNameAndPath = Your file name
' -- Use file name and path
' -- from the database. Remember to map it
' -- to the Web Server's point of view.
' -- Use Server.MapPath for help.
Set fs = CreateObject("Scripting.FileSystemObject")
If fs.FileExists(strFileNameAndPath) Then
' -- 文件存在
else
' -- 文件不存在
end if
9、如何更新被鎖定的DLL
如果你正在使用Visual Basic COM組件,一定知道更新組件版本時(shí)候所出現的錯誤信息“不能更新DLL文件,訪(fǎng)問(wèn)禁止”,或許已經(jīng)有好多次被它擋駕了。下面我們介紹的是一個(gè)小巧的批命令文件,你可以用它來(lái)自動(dòng)啟動(dòng)或關(guān)閉鎖定DLL文件的MTS。
問(wèn):
我們所用的IIS 4.0上運行著(zhù)ASP和一個(gè)Visual Basic 6.0 DLL文件,DLL文件用來(lái)為ASP頁(yè)面提供數據服務(wù)。問(wèn)題是,當我們想要把Web服務(wù)器上的DLL升級到新的版本時(shí),系統總是顯示DLL文件正在使用中,既不能上載也不能注冊這個(gè)新的DLL。我們試過(guò)關(guān)閉Web網(wǎng)站以及IIS,但DLL文件仍處于使用狀態(tài)。唯一的辦法似乎是關(guān)閉服務(wù)器。如你所知,網(wǎng)站運行時(shí)關(guān)閉服務(wù)器顯然不太合適。你是否有解決這個(gè)問(wèn)題的方法?有一個(gè)16位的工具軟件WPS可以關(guān)閉DLL,然而,它不能用于VB6的DLL文件。
答:
不能更新DLL文件的原因在于Microsoft Transaction Server(MTS)已經(jīng)打開(kāi)了DLL的一個(gè)實(shí)例,必須使用mtxstop才能關(guān)閉它。首先,創(chuàng )建批命令文件FlushCache.bat,在文件中輸入以下內容:
net stop iisadmin /y
mtxstop
net start w3svc
運行這個(gè)批命令文件。它將在大約5秒鐘內關(guān)閉Web服務(wù)器并重新啟動(dòng)它。在關(guān)閉和啟動(dòng)兩個(gè)操作之間它將清除MTS緩沖,然后你就可以更新DLL文件。
第一次運行批命令文件的時(shí)候,要注意一下其他被關(guān)閉的服務(wù)(例如FTP服務(wù)等)。寫(xiě)下這些被關(guān)閉的服務(wù),然后打開(kāi)批命令文件,加入代碼使得這些服務(wù)也被重新啟動(dòng):
net start < 服務(wù)的名字 >
2000年06月03日,Bill Bassett提出了另外一種方法:
有一種解決該問(wèn)題的更為簡(jiǎn)單的方法,這就是配置應用使其運行在自己獨立的內存空間中。運行IIS MMC,右擊包含目標應用的分支,選擇“屬性”。在屬性對話(huà)框中間的應用設置區,輸入應用的名字并選中“在獨立的內存空間運行”檢查框。
應用運行的時(shí)候,只要再次打開(kāi)其屬性頁(yè)面就可以看到此時(shí)“卸載”按鈕已經(jīng)變?yōu)榭捎昧?。點(diǎn)擊這個(gè)按鈕應用卸載,你可以更新DLL文件。該操作并不取消DLL的注冊,所以這些工作要用regsvr32手工完成。這種方法要比關(guān)閉IIS等服務(wù)再重新啟動(dòng)它們要好。
10、記錄文件下載日志
這是一個(gè)簡(jiǎn)單但很實(shí)用的技巧,用于監測有多少用戶(hù)從網(wǎng)站下載了文件。
問(wèn):
我們需要監測用戶(hù)在網(wǎng)站上的文件下載操作。當用戶(hù)點(diǎn)擊鏈接下載文件時(shí),我們希望能夠運行某個(gè)ASP文件將日志數據寫(xiě)入SQL Server數據庫,然后執行下載操作。問(wèn)題是,ASP頁(yè)面如何才能在記錄日志數據之后再將文件下載到客戶(hù)端?
答:
竅門(mén)在于用超級鏈接啟動(dòng)第二個(gè)“后臺”腳本,用它來(lái)記錄下載日志并啟動(dòng)下載過(guò)程。只要第二個(gè)頁(yè)面不產(chǎn)生任何HTML輸出,用戶(hù)瀏覽器將仍舊顯示第一個(gè)頁(yè)面。
下面是第一個(gè)文件中的鏈接示例:
Download code.zip (不要點(diǎn)擊這個(gè)鏈接,它只用于演示,沒(méi)有任何實(shí)際功能。)
以上鏈接由下面的代碼創(chuàng )建:
< A HREF="dnladd.asp?filename=code.zip" >Download code.zip< /A >
用戶(hù)點(diǎn)擊鏈接時(shí)我們把待下載的文件名傳遞給了第二個(gè)文件dnladd.asp。Dnladd.asp包含了把下載文件名字和其他信息寫(xiě)入數據庫的腳本。完成數據庫操作后,dnladd.asp用如下代碼啟動(dòng)下載過(guò)程:
Response.ContentType = "application/x-zip-compressed"
Response.Redirect request("filename")
注意:不要在dnladd.asp中輸出任何HTML代碼。