怎么用delphi生成带有访问数据库的asp组件?(50分)

  • 主题发起人 主题发起人 soardom
  • 开始时间 开始时间
S

soardom

Unregistered / Unconfirmed
GUEST, unregistred user!
我在asp中调用用delphi生成的asp组件,其中调用属性和一般的方法(不涉及数据库)是可以的。不过在方法中加上了访问数据库的语句后就出错了。不知道为什么会这样。请教大家了?在这里先谢过了!!!
 
你指的是com组件吧 出什么错? 错误信息?
 
我用delphi写了一个ActiveX DLL,生成DLL时是没有错的,在asp中调用的时时候,出错信息为“ 错误类型:Method1.soar (0x8000FFFF) /saor.asp, 第 12 行”,其中第 12 行为DelphiASPObj.Method1("soardom")。其中调用属性和一般的方法(不涉及数据库)是没有错误的
asp代码为
<% Set DelphiASPObj = Server.CreateObject("Method1.soar")
response.write DelphiASPObj.Tuser &amp
"<BR><BR>"
DelphiASPObj.Tuser = "soardom"
response.write DelphiASPObj.Tuser &amp
"<BR><BR>"
DelphiASPObj.Method1("soardom") //为第12行
response.write DelphiASPObj.Tuser &amp
"<BR><BR>"
set DelphiASPObj = nothing
%>
////////////////////////////////////////////////////////////////
delhpi 代码为
unit Unit1;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
ComObj, ActiveX, AspTlb, Method1_TLB, StdVcl, Unit2;

type
Tsoar = class(TASPObject, Isoar)
private
SNametmp : string;
protected
procedure OnEndPage
safecall;
procedure OnStartPage(const AScriptingContext: IUnknown)
safecall;
function Get_Tuser: WideString
safecall;
procedure Method1(const SName: WideString)
safecall;
procedure Set_Tuser(const Value: WideString)
safecall;
end;

implementation

uses ComServ;

procedure Tsoar.OnEndPage;
begin
inherited OnEndPage;
end;

procedure Tsoar.OnStartPage(const AScriptingContext: IUnknown);
begin
inherited OnStartPage(AScriptingContext);
SNametmp := '测试用';
end;

function Tsoar.Get_Tuser: WideString;
begin
Result := SNametmp;
end;

procedure Tsoar.Method1(const SName: WideString);
var
DM : TDataModule2;
begin
DM := TDataModule2.Create(nil);
try
DM.Query1.Close;
DM.Query1.SQL.Clear;
DM.Query1.SQL.Add('select * from SUser where SName = :value0');
DM.Query1.Params[0].AsString := string(SName);
DM.Query1.Prepare;
DM.Query1.Open;
if DM.Query1.RecordCount = 0 then
SNametmp := '该用户不存在'
else
SNametmp := '该用户的权限为' + DM.Query1.FieldByName('Authority').AsString;
finally
DM.Free;
end;

end;

procedure Tsoar.Set_Tuser(const Value: WideString);
begin
SNametmp := Value;
end;

initialization
TAutoObjectFactory.Create(ComServer, Tsoar, Class_soar,
ciMultiInstance, tmApartment);
end.

 
将 DelphiASPObj.Method1("soardom") //为第12行
改为 DelphiAspObj.Method1 "soardom"
因为调用组件要用asp的格式调用,不能用delphi的格式调用!
 
将 DelphiASPObj.Method1("soardom") //为第12行
改为 DelphiAspObj.Method1 "soardom"后
我试了一下,还是同样的错误,好像还是delphi中的那个方法的错误。
有没有人能解决这个问题,帮帮忙啊!!
 
上边的代码好象没问题,我怀疑可能是数据库连不上,你的dm中是怎么连数据库的?
 
我用的是SQL SERVER数据库,数据库是能连的上.我把datebase1的connected属性改为true 时,没有出错.下面是Database1的信息:
object Database1: TDatabase
AliasName = 'DataCon'
DatabaseName = 'aaaa'
LoginPrompt = False
Params.Strings = (
'DATABASE NAME='
'USER NAME=sa'
'ODBC DSN=DataCon'
'OPEN MODE=READ/WRITE'
'SCHEMA CACHE SIZE=8'
'SQLQRYMODE='
'LANGDRIVER='
'SQLPASSTHRU MODE=SHARED AUTOCOMMIT'
'SCHEMA CACHE TIME=-1'
'MAX ROWS=-1'
'BATCH COUNT=200'
'ENABLE SCHEMA CACHE=FALSE'
'SCHEMA CACHE DIR='
'ENABLE BCD=FALSE'
'ROWSET SIZE=20'
'BLOBS TO CACHE=64'
'PASSWORD=123')
SessionName = 'Default'
Left = 88
Top = 16
end
object Query1: TQuery
DatabaseName = 'aaaa'
SQL.Strings = (
'select * from SUser')
Left = 24
Top = 16
end
这个工程是这么建的:
1.先生成ActiveX DLL
2.再生成Active server object
3.然后生成本地数据模块DataModule2(Unit2.pas)
4.添加datebase1和query1
5.添加属性Tuser,方法Method1
6.添加代码,就是上面列出的代码(其它的都是系统自动生成的)
7.生成DLL,在管理工具->组件服务->COM+应用程序->IIS Out-Of-Process Pooled Applications
->组件中 新建组件中 选择 安装新组件(把刚生成的DLL选中)
8.在Internet 服务管理器中预览调用该DLL的页面
这样就出现了上面的错误

多谢各位这么帮我,谢谢!!!!!

 
我也遇到了这个问题 你比我好多了 我的就没提示 不能访问该网业
我估计是DM := TDataModule2.Create(nil);它的错
只是猜 我的也没解决 我吧数据库的全删除了OK 一连上就错误
 
我见过一个人写的 与数据库连的 他是这么写
在类上又加了  
private
dm: tadodmform
//声明为类的私有变量
public
procedure initialize;override;
destructor destroy;override;
end;
//下面是创建datamodule
destructor Tadopage.destroy;
begin
inherited;
dm.Destroy;
end;
procedure Tadopage.initialize;
begin
inherited;
dm:=tadodmform.Create(forms.application);
end;
不过 还是有错误 就是提示initiaize有错误
 
难道这种方法就跟本不行?
为什么?!!!!!!!
 
procedure TAsppage.GetTable(const ATableName: WideString);
var
ADm: TDataModule1;
begin
ADM:= TDataModule1.Create(nil);
with ADm Do
begin
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select * from '+ATablename);
adoquery1.Open;
response.write(adoquery1.RecordCount);
end;
end;
通过!
 
多谢各位的参与。特别是hstod。
上面的方法我试了一下,也通过了。
大家能不能用BDE的方式试一下,当然我也要试一下了。希望把结果贴上。
 
后退
顶部