ASP(Active Server Page) Note

本網頁以打造無障礙閱讀為目標,可以用任何瀏覽器來觀看本網頁


簡介

ASP(Active Server Pages) 是由 Microsoft 所開發出來的一種技術,這種技術透過伺服器端執行描述語言 (Server-Side Scripting) 程式碼的運算邏輯,供各種瀏覽器閱覽。


通常在撰寫 ASP 程式時,會選定使用某一程式語言來撰寫程式碼,如:VBScript, JavaScript, Perl, Tcl, Python等,然後用特別的標籤來區隔這些程式碼,置入一般的HTML文件中。一旦使用者透過瀏覽器來讀取 ASP 檔案(即副檔名為 .asp 的檔案)時,伺服器就會執行檔案中的程式碼,然後在運算結束後,把運算的結果以標準的HTML格式傳回到瀏覽器。

ASP仍侷限在安裝IIS的網路伺服器和安裝Microsoft的PWS(Personal Web Server)才能使用,但Chili!Soft公司已經研發可以在Unix及Linux使用的ASP伺服器, 新版的BigApache套件也同時支援ASP了,還有InstantASP。

研讀背景

Web server架設

目前支援 ASP 的Web Server 有 MicroSoft WinNT/2000/XP 的IIS 4.0/5.0/5.1 及 Windows 98/SE/ME 的 PWS(Personal Web Server)。

安裝PWS

安裝IIS

Windwos 2000 Professional 版的 IIS 也和 PWS 一樣小器,有10個連線上限的限制。真的要架設 IIS 網站伺服器,應該在有安裝 Win2000 Server 版的機器上安裝 IIS。

控制台
 新增/移除程式
  新增/移除Windows元件
   Internet Information Services(IIS)
    詳細資料 //SMTP Service, 檔案轉換通訊協定(FTP)伺服器)

效能調整

網路上的芳鄰/右鍵/內容
 區域網路/右鍵/內容
  點選File and Printer Sharing for Microsoft Netowrks/內容
   點選網路應用程式的資料傳送量最大化/確定
   

啟動iis

利用Internet服務管理員 利用瀏覽器
控制台
 系統管理工具
  Internet 服務管理員

http://localhost:2008/iis.asp

localhost : 亦可代換成ip
2008 : 系統管理Web站台的連接埠號碼
iis.asp : 主機名稱.asp

WEB站台可能的組成

名詞解釋

宣 告

使用的語言

雖然你可以使用各種程式語言,來撰寫 ASP 的程式碼,但 Microsoft 的網站伺服器程式已設定好VBScript及JavaScript的直譯核心程式(或稱為引擎)。如果要使用其他語言,則您須另行安裝這些語言的直譯核心 程式,然後在網站伺服器中作適當的設定。

開頭宣告 (宣告server side使用的script類型)

利用@(一個ASP程式只能有一個@,且要放在html標籤之上)
宣告使用vbscript 宣告使用jscript
<%@language="vbscript"%> //ASP若採vbscript可省略宣告

<%@language="javascript"%>

行內段落宣告 ( 動態指定server side使用的script類型)

宣告使用vbscript 宣告使用jscript
<script language="vbscript" runat="Server">
<script language="javascript" runat="Server">

變數宣告(無須指定資料型態)

vbscript jscript
全域變數 區域變數 全域變數 區域變數
public x=1 dim x=1
private y=1
x=1; var x=1;

強迫宣告

vbscript的變數使用無須宣告, 但若要強迫宣告可用

< %Option Explicit%>

變 數

VBscript

資 料型態(Data Type)

vbscript 資料型態
Empty   數字=0 ; 字串="",可用isempty()判斷是否為empty資料型態
Null   N/A,可用isnull()判斷,避免從資料庫取得null值
Boolean   True / False
Byte   0~255
Interger   -32768~32768
Currency    
Long    
Single    
Double    
Date/Time 日期/時間 西元100年1月1日~西元9999年12月31日
String 字串 若字串中包含有雙引號則 my name is "peter". => "my name is ""peter""."
Object 物件 N/A
Error 錯誤代碼 N/A

註 解

HTML vbscript jscript CSS
  <!-- -->   ' , rem   //   /* */

函 數

vbscript jscript
  無傳回值   有傳回值   無傳回值   有傳回值
sub 函數名
  return 回傳值
end sub
function 函數名 (參數)
  函數名=回傳值
end function
function 函數名 (參數)
{
  
}
function 函數名 (參數)
{
  return 回傳值
}

範例 : 以vbscript為主的asp程式, 呼叫vbscript或javascript函數的方法

<html>
< head>
< %
sub vbproc(num1,num2)
Response.Write(num1*num2)
end sub
%>

< script language="javascript" runat="server">
function jsproc(num1,num2) {
Response.Write(num1*num2)
}
< /script>
< /head>

<body>
< p>Result: <%call vbproc(3,4)%></p>
< p>Result: <%call jsproc(3,4)%></p>
< p>Result: <%vbproc 3,4%></p>
< p>Result: <%jsproc 3,4%></p>
< /body>

</html>

陣列

vbscript jscript
  編譯期間定義陣列   執行期間定義陣列   編譯期間定義陣列   執行期間定義陣列

dim myarray(10,10)
'注意此時的10一定要是數字常數,不能代變數

Dim famname(6) , i
famname(1) = "Jan Egil"
famname(2) = "Tove"
famname(3) = "Hege"
famname(4) = "Stale"
famname(5) = "Kai Jim"
famname(6) = "Borge"

For i = 1 to 6
response.write(famname(i) & "<br />")
Next

redim myarray(變數名)
'變數代入陣列需在redim才能使用
dim sick()
redim sick(rst("totalrec")) //根據資料庫筆數定 義陣列大小
i=0
do while Not rst1.eof
  sick( i ) = rst1("disease_cname") // 將欄位資料循序丟入陣列中
  rst1.movenext
  i=i+1
loop
myarray=new Array(10);
var myarray=new Array(10);
 

ASP 物件

當我們打開瀏覽器並輸入網址,也就是對Web Server送出 Request 要求,Web Server會自動進行 MIME 判別,並採取Windows一貫慣用的方法,也就是從檔案的附加檔名去判斷要交給哪個 DLL 來執行或解譯。 如果發現要處理的檔案附檔名是 .ASP 類型的檔案,就將此檔案交給 ASP.DLL 這個動態連結函式庫處理,它會將先將 Web Server 所收到的 URI 處理好,並儲存到記憶體裡面。

ASP 動態函式庫一旦執行,就會常駐在記憶體內,一直到關機為止才結束(稱為 in-process),因此它的執行效能遠高於附加檔名是 exe 或 com 的應用程式(通常這一類應用程式的執行方式就稱為 out-process)。由於使用 in-process 方式處理,所以 ASP 的內建物件 Application 才有辦法運作。也正因為ASP屬於 in-process 的關係,所以如果想要變更 ASP 相關的系統設定,必須將伺服器重新開機才會生效。

ASP 僅能以 IUSR_WebServer 這個帳號來執行,造成許多伺服器管理的工作必須以 administrator 權限來執行,所以 ASP 無法呼叫 WindowsAPI 來取得系統帳號和應用在伺服器管理工作上,例如:帳號管理、設定檔案目錄權限、修改系統登錄......等等。

ASP 提供了六個內建的物件,程式設計師透過這些物件的介面,來撰寫 ASP 程式。以下是這六個物件的簡介:

Response 提供你輸出運算結果到瀏覽器的介面。
Request 提供你讀取瀏覽器所傳來的資料及與伺服器有關變數的介面。
Server

與伺服器有關的相關設定,則是透過 Server 物件來與 Web Server 溝通,例如:呼叫自家的函式庫、修改 Timeout 設定、讀取主目錄的絕對路徑、使用 HTML 或 URL 編碼(Encode) 法來處理 Response 變數等。
提供與設定伺服器本身有關的介面,更重要的是提供了產生其他物件的介面。

Session Session 物件用來維護每個瀏覽器連線的資訊,當我們要讓ASP程式能夠根據不同身分執行不同功能的時候,就會使用 Session 變數。此變數的有效時間預設是20分鐘,但是有〝連選得連任〞的特性,也就是說當網頁重新整理(Reload)後,Session的有效時間也跟著延長。 但最長也只能維持到瀏覽器關閉,或清除 cookie 為止。
當使用者與伺服器連線時,提供存取有關這次連線所使用變數的介面。
Application

當Web Server開機跑起來後,首先執行的是 Application物件,它定義了啟動IIS後Web站台運作所需的整體變數,並且會把這些變數一直放在記憶體中,等待ASP程式存取,一直到IIS Shutdown才消失。
這裡的 Application 指的是整個網站,或被設定為 Application 的虛擬目錄。這個物件提供存取與 Application 變數的介面。所有的使用者共用 Application 的變數。

ObjectContext ObjectContext 物件則是與 CGI 運作機制不相干的物件,它用來管理 MTS(Microsoft Transaction Server)。MTS 允許在執行程式前先紀錄伺服器狀態,如果有部分程式執行失敗,則可以退回到 先前的狀態,只有當所有相關程式跑完且執行成功後,才會真正登錄改變後的伺服器狀態,就像是我們為 ASP 程式設定了還原點一樣,可以避免程式執行失敗之後,要自行復原伺服器狀態的麻煩。
MTS 通常使用在有需要較高的安全性、和多個程式需要作〝同步〞的場合,一般我們是用不到的。由於 MTS 對於記憶體的需求較高,如果我們網站設計上沒有這個需要,卻故意去使用它,那麼將會白白浪費許多Web Server 的系統資源。
提供使用 Microsoft Transaction Server 物件的介面。

Response

Response.Write(輸出)

可簡寫為<%="輸出"%>

vbscript
jscript
word="您好"
response.write word
word="您好";
response.write(word);
Tips1 : 使用 Server.HtmlEncode() 來顯示html字元
response.write Server.HtmlEncode("We sell the <<Best!>> products!")
Tips2 : 可使用2種方式來顯示雙引號
使用連續的雙引號, 會被視為一個雙引號 <% response.write "He said, ""This doesn't work!"" " %>
使用 chr(34) 代替雙引號並以 & 來連接字串 <% response.write "He said," & chr(34) & "This doesn't work!" & chr(34) %>

Response.Redirect(轉向)

vbscript
jscript
response.redirect "abc.htm" response.redirect("abc.htm");

Response.End(結束)

vbscript
jscript
response.end response.end();

Response.Cookies(在client端的browser加上cookies)

Cookies是由Netscape發展來修正Web Server與Browser之間互動不足的問題, 包含了Session cookie及Persistent cookie(永久)兩種型態 , 並有限制如下

Session cookie Persistent cookie
response.cookies("name") = "Peter" response.cookies("name") = "Peter"
response.cookies("name").expires = "July 4, 2005"

Response.Expires

除了由IIS可設定讓Internet Explorer不cache以外,可以用以下的asp程式碼,觀念上是利用HTTP header控制cache。

以下script必須 執行在HTTP 1.1 server ,適用於Internet Explorer 4.0以上版本。在每一頁 asp 的開頭加上下列程式碼
<%
Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "no-cache"
Response.Expires = -1
Response.ExpiresAbsolute = Now() - 0.1
%>

要避免Client端殘存舊的資料,還可以在每次開啟網頁的超鏈結時帶個參數,並且每次都不同

Edit.asp?time=20050623104322

Request

<%=request("上個網頁傳來的變數")%> ,若遇有相同變數名稱,其collection的優先順序為

  1. QueryString
  2. Form
  3. Cookies
  4. ClientCertificate
  5. ServerVariables

QueryString collection

利用 a 標籤將變數以url傳送 接收變數

<a href="answer.asp?apple=red&orange=blue"> 水果</a>

str="this is a apple"
str=Server.UrlEncode(str) //含有空格要進行url 編碼
< a href="answer.asp?fruit=<%=str%>"> 水果</a>

apple=request.querystring("apple")
orange=request.querystring("orange")

fruit=request.querystring("fruit")

Form collection

利用表單傳送變數 接收變數

<form method="post" action="login.asp">
帳號 :<input type="text" name="account" />
密碼 :<input type="password" name="password" />
<input type="submit" name="Submit" value="送出" />
</form>

<%
account=request.form("account")
password=request.form("password")
%>

Tips : 傳回所有表單欄位,減少使用者重複輸入

<form method="post" action="login.asp">
<% for each item in request.form %>
<input type="hidden" name="<%=item%>" value="<%=server.htmlencode(request.form(item))%>"/>
<% next %>
<p> <input type="submit" name="Submit" value="重填" /></p>
</form>

ServerVariables collection

目前網頁的程式名稱 script_name
  傳回虛擬路徑與程式名稱

若要傳回真實路徑,有2種方法

  1. Request.ServerVariable("path_translated")
  2. Server.MapPath()

<% request.ServerVariables("script_name") %>

<%
response.write request.ServerVariables("path_translated")

response.write Server.MapPath(request.ServerVariables("script_name"))
%>

登入者前一個瀏覽的網頁 http_referer
  傳回網頁名稱
<% request.ServerVariables("http_referer") %>
登入者的IP remote_addr
  傳回IP
<% request.ServerVariables("remote_addr") %>
登入者的瀏覽器 http_user_agent
  傳回瀏覽器型態
<% request.ServerVariables("http_user_agent") %>

Cookies collection

name = request.cookies("name")
or
name = request("name") //此法需注意request對collection的處理順序

Session

變數 陣列
<% session("name") = "Peter" %>

//如何取用呢
<%
response.write session("name")
%>
<%
dim cart(20)
cart(0) = "光碟片"
cart(1) = "燒錄機"
session("cart") = cart
%>
//如何取用呢
<%
response.write session("cart")(1)
%>

Session 物件提供四種屬性(Properties)、兩個事件(Events)、一種方法(Method)與兩個集合(Collections),列表如下:

Session 物件的屬性
性質 說明 範例
CodePage CodePage的識別碼  
LCID LCID的識別碼  
SessionID 用戶端的SessionID,具唯一性 <%= Session.SessionID %>
Timeout Session物件的有效時間(以分鐘為單位),預設為20分鐘 <% Session.Timeout = 60 %>
Session 物件提供的事件
事件 說明 範例
OnStart 啟動一個 Session 物件時所觸發的函式,此函式必須放在 global.asa 檔案  
OnEnd 結束一個 Session 物件時所觸發的函式,此函式必須放在 global.asa 檔案  
Session 物件提供的方法
方法 說明 範例
Abandon 刪除 Session 物件所含的所有資訊 <% Session.Abandon %>
Contents.Remove(item or index) 刪除 Contents 集合中的某一個項目  
Contents.RemoveAll 刪除 Contents 集合中的所有項目  
Session 物件提供的集合
集合 說明 範例
Contents 所有加在 Session 物件的變數集合  
StaticObjects 所有在使用者層級(Session Scope)所宣告的物件集合  

Application

Recordset

資料庫的使用

存取資料庫要先建立connection物件

vbscript set conn=server.createobject("adodb.connection")
conn.open "driver={SQL SERVER};server=163.17.1.25;uid=root;pwd=root;database=test"
jscript conn=server.createobject("adodb.connection");
conn.open("driver={SQL SERVER};server=163.17.1.25;uid=root;pwd=root;database=test");

執行sql查詢的3種方法

使用recordset物件的open方法

vbscript sql_str="select * from score.dbo.asco"&y1&" a "
set rst=server.createobject("adodb.recordset")
rst.open sql_str,conn,1
jscript sql_str="select * from score.dbo.asco"&y1&" a ";
rst=server.createobject("adodb.recordset");
rst.open(sql_str,conn,1);

使用connection物件的execute方法

vbscript sql_str="select * from score.dbo.asco91"
set rst=conn.execute(sql_str)
jscript sql_str="select * from score.dbo.asco91";
rst=conn.execute(sql_str);

使用command物件的execute方法

關閉資料庫

vbscript rst.Close;
set rst=null;
conn.Close;
set conn=null;
jscript rst.Close();
rst=null;
conn.Close();
conn=null;

回傳記錄在第幾筆

vbscript

sql_str="select * from score.dbo.asco91"
set rst=CreateObject("ADODB.RECORDSET")
rst.CursorLocation=3 'cursor位於瀏覽器端
rst.open sql_str,conn,1
rst.find "stuid='9154610'"
if not rst.eof then
    response.Write rst.absoluteposition
else
    response.Write "你尚無此學期排名!"
end if

常用的sql指令

查詢記錄

顯示會員記錄: SELECT * FROM tblMember
顯示男性會員記錄, 並依出生日期排序, 年紀愈小的先顯示 : SELECT * FROM tblMember WHERE i_Sex = 1 ORDER BY dt_Birth DESC

新增記錄

新增會員記錄 : INSERT INTO tblMember(vch_Name,i_Sex,dt_Birth) VALUES ('ALLEN',0,'1999/12/25')

更新記錄

將姓名為 ALLEN 的會員, 性別變更為 1 (男性) : UPDATE tblMember SET i_SEX=1 WHERE vch_Name='ALLEN'

刪除記錄

刪除 ALLEN 會員記錄 : DELETE FROM tblMember WHERE vch_Name='ALLEN'
刪除所有男性記錄 : DELETE FROM tblMember WHERE i_Sex=1
刪除出生日期在2000/1/18 以後的會員記錄 : DELETE FROM tblMember WHERE dt_Birth > '2002/1/18'

檢查SQL語法

對於SQL語法錯誤的部分,我們可印出SQL字串來判斷。例如:

..........略..........
sql = "select stdno,classno,student,count(correct) as total from award_answer where correct=1 group by stdno,classno,student order by total desc,classno"
response.wriet sql //印出SQL字串
response.end //結束不執行
Set rs2=conn.execute(sql)
.........略...........

以資料庫Class簡化資料庫的使用

'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'資料庫操作類別
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'名稱:Class_DBOperate
'版本:0.2
'作者:qihangnet
'更新:2005年6月14日
'作用:擗ご禤おw操作的流程
'授權:免d使用
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Class Class_DBOperate

'**變數定義**
'Conn: 資料庫連接物件
'Conn_Str:資料庫連結字串

Private Conn,Conn_Str

'**私有方法**
'初始化

Private Sub Class_Initialize()
     Set Conn = Server.CreateObject("ADODB.Connection")
End Sub
'終止
Private Sub Class_Teriminate()
     Set Conn = Nothing
End Sub

'**屬性**
'輸出資料庫連接字串
' 返回值類型:string

Property Get ConnectString
     ConnectString = Conn_Str
End Property
'設置資料庫連接字串
' 參數:str --- string

Property Let ConnectString(str)
     Conn_Str = str
End Property

'**公開方法 (事件)**
'開啟資料庫
Public Sub DB_Open()
     Conn.ConnectionString = Conn_Str
     Conn.Open
End Sub
'關閉資料庫
Public Sub DB_Close()
     Conn.Close
End Sub
'資料庫查R(SQLN句)
' 參數及類別:sql ---- string
' 返回值類型:記錄集
' 前提:資料庫狀態為打開

Public Function DB_Select(sql)
     Set DB_Select = Conn.Execute(sql)
End Function
'資料庫執行(SQLN句)
' 參數及類別:sql ---- string
' 返回值類型:整數
' 返回值含義:受影響行數
' 前提:資料庫狀態為打開

Public Function DB_Excute(sql)
     Dim rs_affected
     Conn.Execute sql,rs_affected
     DB_Excute = rs_affected
End Function

End Class

以下為使用範例

Dim rdb : Set rdb = New Class_DBOperate ' 初始化一個 rdb 物件,並呼叫 New Class_DBOperate 類別的 Class_Initialize 方法
rdb.ConnectString = "Provider=SQLOLEDB;driver={sql server};database=car;server=127.0.0.1;uid=sa;pwd=sapasswd"
rdb.DB_Open

Dim rst, sqlstr
sqlstr="select * from op"
set rst =rdb.DB_Select( sqlstr )
if not rst.eof then
   while not rst.eof
      response.write rst(0) & rst(1) & "<br />"
      rst.movenext
   wend
end if
rst.close
set rst=nothing

rdb.DB_Close
Set rdb = Nothing ' 呼叫 New Class_DBOperate 類別的呼叫 Class_Terminate 方法

以資料庫Function簡化資料庫的使用

<SCRIPT LANGUAGE="VBSCRIPT" RUNAT="SERVER">

Function GetRs(SQL)
   Dim Rs, Conn
   Set Rs=Server.CreateObject("ADODB.Recordset")
   Set Conn = GetCn()
   Rs.Open SQL, Conn, 3
   Set GetRs = Rs
   Set Rs = Nothing
   Set Conn = Nothing
End Function

Function GetCn()
   Dim Conn
   Set Conn=Server.CreateObject("ADODB.Connection")
   Conn.Open GetConProfile()
   Set GetCn = Conn
   Set Conn = Nothing
End Function

Function GetConProfile()
   Dim SQLServer, SQLLogin, SQLPwd, SQLDB
   SQLServer="127.0.0.1"
   SQLLogin="sa"
   SQLPwd="sapasswd"
   SQLDB="car"
   GetConProfile = "Driver={SQL Server};Server=" & SQLServer & ";Uid=" & SQLLogin & ";Pwd=" & Trim(SQLPwd) & ";Database=" & SQLDB & ""
End Function

Function Execute(SQL)
   Dim Cm, Conn, Errors
   Set Cm=Server.CreateObject("ADODB.Command")
   Set Conn = GetCn()
   Cm.ActiveConnection = Conn
   Cm.Prepared = True
   Cm.CommandText = SQL
   Cm.CommandType = 1
   Cm.Execute
   Set Errors = Conn.Errors
   Execute = CStr(Conn.Errors.count)
   Set Cm = Nothing
   Set Conn = Nothing
End Function

Function GetCm()
   Dim Cm, Conn
   Set Cm=Server.CreateObject("ADODB.Command")
   Set Conn = GetCn()
   Cm.ActiveConnection = Conn
   Set GetCm = Cm
End Function

</SCRIPT>

以下為使用範例

Dim rst, sqlstr
sqlstr="select * from op"
set rst = GetRs( sqlstr )
if not rst.eof then
   while not rst.eof
      response.write rst(0) & rst(1) & "<br />"
      rst.movenext
   wend
end if
If isobject("rst") Then
   rst.close
End If
set rst=nothing

讀取Excel

ASP 如何讀取 Excel

ASP讀取Excel的方式有3,先表列如下,再來分別說明

方式 是否要安裝Excel 是否要安裝Driver 速度 方便性

功能性

1.透過 COM 呼叫,直接使用 Excel 物件 不用 普通 完整
2.透過 OLE DB 呼叫 不用 中等
3.透過 ODBC 呼叫 不用 中等

1.透過 COM 呼叫,直接使用 Excel 物件

此方式直接透過COM呼叫Excel 做處理,優點是速度快,無須額外下載安裝驅動程式(Jet, Ole DB...),可完整實現所有Excel的功能,不會受到驅動程式的功能限制,如同我們連接SQL資料庫時,能使用 SQL Server Native Client 就不會用 SQL Server ODBC Driver一樣,茲節錄功能如下

1、 建立Excel對像
set objExcelApp = CreateObject("Excel.Application")
objExcelApp.DisplayAlerts = false 不顯示警告
objExcelApp.Application.Visible = false 不顯示界面
2、 新建Excel文件
objExcelApp.WorkBooks.add
set objExcelBook = objExcelApp.ActiveWorkBook
set objExcelSheets = objExcelBook.Worksheets
set objExcelSheet = objExcelBook.Sheets(1)
3、 讀取已有Excel文件
strAddr = Server.MapPath(".")
objExcelApp.WorkBooks.Open(strAddr & "\Templet\Table.xls")
set objExcelBook = objExcelApp.ActiveWorkBook
set objExcelSheets = objExcelBook.Worksheets
set objExcelSheet = objExcelBook.Sheets(1)
4、 另存Excel文件
objExcelBook.SaveAs strAddr & "\Temp\Table.xls"
5、 保存Excel文件
objExcelBook.Save (筆者測試時保存成功,頁面報錯。)
6、 退出Excel操作
objExcelApp.Quit 一定要退出
set objExcelApp = Nothing

節錄參考:http://www.dk101.com/Discuz/viewthread.php?tid=91156

2.透過 OLE DB 呼叫

雖然透過OLE DB較ODBC速度快,不過寫入10萬筆資料也只差了5秒鐘,且有些資料來源只有ODBC可連接,所以看情形使用吧

連接字串 for Excel 97-2003 Format (.XLS)

"Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=""Excel 8.0;HDR=YES;IMEX=1"";Data Source=" & server.mappath("D:\websites\readxls\excel\score.xls")

連接字串 for Excel 2007-2010 Format (.XLSX)
有鑑於Office於2007之後改為以XML為主的格式,若要讀寫2007以上的格式則需安裝 Microsoft Access Database Engine 2010 可轉散發套件
此連接字串可向下相容喔(Excel 97-2010)

"Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=""Excel 12.0;iMex=1;HDR=Yes"";Data Source=" & server.mappath("D:\websites\readxls\excel\score.xls")

3.透過 ODBC 呼叫

ODBC 是業界存取資料庫的標準,SQL Azure 亦支援 ODBC 方式來存取。據說 SQL Server 2012 會是最後一個提供 Microsoft SQL Server OLE DB 支援的版本(往後支援7年)。所以未來的設計開發規劃上,建議採用 ODBC。

節錄參考:http://sharedderrick.blogspot.com/2011/11/sql-server-2012-ole-db-odbc.html

連接字串 for Excel 97-2003 Format (.XLS)

"Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=score.xls;defaultDir=D:\websites\readxls\excel;"

連接字串 for Excel 2007-2010 Format (.XLSX)
有鑑於Office於2007之後改為以XML為主的格式,若要讀寫2007以上的格式則需安裝 Microsoft Access Database Engine 2010 可轉散發套件
此連接字串可向下相容喔(Excel 97-2010)

"Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=D:\websites\readxls\excel\score.xls"

ASP範例

以下提供ASP的範例程式碼,特別注意連接字串示範了4種

<%
Dim objConn,objRS
Dim strConn,strSql
Dim lRecCount

set objConn=Server.CreateObject("ADODB.Connection")
set objRS=Server.CreateObject("ADODB.Recordset")

' Office 2003 OLE DB
strConn="Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=""Excel 8.0;HDR=YES;IMEX=1"";Data Source=" & server.mappath("excel\score.xls")
' Office 2007 OLE DB
'strConn="Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=""Excel 12.0;iMex=1;HDR=Yes"";Data Source=" & server.mappath("excel\score.xls")

' Office 2003 ODBC
'strConn="Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=score.xls;defaultDir=D:\websites\readxls\excel;"
' Office 2007 ODBC
'strConn="Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=D:\websites\readxls\excel\score.xls"

objConn.Open strConn
strSql="SELECT * FROM [Sheet1$]"
objRS.Open strSql,objConn,1,1

lRecCount=objRS.RecordCount
ColCount=objRS.Fields.Count
response.write "record:" & CStr(lRecCount) & "<br />"
objRS.MoveFirst
while not objRS.eof
     'response.write objRS(0) & "----" & objRS(1) & "-------" & objRS(2) & "-------" & objRS(3) & "-------" & objRS(4)& "<br>"
     for i=0 to ColCount-1
        response.write objRS(i)&","
     next
     response.write "<br />"
     objRS.MoveNext
wend
objRS.Close
objConn.Close
set objRS = Nothing
set objConn = Nothing
%>

使用技巧

讀取伺服器端的文字檔

每5秒顯示一次由變數 strFilename 指定讀取的文字檔 (可改用 Mappath 較安全) , 並進行相關的錯誤處理

<%option explicit%>
<html>
<head>
<title>文字檔案讀取範例 : 每5秒讀取一次文字檔</title>
<meta http-equiv="refresh" content="5">
</head>
<body>
<%
On error resume next
Dim objFSO, objTextFile, strData, strFilename
Const ForReading = 1
' 指定文字檔的路徑
strFilename = "c:\inetpub\wwwroot\log.txt"

Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
If Err.Number <> 0 then
call Err_Handler()
End If

If not objFSO.FileExists(strFilename) Then
Response.Write strFilename & "<br />指定的文字檔不存在喔!"
Else
' 開啟指定的文字檔
Set objTextFile = objFSO.OpenTextFile(strFilename, ForReading)
If Err.Number <> 0 then
call Err_Handler()
End If

Do While not objTextFile.AtEndOfStream
' 逐行讀取
strData = objTextFile.ReadLine
Response.write strData & "<br />"
If Err.Number <> 0 then
call Err_Handler()
End If
Loop
' 關閉文字檔
objTextFile.Close
Set objTextFile = Nothing
End If

Set objFSO = Nothing
Sub Err_Handler()
Response.write "<div style='color:red'>程式發生錯誤<br />"
Response.write "錯誤源碼 : " & Err.Source & "<br />"
Response.write "錯誤代號 : " & Err.Number & "<br />"
Response.write "錯誤訊息 : " & Err.Description & "</div>"
Response.End
End Sub
%>
</body>
<html>

iif函數

依據對運算式的評估結果,結果為真會傳回第2個參數,結果為假會傳回第3個參數。

<SCRIPT LANGUAGE="VBSCRIPT" RUNAT="SERVER">
Function IIf( exp, rst1, rst2)
      If exp Then IIf = rst1 Else IIf = rst2
End Function
</SCRIPT>

身心障礙<input type="checkbox" name="ishandicap" id="ishandicap" <%=iif(ishandicap,"checked","")%> />

列出所有接收到的參數

傳回 post 或 get 方法所收到的所有參數

Dim obj
for each obj in Request.Form
     response.write obj & "=" & Request.Form(obj) & "<br />"
next

Dim obj
for each obj in Request.QuerString
     response.write obj & "=" & Request.QuerString(obj) & "<br />"
next

同一個表單根據要求遞交到不同ASP

<form method="POST" name="form1">
......
<input type="button" value="del" name="B1" onclick="document.form1.action='del.asp'; document.form1.submit()" >
<input type="button" value="view" name="B2" onclick="document.form1.action='view.asp';document.form1.submit()">
<input type="button" value="addnew" name="B3" onclick="document.form1.action='addnew.asp'; document.form1.submit()">
</form>

太長的敘述要以 &_ 斷行

response.write "this is a" &_
"asp program test."

偵測使用者IP

如果光是用Remote_Host或Remote_Addr, 那你拿到的只是實際存取的主機而已, 如果別人透過Proxy來讀取你的程式那你就偵測不到正確的IP了. Request.ServerVariables("HTTP_X_FORWARDED_FOR") , 這段語法代表的是偵測這台主機後端使用的IP, 如Proxy後端的使用者就可以用這個語法偵測, 如果Remote_Addr偵測的是真的IP那這個值會是空的.

dim ip
if Request.ServerVariables("HTTP_X_FORWARDED_FOR")<>"" then
 ip=Request.ServerVariables("HTTP_X_FORWARDED_FOR")
else
 ip=Request.ServerVariables("REMOTE_ADDR")
end if

ASP的global.asa

內含ASP唯一的4個事件程序

  1. Application_OnStart
  2. Application_OnEnd
  3. Session_OnStart
  4. Session_OnEnd

<script language="vbscript" runat="Server"> //此範例為計算上線人數
Sub Application_OnStart
 Application("OnlineCount") = 0
End Sub
Sub Application_OnEnd
End Sub
Sub Session_OnStart
 Application.Lock
 Application("OnlineCount") = Application("OnlineCount") + 1
 Application.UnLock
End Sub
Sub Session_OnEnd
 Application.Lock
 Application("OnlineCount") = Application("OnlineCount") - 1
 Application.UnLock
End Sub
</script>

注意事項

網 路資源

主 網 站:http://peterju.notlong.com (目前轉址至 http://irw.ncut.edu.tw/peterju/) Sitetag Logo

Level Triple-A conformance icon | [歡迎使用任何作業系統、瀏覽器觀看!] | Valid XHTML 1.0 Transitional | Valid CSS! | [Valid RSS] | [創意公眾許可証]
This work is licensed under a Creative Commons License