ASP+DELPHI+.DLL混合编程问题? (100分)

  • 主题发起人 主题发起人 wwwwww
  • 开始时间 开始时间
W

wwwwww

Unregistered / Unconfirmed
GUEST, unregistred user!
用DELPHI编activeX控件,变成.DLL,然后注册,最后ASP中CreateObject调用,
试验没问题,response.write('Hello world')完成成功.

好多教材只讲到这就完了,但废话,有什么用呀!一点实用价值也没有.

我只好自己摸索,想在DLL中直接嵌入DELPHI的ADO控件,读取数据库.

procedure Ttestobj.test;
var
ADOConnection: TADOConnection;
ADOCommand: TADOCommand;
ADODataSet: TADODataSet;
ADOQuery : TADOQuery;
begin
ADOConnection:=TADOConnection.create(nil);
ADODataSet :=TADODataSet.create(nil);
ADOQuery :=TADOQuery.Create(nil);
ADOConnection.connectionstring:='.......';
ADOQuery.Connection:=ADOConnection;

ADOQuery.sql.clear;
m_scriptContext.Response.Write('这句没问题,网页中出现');
ADOQuery.sql.Add('SELECT * FROM Table');
m_scriptContext.Response.Write('执行上句后,这句根本就不显示,浏览器速度奇慢');
m_scriptContext.Response.Write('以下应是循环处理数据集, 更甭想了');
end;

别告我说用ASp的
set conn=createObject("Adodb.connection")
set rs =createObject("Adodb.recordset")
一类的脚本,我不想在网页中嵌这些,想直接用DELPHI编好一个大.DLL,

做这些一个网页,全部搞定:
<%@LANGUAGE="VBSCRIPT" %>
<HTML>
<BODY>
<% Set DelphiASPObj = Server.CreateObject("Project1.myobj")
DelphiASPObj.mySoft
Set DelphiASPObj =nothing
%>
<HR>
</BODY>
</HTML>
 
我喜欢,我也是用ASP+DELPHI,先UP,再慢慢看
 
哈,楼主跟我的不同,我是做成了COM+对象,留出了几个接口。供ASP及CBUILDER调用

为什么要把这些不关键的东东都写到DLL里去呢,那你要准备着随时重新编译你的DLL
 
ASP本身就又ADO对象
你这样何苦呢
 
用DELPHI编DLL供ASP调用优点是:
1.编译运行,非解释,速度快
2.保密性好,纯2进制码,谁要想解去用DEBUG吧
3.最重要的是要用上咱DELPHI的功底,毕竟用了多年,感情也深,
此外,DELPHI语言比VB优点就不用说了吧
 
太低b了,我早就则这样用了。
 
偶也正在搞,有空再睇
 
你的Testobj是由Active Server Object向导建立的ASP COM组件吗?你尝试把Active Server
Type改为Page-level event methods看看,不要选Object Context,然后把事务类型改成
Supports Transactions看看。
 
写成MTS,有数据窗口,不知到这么做行不行,试试啊,我没空帮你试
 
我也来顶顶,主要是我没有做国、过asp啊,我一直都是在用jsp[:D]
 
TO Sachow:
你的Testobj是由Active Server Object向导建立的ASP COM组件吗?你尝试把Active ServerType改为Page-level event methods看看,不要选Object Context,然后把事务类型改成Supports Transactions看看。
的确是用向导做的,你的方法不明白,试试再说。

 
实际上挺简单的,跟DELPHI编程差不多,你的可能是哪个地方设置不对吧,我自己做的太麻烦,这有一篇文章,你照着做做,应该就明白了

由于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>');

for I:=0 to fadodm.adoquery1.fields.count-1 do

response.write('<td>'+fadodm.adoquery1.fields.fieldname+'</td>');

response.write('</tr>');

j:=1

with fadodm.adoquery1 do

while (not eof) and j<=rs.pagesize do

begin

response.write('<tr>');

//取得表格内容

for i:=1 to fields.count do

response.write('<td>'+fields.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=select?from customer")

%>

通过以上步骤,我们就顺利地利用Delphi开发出了具有分页功能的ASP组件了。
 
后退
顶部