*****关于IntraWeb发布到IIS的问题*****多谢大家的关照 (180分)

  • 主题发起人 主题发起人 30452570
  • 开始时间 开始时间
3

30452570

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟用IntraWeb做了一个系统.发布成Application是没有问题的.
可我将它转换成IIS时我的子窗口打不开了.
我个人分析原因:
首页上的数据是从DmdMain中取来的.而DmdMain我在Session创建的时候创建了它.
而其它页面上的DataMoudle都是单独的.在页面被创建的时候才创建.是不是因为这个原因呢?
问题2:发布成ISAPI时显示
An error occurred while attempting to initialize the Borland Database Engine (error $2B05)
是怎么回事呢?我的机器上已安装了BDE.

请高手指教!
 
先创建DmdMain
 
to gyh75:
DmdMain我已创建了.运行也没有问题.只是我的子页面打开看不到数据.
 
我认为是这个原因。
子窗口的某些数据敏感控件需要从数据模板那里获得数据,在执行到create事件之前,这些
数据敏感控件已经存在——当然,因为无法获得数据而无法正常执行(已经出错了)。
但是也有一点奇怪的:为何StandAlone方式没有问题?应该也出现错误才对呀!
测试是否是这个原因很简单:也在session创建的时候创建该数据模板,看看是否能够回避
这个错误。
假如的确是这个原因,而且你仍然打算那样做(显然,节省内存!),那么我有简单的办法
解决这个问题。先看看是不是这个原因吧!
 
关于问题2,主要是跟权限设置有关,这个问题很早就有人问了,下面是borland公司的回答:
Q:
When using the BDE, I get the following error when starting my web application: "An error occurred while attempting to initialize the Borland Database Engine (error $2B05)"

A:
This is a setup issue, not a Delphi programming problem. Cause: This error happens because the anonymous user that IIS starts your process as does not have permission to write to some temp directories (Typically, for security reasons, it can't write to the directory where inetinfo.exe is located in your System32/inetsrv directory.)

Solution: The Paradox tables were not designed for multiple users hitting the database at the same time. The best solution is to use a SQL based database, such as Interbase, Oracle, or MS SQL Server.
If you must use Paradox and the BDE, then be sure to have a TSession on your WebDataModule. Set AutoSessionName to true. The key thing is to set the NetFileDir and PrivateDir to something that the anonymous IIS account can access. A good solution would be to set the NetFileDir to: C:/Temp/Net and the PrivateDir to: C:/Temp. The two cannot point to the same directory. In addition, it is best to uniquly set the PrivateDir for each webmodule, in the OnCreate event (typically, you will create a directory based on the current thread id, and set the PrivateDir to this). Otherwise, you may see each other's data from different threads. However, the NetDir MUST be shared across all processes and threads.

Next, you must give the IUSR_MACHINE_NAME and IWAM_MACHINE_NAME accounts full read and write permissions to the following directories:
1. The BDE directory
2. The base directory for your NetDir and PrivateDir
3. Your actual temp directory, probably C:/WINNT/Temp
4. Your directory that contains the database files
5. If all else fails, give read permissions to C:/WINNT, and then write permissions to C:/WINNT.

 
to yeskert1:
关于第二个问题,我的用户是有Administrator权限的啊.按理说应该不存在访问权限的问题的.
关于节省内存的方法.还请赐教!谢谢!

 
(你好像确定了第一个问题的原因正是数据模板引起的)
假如工程有很多页面,这些页面多数都需要处理数据库数据,而且这些页面引用的数据不是
很重复,那么有必要使用你的方法:将这些数据分放在不同的数据模板里,只有需要的时候
才动态创建某个数据模板——这是常用的节省内存的方法之一。
但是现在有了问题:何时创建数据模板比较合适?(顺便一个问题:何时注销比较合适?)
假设:1、有个需要动态创建的数据模板叫做TdataMdl_1,它在u_mdl_1.pas里;
2、假设窗口IWForm1需要它。
我的方法是这样的,你可以试一试:
1、在usersession里建立成员:mdl1:TdataMdl_1;
2、在u_mdl_1.pas里定义这样的函数:
function dataMdl_1:TdataMdl_1;
begin
with Rwebapplication.data as TuserSession do begin
if not Assigned(mdl1) then mdl1:=TdataMdl_1.create(nil);
result:=mdl1;
end;
end
这样,你不必在IWForm1的create事件里写那些代码了,IWForm1窗口(页面)应该可以
正确的出现了。上面代码我是凭感觉写的,没有实验过,但我认为可以解决你的问题。

像这样动态创建的数据模板何时释放比较合适呢?首先说哪些情况不适合动态创建。不
论哪种情况,只要该数据模板被频繁访问,那么这个数据模板就不应该动态创建。
好了,一个动态创建的数据模板的使用情况有两种:只被一个窗口使用和被多个窗口使
用。对于“只被一个窗口使用”这种情况很简单:跟随窗口一起释放好了;对于“被多个窗口使”这种情况,也可以跟随每个窗口的释放一起释放——但也有可能会引发问题,比如,其中一个窗口只是隐藏而不是释放,另一个却释放了(当然数据模板也释放了),隐藏的窗口再继续工作时可能(不是必然)会引起异常。这种情况应该为这个数据模板建立“引用计
数器”,各个窗口引用(或创建)时加1,释放时减1,只有发现为零才释放,这类似com的
引用计数。


 
后退
顶部