帮人解难, By Seasky(150分)

S

SeaSky

Unregistered / Unconfirmed
GUEST, unregistred user!
我今天收到cindy_309的一封Email ,提出如下问题, 希望各位大虾帮忙.

我觉得好象是线程中Session冲突, 好象每个Datamodle都应该建立一个
TSession , 将其Tsession.auto??? (记不得了) 置为 True , 并将
Database和Query的Session和那个Tsession 相连.
但具体还有什么问题, 就没有研究了 :((

Email 如下:

我用delphi开发了一个多线程的数据库程序(使用threadobject),

在一个datamodule内放置了三个database和两个query构件,两个query

分别在两个线程内执行异构查询,将从oracle和sql server中select出的

数据insert一个access表中。执行完全正确。

现在我想将它改写成一个ole automation server用于ASP服务器端。

我的步骤如下:

1创建ActiveX lIBRARY

2 创建Automation Object

3 定义无参方法DbInsert

4 uses 原应用中的datamodule和thread单元

5 实现DbInsert方法如下:

procedure TMyDbInsert.DbInsert;

begin

with datamodule1 do

begin

sql_insert.create(query1);

oracle_insert.create(query2);

end;

end;

其中sql_insert和oracle_insert分别为执行异构查询的两个线程。

在Web执行目录下注册后,在ASP中执行

<%

set DbObj = server.CreateObject("project_db.MyDbInsert")

DbObj.DbInsert

%>

提示:错误'8000ffff'

行10

行10 为执行DbInsert方法行。将该行注释掉后,生成该对象实例没有问题。

因此我想问题可能出在该方法的实现上。我在原来的应用程序中就是使用这

两条语句的(不过是在按钮单击事件中)。还是自动化服务器方法的实现有所不同?

请大虾指教。

(Email 结束)
 
Dear cindy_309,

It seems like that ur dll initial is succesful, and create with
no problem. So this may because of ur function in dll, then I
suggest u make it single thread and have a test. Any how, the
ole automation server is call in multi thread, I think this may
be the problem.

U can have a try. Any more questions, let me know.
 
我也有这封信,呵呵,SEASKY果然好人。
我的第一部分和SEASKY基本相同。
第二部分可能有点误导,呵呵,我让他改变现成模式不是single而是
both:)
不过在OLE AUTOMATION SERVER里用THREAD到的确没玩过,ASP也不熟。
不过我觉得cytown的话可能更有道理:Automation Server 如果同时
用THREAD处理多个客户的请求,而在每个THREAD里再用THREAD是否有
问题呢?呵呵,这个没好好玩过,见笑
 
现附cindy_309的回信:

理论上应该为每一个使用数据库的线程建立一个session。

但是我设计的这个自动化server是执行在ASP服务器端的不可视构件,不

允许有消息框、对话框之类的弹出。而执行一个异构查询将弹出两个数据库登

录框,为避免弹出对话框,我在query中输入的sql语句:

insert into ":access1:student" select * from ":eek:racle1:eek:student"

insert into ":access1:student" select * from ":sql1:sstudent"

其中access1、oracle1、sql1并不是数据库alias,而是在database构件中

为access、oracle、sql server别名定义的databasename属性。同时设置

这三个database构件的loginpromt为false,并输入登录参数,而在query

构件中不设置其database属性。这样就可避免对话框的弹出。

但是如果每个线程使用一个session,两个query可以分别与其相连,却不能

让access和sql server同一个session相连,另一个session连接access

和oracle。我不能解决这一问题,所以只好不用session构件。

我把这个多线程和datamodule单元放在一个application中,并没有因为session

的省略而发生异常,不过做自动化服务器就不一定了,这也许就是问题的症结所在。

如果必须使用session,我该怎么解决这个问题呢?

------------------------------------------------------------------

问题好象已经比较明显了, 大家再说说吧. :)).
 
我觉得SESSION主要是在有线程的时候用,比如ISAPI。

如果把你的AUTOMATION SERVER改为不支持对客户的线程连接(SINGLE MODE)
那么SESSION估计也不需要了。
 
另外,有时需要用SESSION主要是在不同线程中同一构件使用的冲突问题,即
一个QUERY在不同的线程中同时使用,那么需要一个SESSION,来防止冲突。
但是,需要‘协作’的话就要反过来了。
 
hi ,seasky,我在用asp调用delphi的非可视化的构件过程中也遇到了类似的问题,我怀疑是asp不支持此种方式的调用,不知道你的问题已经解决了没有,如何解决的,敬请告知,谢谢!
 
最后没有结果了, 我认为问题肯定出在线程上, 必须为没个线程分配
一个session.
分数均分了。
 
顶部