隨著網路技術的發展與Internet的普及,Browser/Server在軟體開發上已成為主流,筆者在開發一個ERP系統時,就採用了B/S軟體模式,具體架構為SQL Server+IIS+IE網頁採用的是Active Server Page檔案。由於系統涉及大量的資料操作和查詢,若純粹採用asp腳本語言編寫勢必造成效率低下,為了提高系統的整體效率和安全性,筆者採用了ASP組件來取代ASP腳本語言。
由於Delphi在開發資料庫應用系統中具有的強大的功能和極高的效率,所以筆者開發ASP組件較常用的是Delphi 5.0(當然也可採用Visual Basic或VC++開發ASP組件),Delphi本身在Internet和InternetExPRess兩個元件面板提供了眾多的元件可以直接產生Web頁面,但是這些元件都缺少網頁中資料顯示常見的分頁功能。眾所周知,ASP是透過建立ADO連接資料庫後建立RecordSet對象,然後利用RecordSet的AbsolutePage進行頁面定位,而在Delphi 5.0中,已提供了ADO組件封裝了Microsoft的ADO庫,所以同樣具有頁面定位功能。下列筆者將逐步來開發一個通用的顯示分頁Web頁面的ASP元件。
第一步:新建一個Activex Library,命名為PadoPage,然後再新建一個Active Server Object Class,命名為AdoPage,即建立了一個名為AdoPage的ASP元件,檔案命名為Adopage.pas。
第二步:開啟Type Library,新建一個方法Get_Page,然後在Get_Page加入一個參數Pconnandsgl,用來傳遞資料庫連線語句和SQL語句,參數選擇為BSTR型別。
步驟三:新建一個DataModule,放入Adoconnection組件和AdoQuery組件,將Data Module命名為AdoDataModule。由於新建立的元件中的方法Get_Page要從DataModule中取得數據,所以需要在Adopage.pas的Uses子句中加入AdoDataModule,然後宣告一個資料模組的變數fadodm,同時加入Initialize和Destroy這兩個方法,以便在ASP組作中產生資料模組。 Adopage.pas具體程式碼如下所示:
unit Adopage;
interface
uses
ComObj, SysUtils, Classes, ActiveX, AspTlb, Pbasedata_TLB, StdVcl, AdoDataModule;
//將AdoDataModule加入USE子句
type
T Adopage = class(TASPObject, Ibasedata)
private
fadodm:TAdoDataModuleform;
protected
procedure OnEndPage; safecall;
procedure OnStartPage(const AScriptingContext: IUnknown); safecall;
procedure get_page(const pconnandsql: WideString); safecall;
public
procedure initialize;override;
destructor destroy;override;
end;
implementation
uses ComServ,forms;
destructor Tadopage.destroy;
begin
inherited;
fadodm.Destroy;
end;
procedure Tadopage.initialize;
begin
inherited;
fadodm:=tadodmform.Create(forms.application);
end;
第四步:建立通用的分頁顯示資料的方法get_page,具體程式碼如下:
procedure Tadopage.get_page(const pconnandsql: WideString);
var i,j,n:integer;
connstr,sqlstr:widestring;
rs:_recordset;
cur_url:widestring;
page_no:integer;
begin
//先從傳遞過來的參數中分別取出連接字串和SQL語句
pconnandsql:=uppercase(pconnandsql);
i:=pos('CONNSTR',pconnandsql);
j:=pos('SQLSTR',pconnandsql);
if i=0 or j=0 then
begin
response.write('資料庫連接字串或SQL語句錯誤!');
abort;
end;
for n:=I+8 to j-1 do
connstr:=connstr+pconnandsql[n];
for n:=j+7 to length(pconnandsql) do
sqlstr:=sqlstr+pconnandsql[n];
//將取得的連接字串和SQL語句分別賦給ADOconnection和ADOQuery
fadodm.adoconnection1.connstring:=connstr;
fadodm.adoquery1.sql.add(sqlstr);
//以下為開啟資料庫並進行分頁的流程
try
fadodm.adoquery1.open;
//開啟資料庫
rs:=fadodm.adoquery1.recordset;
//取得目前開啟頁面的URL和頁碼
try
if request.servervariable['url'].count>0 then
cur_url:= request.servervariable.item['url'];
if request.querystring['page_no'].count>0 then
page_no:=request.querystring.item['page_no']
else
page_no:=1;
except
end;
rs.pagesize:=20;
//每頁設為20行
rs.AbsolutePage:=page_no;
//頁面定位
response.write('共'+inttostr(rs.pagecount)+'頁& ');
response.write('第'+inttostr(page_no)+'頁& ');
//對每個頁碼建立超鏈接
for i:=1 to rs.pagecount do
response.write('<a href='+cur_url+'?page_no='+inttostr(i)+'>'
+inttostr(i)+'</a>');
//資料記錄按表格顯示
response.write('<table>');
//取得表格標題
response.write('<tr>');
為 I:=0 至 fadodm.adoquery1.fields.count-1 do
response.write('<td>'+fadodm.adoquery1.fields[i].fieldname+'</td>');
response.write('</tr>');
j:=1
with fadodm.adoquery1 do
while (not eof) and j<=rs.pagesize do
begin
response.write('<tr>');
//取得表格內容
為 i:=1 to fields.count do
response.write('<td>'+fields[i].asstring+'</td>');
response.write('</tr>');
next;
end;
response.write('</table>');
fadodm.adoquery1.close;
except
response.write('資料出錯啦!');
end;
end;
以上即為取得通用分頁資料的過程,需要注意的是編譯時部分函數會出錯,只要在USES子句中加入sysutils、classes和adodb單元即可。
第五步:編譯並註冊adopage元件,即可在ASP程式碼中調用,調用範例如下:
<%
dim webpageobj
set webpageobj=server.createobject(padopage.adopage)
webpageobj.get_page(conn=provider=SQLOLEDB.1;presist security info=false;
user id=sa;initical catalog=sale_data;data source=(local),
sqlstr=selectfrom customer)
%>
透過以上步驟,我們就順利地利用Delphi開發出了具有分頁功能的ASP組件了。