• 沒有找到結果。

第三章

N/A
N/A
Protected

Academic year: 2021

Share "第三章"

Copied!
34
0
0

加載中.... (立即查看全文)

全文

(1)

第三章 ASP 程式設計

3.1 ASP程式 2

3.1.1 ASP程式架構 2

3.1.2 ASP語言 3

3.1.3 ASP程式開發工具 3

3.2 ASP指令語法 3

3.2.1 標記 3

3.2.2 變數宣告 4

3.2.3 輸出資料 4

3.2.4 輸入資料 5

3.2.5 讀取表單資料 6

3.2.6 網頁間資料傳遞方法 6

3.2.7 Server物件 7

3.2.8 檔案操作 7

3.3 資料庫處理程式設計 9

3.3.1 資料庫連線 9

3.3.2 開啟紀錄集 10

3.3.3 紀錄操作 10

3.3.4 輸出資料 11

3.3.5 查閱資料-依鍵值 17

3.3.6 查閱資料-指定紀錄序 18

3.3.7 刪除資料-依鍵值 18

3.3.8 更新資料-依鍵值 19

3.3.9 郵寄資料-一般郵件 24

3.4 將ASP程式碼封裝成DLL 26

3.4.1 設計要點 26

3.4.2 引用DLL檔 28

3.4.3 應用範例 29

回目錄

(2)

第三章 ASP 程式設計

由於本書並非特別針對網頁設計,有關網頁之製作方式並不準備深入 探討,本章僅介紹有關 ASP 物件操作資料庫之常用方法與程式設計技巧,

讀者必須具備基礎的 HTML 知識,方能了解範例程式之意義。讀者若需了 解網頁設計技巧,請參閱其它專書。在閱讀本章時,可搭配本書提供之 ASP 應用系統,將能加深讀者之 ASP 程式語法與設計技巧。在 WEB 網際網路 環境下,仍然需要使用 ADO 物件來處理資料庫,同時需要透過 MyODBC 驅動程式與 MySQL 連線。此外,本章也介紹以 DLL 方式來設計 ASP 程式 之技巧。

3.1 ASP 程式

3.1.1 ASP 程式架構

ASP 程式必須架構在網頁程式內,基本的 ASP 程式架構如圖 3.1 所示。

<!-- #include virtual = "公用程序" -->

<%

……….. ‘前置處理 ASP 程序

%>

<HTML>

<HEAD>

………

</HEAD>

<BODY>

….…… ‘網頁主文

<%

……….. ‘展示資料 ASP 程序 %>

</BODY>

</HTML>

<%

……….. ‘資料處理 ASP 副程式

%>

圖 3.1ASP 程式架構示意圖 其中

公用程序:它是一個外部獨立檔案,可供一個以上之網頁程式共同使用之副程 式。公用程序之引入方式必須合乎下列語法,

„ 在<Html>標記之前

„ 前後以 <!-- #include 及 -->夾住

„ 以 virtual或file指定程序檔之來源路徑 ↑H

(3)

„ 程序檔必須是完整檔名及對應路徑

前置處理程序:用來承接其它網頁傳送之資料、擷取對話變數(SESSION),或是 處理當下網頁程式之內含表單輸入資料。

展示資料程序:用來擷取資料庫資料並予以轉換為網頁文稿。

副程式:支援展示資料 ASP 程序之副程式,若展示資料 ASP 程序需重覆出現在 許多段落時,可予以抽出並給與一個獨立的副程式名稱。

<….>:以角括符夾住關鍵字之段落為 HTML 網頁文稿。

前述各段落之 ASP 程序可視情況予以缺設,也可以同時都出現。

3.1.2 ASP 語言

目前可用來執行主控端動態網頁的語言有 Java、JavaScript、Jscript、

VBScript 等,用來執行主控端動態網頁的語言有 PHP、JSP、ASP 等。ASP 為 Microsoft 的 WEB 伺服器-IIS 所提供的網頁程式執行環境,讓使用者 可以運用<%與%>標籤將 Script 撰寫之程式碼嵌入 HTML 文件。ASP 預設 支援的 Script 語言有 VBScript 和 Jscript,本書使用 VBScript 來介紹所有操 作資料庫之網頁程式。

3.1.3 ASP 程式開發工具

由於 ASP 程式是一個純文字檔,任何文字編輯器,例如 NotePad,均 可用來撰寫網頁程式。此外,Office 家族成員-Microsoft Script Editor、

FrontPage 等,則為專用的網頁程式編輯器,本書提供的範例程式都是使用 FrontPage 設計而成。FrontPage 的操作非常簡易,初學者很容易自行學習,

建議讀者可以使用 FrontPage 來閱讀範例程式。

3.2 ASP 指令語法

3.2.1 標記

編輯 ASP 程式碼時,指令無論置於何處,指令碼必須以“<%”前導,

以及以“%>”結束,基本格式如下:

9 單行指令

<% ASP 程式碼 %>

9 多行指令

<%

ASP 程式碼 ASP 程式碼……

%> ↑H

(4)

ASP 程式預設在伺服端執行,若需指定在主控端處理,則標記符號必 須改為下列格式:

<Script Language=VBscript>

ASP 程式碼

</Script>

3.2.2 變數宣告

ASP 程式變數係採弱型別,可不經宣告就直接給值。資料型別只有一 種 -Variant,而 Variant 型別可以儲存數種不同的資料,包括 Empty、Null、

Boolean、Byte、Integer、Long、Single、Double、Date、String、Object 及 Error。一個運算式之輸出結果,其型別取決於運算當時之狀況,應用系統 會自動轉換至適當型別。變數名稱不得與 VBscript 關鍵字同名。

變數宣告方式可採明確宣告,或採模糊宣告,指令如下:

明確宣告 Dim A A = 10

模糊宣告-直接給值 A = 10

3.2.3 輸出資料 9 輸出一般資料

ASP 程式使用 Response 物件之 Write 方法來輸出資料,常用的指令形 式如下:

Response.Write “欲輸出之字串”

Response.Write 變數 Response.Write 運算式

字串可由一般文字及 HTML 標記組合而成,而變數或運算式也可以和 HTML 標記組合使用。

9 移轉網頁

若需要從工作中之網頁轉移至其它網頁,可使用下列指令:

Response.Redirect “目的網頁”

此道指令必需置於<HTML>標記前。

9 中斷網頁輸出

若要強制中斷後續資料之輸出,可使用下列指令:

Response.End

9 強制輸出緩充區資料

Response.Flush ↑H

(5)

輸出網頁資料時,事前可使用 Response.Buffer = True 指令將資料寫入 緩充區,此道指令必需置於<HTML>標記前。

9 檢查主控端是否正常連線 Response.IsClientConnected

輸出網頁資料時,可利用此道指令來檢查主控端是否正常連線,回傳結 果為 True 時,表示主控端仍正常連線。

3.2.4 輸入資料

在 ASP 環境下,資料輸入必須透過內含輸入表單之網頁程式來處理。

輸入表單之基本樣式如圖 3.2,範例程式請參閱本書所附之應用程式。

<Body>

<Form Action =擷取表單資料程式 Method=[Post|Get] Name=表單名稱>

[輸入項提示文字] <Input Type=控制項型式 Name=控制項名稱 Value=

預設值>

………..

<其它控制項>

<Input Type=Submit Name=控制項名稱 Value= “送出”>

<Input Type=Reset Name=控制項名稱 Value= “清除”>

</Form>

圖 3.2 輸入表單基本樣式

輸入表單之主要構成要素及用途簡述如下,讀者若要了解各控制項之 詳細用法與語法,請參閱本書之範例程式。

<Form>…</Form>:宣告輸出網頁內含輸入表單,表單則由 Action、Method 和 Name 三個基本成員所組成,此外還有其它資料處理方法。

Action:指定擷取表單資料之處理程式,此程式可以是原網頁程式,也可以是 另外的 ASP 程式。

Method:指定傳遞輸入表單資料之方法,可選用“Post”或“Get”。

Name:指定輸入表單之名稱。

Input:在表單內佈置一個輸入控制項,可使用 Type 來指定輸入控制項 之形式,可依需要指定下列形式:

Text:文字方塊

Password:密碼型文字方塊 Radio:選擇鈕

Check:核取方塊 ↑H

(6)

Hidden:隱藏型文字方塊

Submit:將輸入資料傳送出去(表單必備控制項)

Reset:將輸入資料清除

其它控制項:除 Input 型式之控制項外,尚有下列兩種控制項:

Textarea:多行文字方塊 Select:下拉式清單方塊 3.2.5 讀取表單資料

擷取資料之指令如下:

9 存入變數

變數 = Request(“輸入表單控制項名稱”) 9 直接置入網頁

<% = Request(“輸入表單控制項名稱”) %>

擷取表單資料之程式若為原網頁程式,則擷取指令須置於前置處理段,若為 其它程式則無限制。

3.2.6 網頁間資料傳遞方法

在資料處理過程,若需要在不同網頁程式間傳遞資料,可使用下列三 種方式:

9 Application、Session 或 Cookie 物件 9 以 URL 傳送

9 使用隱藏式文字方塊

Application 物件適用所有連線在同一虛擬目錄下之不同程式,Session 和 Cookie 物件則適用同一連線在同一虛擬目錄下之不同程式。Application 和 Session 物件係將變數存在伺服端記憶體,而 Cookie 則儲存在主控端之 硬碟。至於變數之生命週期,Application 物件與 WEB 應用程式同進退,

Session 物件預設為二十分鐘,而 Cookie 物件則與瀏覽器同進退。應用範 例請參閱本書所附之範例程式。

前述物件之應用指令語法說明如下:

9 建立物件或重新給值

Application(“變數名稱”) = 值 Session(“變數名稱”) = 值

Response.Cookies (“變數名稱”) = 值 9 取用變數值

變數 = Application(“變數名稱”) 變數 = Session(“變數名稱”)

變數 = Request.Cookies (“變數名稱”) ↑H

(7)

除了使用上述物件來傳遞資料外,也可直接透過 URL 來傳送資料,指 令語法如下:

HTML 格式

<A Href= “目的程式?變數名稱 = 值”>提示文字</A>

ASP 格式

<% Response.Redirect “目的程式?變數名稱=” & 變數 %>

若傳遞變數超過一個或以上時,變數間須以“&”串接,指令如下:

<A Href= “目的程式?變數 1 = 1&變數 2 =值 2”>提示文字</A>

或是

<% Response.Redirect “目的程式?變數 1 =值 1&變數 2 =值 2” %>

在目的程式則以 Request(“變數”)來取得傳遞資料。

此外,也可以使用隱藏型文字方塊來傳遞資料,應用範例如下:

<INPUT Type=Hidden Value=<% =Page %> Name="_recNO">

3.2.7 Server 物件

常用的 Server 物件指令簡述如下:

9 MapPath:傳回虛擬目錄

範例 1:Server.MapPath(“/MySQL/ASP/EasyDoMySQL.mde”)

說明:取得虛擬目錄之根目錄,然後與指定之檔案字串串接在一起。

範例 2:Server.MapPath(“../”) 說明:取得工作網頁之父目錄。

範例 3:Server.MapPath(“./”) 說明:取得工作網頁之目錄。

9 ServerVariables:傳回伺服器對應信息

範例:showNewRec = Request.ServerVariables("PATH_INFO") 說明:此指令可取出工作網頁程式名稱及目錄。

3.2.8 檔案操作 9 建立檔案物件

指令語法:

Set 檔案系統物件 = Server.CreateObject(“Scripting.FileSystemObject”) 9 建立檔案

指令語法:

Set 檔案變數 =檔案系統物件.CreateTextFile(檔案及路徑名稱[,是否覆 寫[,檔案格式]])

說明: ↑H

(8)

是否覆寫:可傳入 True 或 False,預設值為 False。

檔案格式:傳入 True 表 Unicode,False 表 ASCII,預設值為 True。

9 刪除檔案 指令語法:

檔案系統物件.DeleteFile(檔案及路徑名稱[,移除唯讀檔]) 說明:

移除唯讀檔:指定檔案數屬性為唯讀時,是否仍刪除,傳入 True 表要 刪除,False 表不刪除。

9 檢查檔案是否存在 指令語法:

檔案系統物件.Fileexists(檔案及路徑名稱) 說明:

傳回 True 表檔案已存在,False 表不存在。

9 開啟檔案 指令語法:

Set 檔案變數 =檔案系統物件.OpenTextFile(檔案及路徑名稱[,輸出入 模式[,建立新檔[,開啟格式]]])

說明:

輸出入模式:傳入 1 表唯讀(預設值),2 表唯寫(覆寫舊檔),3 表 資料加在檔案末尾。

建立新檔:檔案存在時,是否覆寫,傳入 True 表要覆寫,預設值為 False。

開啟格式:傳入 1 表 ASCII(預設值),傳入-1 表 Unicode,傳入-2 表 以原格式開啟。

9 檢查檔案結尾 指令語法:

檔案變數.atEndOfStream 說明:

傳回 True 表已至檔案末尾。

9 讀取指定字元數 指令語法:

檔案變數.Read(N) 說明:

傳入數值 N 表要讀取之字元數。

9 讀取一行 指令語法:

檔案變數.ReadLine ↑H

(9)

說明:

從檔案指標處開始,讀取該行之所有字元。

9 讀取檔案全部字元 指令語法:

檔案變數.ReadAll 說明:

將整個檔案內容讀出。

9 略過 N 個字元不讀取 指令語法:

檔案變數.Skip(N) 說明:

傳入數值 N 表要忽略之字元數。

9 略過一行不讀取 指令語法:

檔案變數.SkipLine 說明:

略過檔案指標處之整行字元。

9 寫入字串 指令語法:

檔案變數.Write(字串) 說明:

將傳入之字串寫入檔案。

9 寫入一行 指令語法:

檔案變數.WriteLine(字串) 說明:

將傳入之字串以獨立行形式寫入檔案。

3.3 資料庫處理程式

3.3.1 資料庫連線 連線指令:

宣告連線物件 Dim con

產生連線物件 ↑H

(10)

Set con= Server.CreateObject("ADODB.Connection") 9 MySQL 連線字串

cn_str = "Driver= {MySQL ODBC 3.51 Driver}; Server=主機;User=帳號;

Password=密碼;Database=MySQL 資料庫; Option= " & 1 + 2 + 8 + 32 + 16384

9 Access 連線字串

cn_str = "Provider = Microsoft.Jet.OLEDB.4.0; "

cn_str = cn_str & " Data Source=" & Server.MapPath(Access 資料庫) &

";Jet OLEDB:Database Password=密碼"

con.ConnectionString = cn_str con.Open

說明 1:連線時需使用 Server 物件之 CreateObject 方法來建立連線物件。

說明 2:欲連線之主機、資料庫及登入帳號和密碼,可以使用專用登入表 單來取得,然後將它們存入 SESSION 物件內備用。當要連線時,

即可從 SESSION 物件取出,再將它們組合在連線字串內。

3.3.2 開啟紀錄集 指令語法:

Dim adRs

Set con = openCon(連線資料庫)

Set adRs = Server.CreateObject("ADODB.Recordset") adRs.Open SQL 指令集, con, 3, 2

說明:連線時需使用 Server 物件之 CreateObject 方法來建立紀錄集物件。

3.3.3 紀錄操作 9 MySQL 資料庫

在 ASP 環境下,紀錄之操作方式均需使用 ADO 物件及方法,使用方 法除下述幾點不同外,其餘都與 Access 應用環境大同小異。

„ 無法離線作業。

„ 使用 Update 方法來更新紀錄。

„ 無法使用 RecordCount 方法來取得紀錄筆數,請改用下例程式計算紀 錄筆數:

str = “Select count(*) From 資料表 Where 過濾條件”

adRs.Open str, con, 3, 2 取出紀錄總數

n = adRs(0)

關閉物件 ↑H

(11)

adRs.Close

Set adRs = Nothing 9 Access 資料庫

在 ASP 環境下,Access 資料庫之紀錄操作方法完全與 Access 應用環 境相同。

3.3.4 輸出資料

將資料表紀錄輸出成網頁,處理方式如下述程序:

9 純文字形式-一次送出全部紀錄 1. 前置處理

宣告物件(必須宣告)

Dim con Dim rs1

If Session("strSQL") = Empty Then Response.Write "無 SQL 指令!"

Response.End End If

取出工作資料庫

WKDB = Session("WKDB") 取出來原資料 SQL

strSQL=Session("strSQL") 開啟紀錄集

Set rs1=openRs(WKDB, strSQL,1) 釋放握濾條件

rs1.Filter = ""

取出資料表名(副程式)

tbl = getTable(strSQL , "NOJ" ) 計算紀錄總數(副程式)

tREC = getRecNo(rs1,1) 設定啟始紀錄序

intPage=1

2. 送出製作表格指令

Response.Write "<CENTER><TABLE BORDER=1 cellspacing = 0 cellpadding = 0 >"

3. 填入欄位抬頭

For i=0 to adRs.Fields.Count-1 ↑H

(12)

Response.WRITE "<TD> <FONT Size=2 > " & adRs(i).Name &

"</FONT></TD>"

Next

Response.Write "</TR>"

4. 輸出紀錄

odd = True ‘用於標示間格列之題示顏色 Do While Not adfRs.EOF

以下程式處理相臨紀錄以不同顏色顯示 If odd = True Then

Response.Write "<TR bgcolor=White>"

Else

Response.Write "<TR bgcolor=LightGreen>"

End if

以下程式送出每一筆紀錄

For i=0 To adRs.Fields.Count -1

Response.WRITE "<TD align=right> <FONT Size=2 > " & adRs(i) &

"</FONT></TD>"

Next

Response.Write "</TR>"

odd = Not odd ‘變換顏色 adRs.MoveNext ‘移至次筆 Loop

5. 完成表格製作

Response.Write "</TABLE></CENTER>"

9 純文字形式-一次送出一頁 1. 前置處理:與輸出全部紀錄類似 2. 提示要輸出資料之頁次按鈕

<% showNewRec = Request.ServerVariables("PATH_INFO") %>

取得當下之網址及工作網頁名稱

<FORM Action=<%=showNewRec%> Method=GET>

點取頁次後,以指定之網頁來展示資料

<table><tr>

<td> <Font Color="#0000FF">[<%=tbl%>]紀錄瀏覽 </Font> </td> ↑H

(13)

如果不是位於第一頁

<%If Page <> 1 Then %>

<td> <A HREF=<%=showNewRec%>?Page=1><FONT Size=3 >首頁

</FONT></A> </td>

<td> <A HREF=<%=showNewRec%>?Page=<%=(Page-1)%>><FONT Size=3 >前頁</FONT></A> </td>

<%End If

如果不是位於最後一頁 If Page <> tPage Then

%>

<td> <A HREF=<%=showNewRec%>?Page=<%=(Page+1)%>><FONT Size=3 >次頁</FONT></A> </td>

<td> <A HREF=<%=showNewRec%>?Page=<%=tPage%>><FONT Size=3

>末頁</FONT></A> </td>

<%End If%>

<td> <A HREF=<%=showNewRec%>?Page=0><FONT Size=3 >全部

</FONT></A> </td>

<td> <FONT Size=3 >輸入頁次:</FONT> </td>

<td> <INPUT TYPE=TEXT Name=Page SIZE=3> </td>

<td> <FONT Size=3 >頁次:</FONT> <FONT COLOR ="Red"> <%

=Page%>/<%=tPage%></FONT> </td>

</tr>

</table>

</FORM>

3. 移動紀錄指標至目的頁次的第一筆 取出每頁筆數預設值

pgRec = Session("PageSize") 目的頁次大於 0 時

If intPage > 0 Then

adRs.Move (intPage - 1) * pgRec Else

目的頁次小於 0 則強制移至首頁 If Not adRs.EOF Then adRs.Move 0 End If

4. 送出製作表格指令

Response.Write "<CENTER><TABLE BORDER=1 cellspacing = 0

cellpadding = 0 >" ↑H

(14)

5. 填入欄位抬頭

For i=0 to adRs.Fields.Count-1

Response.WRITE "<TD> <FONT Size=2 > " & adRs(i).Name &

"</FONT></TD>"

Next

Response.Write "</TR>"

6. 輸出紀錄 odd = True For j = 1 to pgRec

If fRs.EOF then Exit For

end if

相臨紀錄以不同顏色顯示 If odd = True Then

Response.Write "<TR bgcolor=White>"

Else

Response.Write "<TR bgcolor=LightGreen>"

End if

以下程式送出每一筆紀錄 For i=0 To adRs.Fields.Count -1

Response.WRITE "<TD align=right> <FONT Size=2 > " & adRs(i) &

"</FONT></TD>"

Next

Response.Write "</TR>"

odd = Not odd ‘變換顏色 adRs.MoveNext ‘移至次筆 Next

7. 完成表格製作

Response.Write "</TABLE></CENTER>"

9 輸入表單形式 -一次送出一筆 1. 前置處理:與輸出全部紀錄類似 2. 製作輸入表單及輸出資料

<Table> <TABLE BORDER=1 cellspacing = 0 cellpadding = 0>

搭配表格型式製作表單

<td>

<FORM Action = upData.asp Method=Post name=Form2> ↑H

(15)

‘製作表單,upData.asp 為新增資料處理程式

<CENTER>

<font color="#0000FF">[<%=fTbl%>] </font> ‘fTbl:資料表名稱 以隱藏型文字方塊記錄當下之紀錄指標

<INPUT Type=Hidden Value=<%=Page%> Name="_recNO">

</td>

<%

If not adRs.eof then adRs.Move Page fld=adRs.Fields.Count-1

vl = ""

逐列提示每個欄位抬頭、製作輸入方塊及提示資料 For i= 0 To fld

Response.Write "<TR Height =15>"

Response.Write "<TD bgcolor=LightBlue> <FONT Size=2 >" &

adRs(i).Name & "</FONT></TD>"

If Not rs1.EOF Then vl = rs1(i)

Btn = "<INPUT Type=Text Value='" & vl & "' Name =" &

adRs(i).Name & " Size =" & setColwidth(adrs, i, 2 ) & ">"

‘setColwidth(adrs, i, 2 )為計算欄位寬度副程式

Response.Write "<TD> <FONT Size=2 >" & Btn & "</FONT></TD>"

Response.Write "</TR>"

Next

%>

<TR align = center>

<%

Btn = "<INPUT Type=Submit Value=""更新"" Name=Upd>"

Response.Write "<TD bgcolor=Red>" & Btn & "</TD>"

%>

以下程式製作下拉型資料處理方式 <TD>更新方式

<select name =_mdType size=1>

<option value ="Mod" selected>修改</option>

<option value ="Del" >刪除</option>

<option value ="Add" >新增</option>

</select></TD></TR>

</FORM>

</TABLE></CENTER> ↑H

(16)

3. 提示移動紀錄按鈕

<FORM Action=<%=showNewRec%> Method=GET name=Form1>

如果不是位於第一筆

<%If Page <> 0 Then%>

<A HREF=<%=showNewRec%>?Page=0>首筆</A>

<A HREF=<%=showNewRec%>?Page=<%=(Page-1)%>>前筆</A>

<%End If

如果不是位於最後一筆 If Page <> tREC Then

%>

<A HREF=<%=showNewRec%>?Page=<%=(Page+1)%>>次筆</A>

<A HREF=<%=showNewRec%>?Page=<%=(tREC-1)%>>末筆</A>

<%End If%>

輸入紀錄序:<INPUT TYPE=TEXT Name=Page SIZE=3>

紀錄序:<FONT COLOR="Red"><%=(Page)%>/<%=(tREC-1)%></FONT>

</FORM>

4. 新增紀錄(取至 upData.asp 片段程式)

製作 SQL 指令

strSQL = “Insert Into “ & Session(“TBL1”) & “(”

以下程式用於截取欄名

For i =0 To adRs.Fields.Count-1 strSQL = strSQL & adRs(i).Name

If i < adRs.Fields.Count-1 Then strSQL = strSQL & “,”

Next

strSQL = strSQL & “) Value (”

以下程式用於截取欄值

For i =0 To adRs.Fields.Count-1 na = adRs(i).Name

取出輸入表單欄位資料 vl =Request(na)

If isValue(adRs(i).Type) Then ‘isValue():檢查欄位型態副程式 strSQL = strSQL & vl

Else

strSQL = strSQL & “’” & vl & “’”

End If

If i < adRs.Fields.Count-1 Then strSQL = strSQL & “,” ↑H

(17)

Next

strSQL = strSQL & “);”

資料寫回資料庫 con.Execute strSQL 3.3.5 查閱資料-依鍵值

設計技巧簡述如下:

1. 前置處理:開啟紀錄集,取出鍵值欄。

2. 製作鍵值輸入表單。

3. 輸入鍵值,點取傳送按鈕,將表單資料傳送給當下網頁。

4. 取出鍵值並過濾資料。

kstr=””

na = Request(KFL1) ‘取出第一個鍵值方塊資料 If Not na = Empty Then

If isValue(rs1(KFL1).Type) Or isBool(rs1(KFL1).Type) Then isValue、isBool 及 isDate 為筆者自行撰寫之函數

組合過濾條件

kstr = KFL1 & " =" & na Else

If isDate(rs1(KFL1).Type) Then kstr = KFL1 & " =#" & na & "#"

Else

If KFL2 = Empty Then

kstr = KFL1 & " Like '" & na & "%'" '允許類似查詢 Else

kstr = KFL1 & " = '" & na & "'"

End If End If End If End If

若有第二鍵值欄,則取出第二鍵值 If Session("KFL2") <> Empty Then na=Request(KFL2)

If Not na = Empty Then

If isValue(rs1(KFL2).Type) Or isBool(rs1(KFL2).Type) Then

kstr = kstr & " And " & KFL2 & " =" & na ↑H

(18)

Else

If isDate(rs1(KFL2).Type) Then

kstr = kstr & " And " & KFL2 & " =#" & na & "#"

Else

kstr = kstr & " And " & KFL2 & " = '" & na & "'"

End If End If End If End If

將雙引號改為單引號

kstr =Replace(kstr, Chr(34), "'") 取消前次過濾條件

adRs.Filter = ""

過濾資料

If kstr <> "" Then adRs.Filter = kstr 5. 輸出合乎鍵值之全部資料。

3.3.6 查閱資料-指定紀錄序 設計技巧簡述如下:

1. 設定 SQL 指令:Select 欄位串列 From 資料表 Where 過濾條件 Limit fn, rn,其中

fn:起始紀錄序(紀錄序從 0 起算),

rn:取出紀錄筆數。

2. 其餘設計技巧與依鍵值查閱紀錄相同。

3.3.7 刪除資料-依鍵值 設計技巧簡述如下:

1. 前置處理:開啟紀錄集,取出鍵值欄。

2. 製作鍵值輸入表單。

3. 輸入鍵值,點取傳送按鈕,將表單資料傳送給當下網頁。

4. 取出鍵值並過濾資料。

5. 將合乎鍵值之全部資料刪除,若有關聯資料表,將先刪除子表資料,然 後刪除主表資料。刪除指令如下:

dstr = "Delete From " & 資料表名 & " Where " & kstr

con.Execute dstr ↑H

(19)

3.3.8 更新資料-依鍵值 設計技巧簡述如下:

1. 前置處理:開啟紀錄集。

2. 製作鍵值欄及修改欄選擇表單。

範例程式如下:

<Form action =更新資料程式.asp method = post name = "Form1">

<input type = hidden name=wkType value=<%=wktype%>>

<table border=1><tr align=center bgcolor=yellow></font><td>比對欄位

</td><td>更新欄位</td></tr>

<tr>

<%

以下程式設定比對欄位 For fi =0 To 1

Response.Write "<td> <table border=1> <tr bgcolor =lightblue><td>欄名

</td><td >別名</td><td >選取</td></tr>"

odd= True

For i =0 To adRs.Fields.Count-1 If fi =0 Then

fna = "K_" & adrs(i).Name Else

fna = adRs(i).Name End If

If odd =True Then

Response.Write "<tr bgcolor=lightgreen>"

Else

Response.Write "<tr bgcolor =white>"

End If

以核取方塊製作表單

Btn = "<td>" & adRs(i).Name & "</td><td>" & fna &

"</td><td><Input Type = Checkbox Name =" & fna & "></td></tr>"

Response.Write Btn odd = Not odd Next

Response.Write "</table></td>"

Next

%>

</tr> ↑H

(20)

<tr align =center><TD><Input Type =submit Value =確認 name = submit></TD>

<TD><Input Type =Reset Value =重設 name = reset></TD></TR>

</Table> </form></center>

3. 選取鍵值欄及修改欄(可複選),點取傳送按鈕,將選取資料傳送給更 新資料程式。

取出比對鍵值欄位 upkFld = ""

逐欄比對是否被選取為鍵值欄 For i = 0 To adRs.Fields.Count-1 na= "K_" & adRs(i).Name

If Request(na) <> Empty Then If upkFld = "" Then

upkFld = adRs(i).Name Else

upkFld = upkFld & ", " & adRs(i).Name End If

End If Next

設定修改欄位 upFld = ""

逐欄比對是否被選取為修改欄 For i = 0 To adRs.Fields.Count-1 na= adRs(i).Name

If Request(na) <> Empty Then If upFld = "" Then

upFld = adRs(i).Name Else

upFld = upFld & ", " &adrs(i).Name End If

End If Next

將選定欄位記錄在 Session 物件 If upFld <> "" Then

Session("UPKFLD") = upkFld

Session("UPFLD") = upFld ↑H

(21)

將工作網頁轉至修改資料表單網頁

Response.Redirect "updaByKey.asp?wkType=" & wkType End If

4. 製作修改資料表單。

<FORM Action=更新資料程式.asp Method=Post name = Form2>

<Center>

以下程式以隱藏型文字方塊儲存欄位設定資料

<INPUT Type=Hidden Value=<%=wkType%> Name="wkType">

<INPUT Type=Hidden Value=<%=upkFld%> Name="upkfld">

<INPUT Type=Hidden Value=<%=upFld%> Name="upfld">

<TABLE BORDER=1 cellspacing = 0 cellpadding = 0>

<%

If wkType = "Key" Or wkType = "All" Then fld=adRs.Fields.Count-1

Response.Write "<TR Height =15> <TD bgcolor=LightBlue><FONT Size=2 >鍵值</FONT></TD>"

提示鍵值欄抬頭

If upkFld <> Empty Then

For ki =0 To UBound(kfld) ‘kfld 鍵值欄位串列 na = Trim(Lcase(kfld(ki)))

For i= 0 To fld

If Lcase(adRs (i).Name) = na Then

Response.Write "<TD bgcolor=LightBlue> <FONT Size=2 >" &

adRs (i).Name & "</FONT></TD>"

End If Next Next End If </TR>"

Response.Write "<TR Height =15 bgcolor=LightBlue> <TD bgcolor=LightBlue><FONT Size=2 >設定</FONT></TD>"

製作輸入方塊

If upkFld <> Empty Then

For ki =0 To UBound(kfld) ↑H

(22)

na = Trim(Lcase(kfld(ki)))

以下程式以文字方塊製作鍵值欄位 For i =0 to fld

If Lcase(adRs(i).Name) = na Then

Response.Write "<TD><Input Type =Text Name =K_" & na & "

Size =" & setColwidth(adRs, i, 2 ) & "></Td>"

End If Next Next End If

Btn = "<TD bgcolor=LightBlue><Select Name =Kall Size =1><Option Value=No Selected> No</Option>"

Btn =Btn & "<Option Value=Yes> Yes </Option>

</Select></TD></TR></Table><Table border=1>"

Response.Write Btn

Response.Write "<TR Height =15 bgcolor=LightBlue><td>更新</td>"

For ki =0 To UBound(ufld) ‘ufld 修改欄位串列 na = Trim(Lcase(ufld(ki)))

提示修改欄位 For i= 0 To fld

If Lcase(adRs(i).Name) = na Then

Response.Write "<TD > <FONT Size=2 >" & adRs(i).Name &

"</FONT></TD>"

End If Next Next

Response.Write "<TR bgcolor=LightBlue><td bgcolor =red><input Type

= submit Name =Upd Value =執行></td>"

For ki =0 To UBound(ufld) na =Trim( Lcase(ufld(ki)))

以下程式以文字方塊製作修改欄位 For i =0 to fld

If Lcase(adRs(i).Name) = na Then

Response.Write "<TD><Input Type =Text Name =" & na & " Size ="

& setColwidth(adRs, i, 2 ) & "></Td>"

End If ↑H

(23)

Next Next

Response.Write "</TR></Table>"

End If

%>

</FORM>

4. 輸入鍵值及修改資料。

5. 按 下 確 認 按 鈕 , 取 出 鍵 值 及 修 改 資 料 , 然 後 將 合 乎 鍵 值 之 資 料 予 以 修 改,程式範例如下:

excSQL = ""

If wkType = "Key" Or wkType = "All" Then 組合修改 SQL 指令

excSQL = "Update " & tbl & " Set "

逐欄取出修改資料

For ki =0 To Ubound(ufld) na= Trim(ufld(ki)) vl = Request(na)

If ki > 0 Then excSQL = excSQL & ", "

If isValue(rs1(na).Type) Or isBool(rs1(na).Type) Then excSQL = excSQL & na & " = " & vl

Else

If isDate(rs1(na).Type) Then

excSQL = excSQL & na & " = #" & vl & "#"

Else

If vl=Empty Then vl =Null '空字串原資料欄可不輸入資料 excSQL = excSQL & na & " = '" & vl & "'"

End If End If Next End If

If kstr <> "" Then 加入過濾條件

excSQL = excSQL & " Where " & kstr 修改資料

con.Execute excSQL

End If ↑H

(24)

3.3.9 郵寄資料-一般郵件 設計技巧簡述如下:

1. 前置處理:取出寄信伺服器及寄件人。

If Request.Cookies("mlServer") <> Empty Then mlServer = Request.Cookies("mlServer")

If Request.Cookies("mlFrom") <> Empty Then mlFrom = Request.Cookies("mlFrom")

2. 製作郵件輸入表單。

<form method="POST" action="SendMlSub.asp?wkType=<% =wkType

%>">

<input type="hidden" name="wkType" value=<% =wkType%>>

<table>

<% If wkType="Slf" Then %>

<tr><td><font size="2">收件人 </font> <input type="text" size="80"

name="mlTo"></td></tr>

<tr><td><font size="2">副本 </font> <input type="text" size="82"

name="mlCc"></td></tr>

<% End If %>

<% If wkType ="Bat" Then %>

<tr><td><font size="2">群組名稱 </font> <input type="text" size="80"

name="mlTo"></td></tr>

<% End If %>

<tr><td><font size="2">寄信伺服器 </font> <input type="text"

size="77" name="mlServer" Value=<% =mlServer%>></td></tr>

<tr><td><font size="2">寄件人 </font> <input type="text" size="80"

name="mlFrom" value= <% =mlFrom%> ></td></tr>

<tr><td><font size="2">主旨 </font> <input type="text"

name="Subject" size="82"></td> </tr>

</table>

<table>

<tr><td valign=top><font size="2">本文</font></td><td><textarea rows="12" name="mlMsg" cols="80"></textarea></td></tr>

</table>

<table><tr><td><font size="2">附件 1</font><input type="file"

name="File1" size="30"></td>

<td><font size="2">2</font><input type="file" name="File2"

size="30"></td> ↑H

(25)

</tr></table>

<table><tr>

<td><input type="submit" value="傳送" name="B1"></td>

<td><input type="reset" value="重新設定" name="B2"></td></tr>

</table>

</form>

3. 輸入郵件資料,點取傳送鈕,啟動寄信程式。

4. 取出郵件資料

mlServer = Request("mlServer") mlFrom = Request("mlFrom")

Response.Cookies("mlServer") = mlServer Response.Cookies("mlFrom") = mlFrom mlSendUsing = 2

ath1 =""

ath2=""

mlTo = Request("mlTo") mlCc = Request("mlCc")

If Instr(mlTo, "@") =0 Then mlByTbl=1 If mlCc <> "" Then mlTo = mlTo & ", " & mlCc Subject = Request("Subject")

mlMsg = Request("mlMsg") 5. 設定郵件伺服器屬性

建立郵遞物件

Set conf = Server.CreateObject("CDO.Configuration") 建立郵件欄位

Set Flds = conf.Fields 設定郵件欄位及屬性

Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = mlServer

Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = mlSendusing

Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectio ntimeout") = 10

Flds.Update

↑H

(26)

建立郵件信息物件

Set msg = Server.CreateObject("CDO.Message")

‘郵件信息物件加入郵遞物件 Set msg.Configuration = conf 設定信息物件屬性

msg.From = mlFrom msg.Subject = Subject msg.TextBody = mlMsg ath1 =""

ath2 =""

取出附加檔 1

ath1 =Request("File1") 取出附加檔 2

ath2 =Request("File2") 設定收信人

msg.To = mlTo

加入附加檔 1 及/或附加檔 2

If ath1 <>"" Then msg.AddAttachment ath1 If ath2 <>"" Then msg.AddAttachment ath2 5. 傳送郵件

msg.Send

註:若要傳送資料表內含紀錄,事前可將資料表匯出為文字檔,然後以附 加檔傳送。

3.4 將 ASP 程式碼封裝成 DLL

由於 ASP 程式不論是在伺服端或主控端執行,都是以明碼之 Script 格式呈現,惡意聯網人員可以輕易得知原始程式,因而遭受到無謂之入侵 和破壞。為提高程式之隱密性和安全性,可將 ASP 程式封裝成 DLL 格式。

3.4.1 設計要點

以下詳細介紹 DLL 之製作程序與技巧。

1. 啟動VB應用程式。 ↑H

(27)

2. 點選應用系統格式-Active DLL。

3. 開啟系統設計介面

系統自動產生一個名稱為 Class1 之類別模組,專案名稱預設為 Project1,可將 Class1 和 Project1 改名為適當名稱。

4. 點取主功能表“Project”之 “References”子功能,開啟物件參照選單,請 選入下列物件:

¾ Microsoft Active Server Pages Object Library

¾ Microsoft Active Data Objects 2.8 Library

¾ Microsoft ADO Ext. 2.8 for DLL & Security

¾ Microsoft Active Server Pages ObjectContext Object Library

¾ COM+ Services TypeLibrary 5. 在 Class1 開頭加入下列指令:

Public ObjectContext As ObjectContext

Public Application As ASPTypeLibrary.Application Public Server As ASPTypeLibrary.Server

Public Session As ASPTypeLibrary.Session Public Response As ASPTypeLibrary.Response Public Request As ASPTypeLibrary.Request

註:以上變數為 ASP 程式與 DLL 程式溝通之介面。

6. 在 Class1 加入下列兩個事件程序:

啟動 DLL 程式時,執行前置處理程序 Private Sub Class_Initialize()

On Error Resume Next

Set objContext = GetObjectContext

Set Application = objContext.Item("Application") Set Server = objContext.Item("Server")

Set Session = objContext.Item("Session") Set Request = objContext.Item("Request") Set Response = objContext.Item("Response")

‘ 此處可加入其它自定程式碼 End Sub

結束 DLL 程式時,清除系統變數 Private Sub Class_Terminate() On Error Resume Next

‘ 此處可加入其它自定程式碼

Set Application = Nothing ↑H

(28)

Set Server = Nothing Set Session = Nothing Set Request = Nothing Set Response = Nothing Set objContext = Nothing End Sub

7. 在類別內加入屬性欄位,做為 ASP 與 DLL 存取資料之溝通欄位。

讀取資料欄:

Public Property Get 欄位名稱() As 資料型態 欄位名稱= 系統變數

End Property 寫入資料欄:

Public Property Let 欄位名稱(ByVal 接收變數 As 資料型態) 系統變數=接收變數

End Property

8. 若有需要,可依步驟 6 與 7 加入其它類別。

9. 存檔。

10. 點取主功能表“File”之 “Make *.dll”功能,將專案編譯成 DLL 檔。

11. 將 DLL 檔註冊:點取桌面之【開始】、【執行】,在輸入方塊內輸入 左列指令:regsvr32 DLL 檔所在目錄及檔名,例如,

Regsvr32 D:\Mysql\ASP\AspDoMysql.dll 3.4.2 引用 DLL 檔

在原 ASP 程式,將原來以 <% ……%>之程式碼移除,改以下列指令 取代:

<%

Dim AspObj

Set AspObj = Server.CreateObject(“AspDoMysql.Class1”) 其中 AspDoMysql 為自行開發之 DLL 檔,Class1 為類別名稱 傳入預設參數給 DLL 檔

AspObj .欄位名稱 = 傳入值 執行 DLL 檔內之特定程序 AspObj .程序名稱 傳入參數

↑H

(29)

取回 DLL 檔處理結果 變數 = AspObj .欄位名稱 清除物件及收回記憶體 Set AspObj = Nothing

%>

3.4.3 應用範例

在此以顯示 Customer 資料表內容為例,分別展示以 ASP 程式碼與 DLL 指令之異同處。

3.4.3.1 原來 ASP 使用之程式碼 連線

Dim Con Dim Rs

Set Con= Server.CreateObject("ADODB.Connection")

cn_str = "Driver={MySQL ODBC 3.51 Driver}; Server=主機位址; " & _

"User=用戶帳號; Password=連線密碼;" Database=連線資料庫;” & _

“Option= 16437"

Con.ConnectionString = cn_str Con.Open

設定 SQL 指令

Sql = “Select * From Customer”

開啟紀錄集

Set Rs= Server.CreateObject("ADODB.Recordset") Rs.Open Sql, Con, 3, 2

Response.Write "<CENTER><TABLE BORDER=1 cellspacing = 0 cellpadding = 0 >"

Response.Write "<TR BGCOLOR=#00FFFF>"

fld = Rs.Fields.Count-1 提示欄位抬頭

For i=0 to fld

Response.WRITE "<TD><FONT Size=2 > " &Rs(i).Name & "</FONT>

</TD>"

Next ↑H

(30)

Response.Write "</TR>"

提示紀錄

Do While Not Rs.EOF Response.Write "<TR>"

For i=0 to fld

Response.WRITE "<TD><FONT Size=2 > " & Rs(i) & "</FONT></TD>"

Next

Response.Write "</TR>"

Rs.MoveNext Loop

Response.Write "</TABLE></CENTER>"

3.4.3.2 改用 DLL 之程式檔

在 DLL 之類別開頭宣告五個公用變數 Public m_HOST As String

Public m_WKDB As String Public m_USER As String Public m_PSWD As String Public m_SQL As String

在 DLL 之類別內加入五個資料存取欄位

Public Property Let HOST(ByVal str AsString) M_HOST=str

End Property

Public Property Let WKDB(ByVal str AsString) M_WKDB=str

End Property

Public Property Let USER(ByVal str AsString) M_USER=str

End Property

Public Property Let PSWD(ByVal str AsString) M_PSWD=str

End Property

Public Property Let SQL(ByVal str AsString) M_SQL=str

End Property

↑H

(31)

在 DLL 類別內加入一個展示資料程序 showData Private Sub showData()

On Error Resume Next

Dim Con AS New ADODB>Connection Dim Rs New ADODB.Recordset

cn_str = “Driver={MySQL ODBC 3.51 Driver}; Server=” & m_HOST &

“;User=” & m_USER & “; Password=” & m_PSWD & “;” Database=” &

m_WKDB & “;Option= 16437”

Con.ConnectionString = cn_str Con.Open

Rs.Open m_SQL, Con, 3, 2

Response.Write “<CENTER><TABLE BORDER=1 cellspacing = 0 cellpadding = 0 >”

Response.Write “<TR BGCOLOR=#00FFFF>”

fld = Rs.Fields.Count-1 以下程式用於提示欄位抬頭 For i=0 to fld

Response.WRITE “<TD><FONT Size=2 > “ &Rs(i).Name & “</FONT>

</TD>”

Next

Response.Write “</TR>”

以下程式用於輸出資料 Do While Not Rs.EOF Response.Write “<TR>”

For i=0 to fld

Response.WRITE “<TD><FONT Size=2 > “ & Rs(i) &

“</FONT></TD>”

Next

Response.Write “</TR>”

Rs.MoveNext Loop

Response.Write “</TABLE></CENTER>”

Rs.Close

Set Rs = Nothing Con.Close

Set Con = Nothing

(32)

End Sub ↑H 接著將編輯內容存檔,然後重製 DLL 檔(但不需要重新註冊)。

將原 ASP 程式改為下列程式碼:

<%

Set AspObj = Server.CreateObject(“AspDoMysql.Class1”) 傳入引數至 DLL

AspObj.HOST = “LocalHost”

AspObj .WKDB = 資料庫 AspObj .USER = 用戶帳號 AspObj.PSWD = 密碼

AspObj.SQL = “Select * From Customer”

叫用 DLL 方法

AspObj.showData ‘//此程序即可以網頁形式展示紀錄 釋放宣告物件

Set AspObj = Nothing

%>

大功告成!是不是覺得很簡單。請試試你的 DLL 執行結果。DLL 之 能力不只如此而已,請好好發揮你的創意吧!

↑H

(33)

3.5 輸入表單控制項使用說明 3.5.1 文字輸入方塊

語法:<Input Type= "Text" Size = "20" Name = "Comapny" Value = "國立聯 合大學">

3.5.2 密碼輸入方塊

語法:<Input Type= "PassWord" Size = "8" Name = "PassWord" >

3.5.3 多行文字輸入方塊

語法:<TextArea Name = "Memo" Rows = "6" Cols = "40">

文字輸入區 < /TextArea >

3.5.4 下拉式輸入方塊

語法:<Select Name = "Memo" Size = "1">

<Option>選項值 1< /Option >

<Option>選項值 2< /Option >

<Option>選項值 3< /Option >

………

<Option>選項值 n< /Option >

</Select>

3.5.5 多重選擇式下拉輸入方塊

語法:<Select Name = "Memo" Size = "1" Multiple>

<Option>選項值 1< /Option >

<Option>選項值 2< /Option >

<Option>選項值 3< /Option >

………

<Option>選項值 n< /Option >

</Select> ↑H 當選取多個選項值時,可使用下列程式切割各個項目:

City = Request(“City”) Cities = Split(City, ”,”)

For i =0 To Ubound(Cities) ‘// 使用 Cities(i) 取出分項植 Next

(34)

3.5.6 核取方塊

語法:<Input Type= "CheckBoxt" Name = "Start" Value = "On">

當核取此欄時, 傳回值為"On",否則為空字串。

3.5.7 多選一選擇鈕

語法:<Input Type= "Radio" Name = "Blood" Value = "A" Checked>A 應用範例:

<Input Type= "Radio" Name = "Blood" Value = "A" Checked>A

<Input Type= "Radio" Name = "Blood" Value = "B">B

<Input Type= "Radio" Name = "Blood" Value = "AB">AB

<Input Type= "Radio" Name = "Blood" Value = "O">O<P>

↑H

參考文獻

相關文件

在撰寫網頁應用程式 HTML 的語法當中,以下何者錯誤?(A)&lt;a&gt;是用來製作超連結的標記(Tag) (B)HREF 是一個在&lt;a&gt;與&lt;/a&gt;中指定其他

最後特別提出說明,本研究用戶端作業系統為 Win 2000 Professional,伺服 器端作業系統為 Windows 2000 Server 並啟動 Active Directory

使用 MapleTA 做作業,是本課程的主要學習活動之一。今年 4—6 月課程進 行期間,NCUx 學習平臺可以和 Windows 伺服機上面的 MapleTA,以 LTI 介面 進行串接。可是,我們在 9

™ 不過, 如果 DHCP 用戶端不接受 DHCP 伺服器 所提供的參數, 就會廣播一個 DHCP Decline (拒絕) 封包, 告知伺服器不接受所建議的 IP位 址 (或租用期限…等)。然後回到第一階段, 再度

使用人工智慧框架基礎(Frame-based)的架構,這些努力的結果即為後來發展的 DAML+OIL。DAML+OIL 是 Web Resource 中可以用來描述語意的 Ontology 標 記語言,它是以 W3C

例如 : http ( 網頁伺服器所用的協定 ) 定義了 client 如何向 server request 網頁及 server 如何 將網頁及其中的各種內容回傳給 client 。. 提供服務給 application layer

並存入百事可樂企業內部網站的 伺服 並存入百事可樂企業內部網站的 IBM RS/6000 伺服 器資料庫。然後,主管與分析師可以使用上型電腦

• 雖然 Flash 可以接受任何 Unicode 文字(包含中 文), 但為了確保與其它版本的 Flash 相容, 也