全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1240
推到 Plurk!
推到 Facebook!

用Delphi開發回應用戶輸入的Web資料庫查詢程式

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-09-26 21:58:31 IP:61.64.xxx.xxx 未訂閱
用Delphi開發回應用戶輸入的Web資料庫查詢程式 摘自《太平洋電腦資訊網》 (文/肖偉中) 通 常 情 況 下, 用 戶 通 過 瀏 覽 器 在Web 站 點 上 看 到 的 網 頁 大 多 是 靜 態 的, 隨 著Internet/Intranet 的 飛 速 發 展 和 普 遍 應 用, 靜 態 網 頁 已 這 遠 遠 不 能 滿 足 用 戶 的 實 際 需 求, 用 戶 希 望 更 多 地 看 到 根 據 要 求 而 動 態 生 成 的 網 頁, 例 如 響 應 用 戶 輸 入( 選 擇) 進 行 數 據 庫 查 詢、 動 態 生 成 報 表 等。 就 目 前 而 言, 采 用 運 行 在Web Server 端 的CGI、ISAPI/NSAPI 應 用 程 序 還 是 一 種 主 要 的 動 態 生 成 網 頁 的 方 式。 ---- 使 用Delphi 3 for Client/Server 開 發Web Server 應 用 程 序 不 僅 簡 單、 方 便, 而 且 其 開 發 能 力 十 分 強 大, 因 爲Delphi 3 提 供 了WebModule、WebApplication、TwebRequest、TwebResponse、TPageProducer 等 大 量 的 組 件 和 對 象, 以 支 持Web Server 程 序 的 開 發, 能 夠 非 常 簡 單 地 生 成 專 業 性 的 ISAPI/NSAI、CGI 程 序。 而 且 由 于Delphi 強 大 的 數 據 庫 開 發 能 力, 允 許DLL 來 處 理 大 量 並 發 的、 安 全 線 程 的 數 據 庫 連 接, 使 得Web Server 程 序 的 開 發 更 是 錦 上 添 花。 ---- 在Delphi 3 的Demos 中 提 供 了 簡 單 的Web Server 應 用 程 序 開 發 的 範 例, 但 沒 有 涉 及 到 響 應 用 戶 輸 入 的 問 題。 而 響 應 用 戶 的 輸 入 或 選 擇, 並 通 過 數 據 庫 查 詢 來 返 回 查 詢 結 果, 是 我 們 編 寫Web Server 應 用 程 序 的 一 種 主 要 形 式。 ---- HTML 文 檔 中 用 戶 輸 入 主 要 是 通 過< FORM > 語 句 段, 並 支 持POST、PUT、GET、HEAD 等 方 法, 而Web Server 應 用 程 序 是 怎 樣 接 收 到 客 戶 端 用 戶 的 輸 入( 選 擇) 請 求 信 息 呢 ? 我 們 知 道, 在HTTP 協 議 中, 瀏 覽 器 客 戶 端 向Web Server 應 用 程 序 傳 送 請 求 數 據 主 要 是 通 過URL 和CONTENT 部 分。 例 如 在 URL:http://www.gtgaj.gov/scripts/wdcx.dll /runquery?gdnd=1992&bgqx= 長 期 ---- 中,gdnd=1992&bgqx= 長 期 是 數 據 參 數, 它 請 求ISAPI 程 序wdcx.dll( 對 應 的 動 作 事 件 爲/runquery, 若 使 用 確 省 動 作 事 件, 則 不 需 要 這 個 字 符 串), 把 歸 檔 年 代(gdnd) 爲1992 年 而 且 保 管 期 限(bgqx) 爲 長 期 的 文 檔 信 息 返 回 到 瀏 覽 器 並 顯 示, 這 種 方 法 一 般 應 用 在 數 據 量 比 較 少 的 情 況 下, 優 點 是 比 較 容 易 輸 入 參 數, 可 直 接 在URL 中 輸 入 請 求 信 息, 缺 點 是 返 回 數 據 量 不 能 太 大, 並 影 響URL 的 顯 示, 在 參 數 比 較 多 時, 將 出 現 一 個 長 串 的URL。 而 在CONTENT 中 保 存 數 據 信 息 的 優 點 是 不 影 響URL 的 顯 示, 而 且 允 許 返 回 的 數 據 量 較 大, 缺 點 是 用 戶 只 能 使 用< FORM > 語 句 段 讓 瀏 覽 器 生 成 請 求 信 息, 不 能 直 接 在URL 中 輸 入。 在POST、PUT、GET 和HEAD 四 種 方 法 中, 除 了POST 方 法 使 用CONTENT 向Web Server 應 用 程 序 傳 送 數 據 以 外, 其 它 方 法 都 是 通 過URL 來 傳 送 數 據 的。 ---- Delphi 3 中 提 供 了 裝 載 瀏 覽 器 請 求 信 息 的TWebRequest 對 象, 利 用 該 對 象 的methodtype 屬 性 即 可 得 知HTTP 傳 送 請 求 信 息 的 方 法, 再 利 用 該 對 象 的ContentFields 或QueryFields 屬 性 即 可 將HTTP 傳 送 的 信 息 進 行 分 析, 非 常 容 易 使 用。 例 如, 對 於CONTENT 中 的 數 據, 我 們 可 直 接 使 用Request.ContentFields.Values[' 用 戶 輸 入 項 的 名 稱'] 來 讀 取 用 戶 的 輸 入 信 息; 而 對 於URL 中 的 數 據, 則 可 直 接 使 用Request.QueryFields.Values[' 用 戶 輸 入 項 的 名 稱'] 來 讀 取。 ---- 下 面 就 通 過 一 個 簡 單 的 例 子 來 介 紹 如 何 開 發 一 個 響 應 用 戶 輸 入 的 數 據 庫 查 詢Web Server 程 序 ---- 首 先, 在Web 服 務 器 端 安 裝 數 據 庫 引 擎BDE, 並 設 置 好 數 據 庫 別 名wsda, 指 向 一 個 包 含 歸 檔 部 門、 歸 檔 年 代、 卷 號、 文 件 日 期、 文 件 字 號、 文 件 作 者、 標 題 等 字 段 的 數 據 庫 文 件wsdak.dbf。 ---- 接 著 建 立 一 個HTML 文 件wsdacx.htm, 放 在Web 服 務 器 的 確 省 目 錄 下( 如c:\webshare), wsdacx.htm 的 內 容 如 下: < HTML >< HEAD >< TITLE >文書檔案查詢< /TITLE > < /HEAD > < BODY > < h1 >文書檔案查詢卡< /h1 > < HR > < FORM action="/scripts/wdcx.dll" method=post > 請輸入標題關鍵字:< input type="text" size="16" Maxlength="16" name="btgjc" >< BR > < INPUT TYPE=SUBMIT VALUE="查詢" > < INPUT TYPE=RESET VALUE="重填" > < /FORM > < HR > < /BODY >< /HTML > ---- ( 在 本 例HTML 的< FORM > 語 句 中, 使 用 的 是POST 方 法, 可 改 爲 其 他 方 法 而 無 需 修 改 下 面 的ISAPI 源 程 序, 爲 簡 單 計, 本 例 只 列 出 了 一 個 用 戶 輸 入 項)。 ---- 在Delphi 中 新 建 一 個 基 於ISAPI 的Web Server Application, 增 加 一 個 確 省 的 的 動 作 事 件, 其 代 碼 如 下: procedure TWebModule1.WebModule1Web ActionItem1Action(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var MyDB : TDatabase; MyQuery : TQuery; Count : Integer; Input: TStrings; Begin Input:=nil; Case request.methodtype of mtpost: Input := request.ContentFields; mtget,mtput,mthead: Input := request.QueryFields; end; if input.values['btgjc']< >'' then begin MyDB := TDatabase.Create(nil); MyQuery := TQuery.Create(nil); try MyDB.AliasName := 'wsda'; MyDB.DatabaseName := 'wsda'; MyQuery.DatabaseName := MyDB.DatabaseName; response.content:= '< HTML >< HEAD >< TITLE >查詢結果 < /TITLE >< /HEAD >'#13 '< BODY >'#13 '< H2 >< font face="隸書" color="green" > 查詢結果資訊:< /font >< /H2 >'#13 '< table border=1 >'#13 '< tr >'#13 '< th >卷號< /th >'#13 '< th >文件日期< /th >'#13 '< th >文件字型大小< /th >'#13 '< th >標題< /th >'#13 '< tr >'#13; //#13是換行符 Myquery.sql.clear; Myquery.sql.add('select * from wsdak.dbf ' 'where (標題 like "%' input.values['btgjc'] '%")'); Myquery.open; Myquery.first; Count:= 0; while not MyQuery.eof do begin response.content:=response.content '< tr >'#13 '< td >' MyQuery.FieldByName('卷號') .AsString '< /td >'#13 '< td >' MyQuery.FieldByName ('文件日期').AsString '< /td >'#13 '< td >' MyQuery.FieldByName('文件字型大小') .AsString '< /td >'#13 '< td >' MyQuery.FieldByName ('標題').AsString '< /td >'#13 '< tr >'#13; count:=count 1; MyQuery.Next; end; response.content:=response.content '共查詢到' inttostr(count) '條資訊< br >'; finally response.content:=response.content ' < /table >< /BODY >< /HTML >'; MyQuery.Close; MyDB.Close; MyQuery.Free; MyDB.Free; end; end else response.content:='請先輸入標題關鍵字:'; end; ---- 需 要 注 意 的 是: 必 須 在 本 單 元 文 件 的uses 子 句 中 手 工 添 加db 與dbtables 單 元。 爲 簡 單 計, 本 例 並 沒 有 使 用TTable、Tquery、Tdatasource、TpageProducer、TqueryProducer 等 組 件, 有 興 趣 的 讀 者 不 妨 一 試。 ---- 將project 存 爲wdcx.dpr, 編 譯 後 放 到Web 服 務 器 的 可 執 行 文 件 路 徑( 如C:\WebShare\Scripts\), 即 可 響 應HTML 文 件wsdacx.htm 的 用 戶 輸 入, 並 返 回 數 據 庫 查 詢 結 果。 ---- 以 上 程 序 代 碼 在Windows 95B2(OSR) 的 個 人 Web 服 務 器PWS/Windows NT 4.0 的IIS、Microsoft Internet Explorer 4.0、Delphi3 Client/Server 下 調 試 通 過 ********************************************************* 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together! 希望能大家敞開心胸,將知識寶庫結合一起
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-05-06 11:33:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!