在.net中利用VISIO来创建组织结构图,以ODBC作为数据源。超烦的问题!深切的盼望大虾的光临。
baron 2005-06-16 04:30:06 我先介绍一下我的环境:
关键字:VS.net 2003,C#/Asp.Net/Sqlserver,ODBC,Visio 2003
上面的关键字基本可以说明我的的开发所处的环境。我现在描述一下我对生成组织结构图的大概做法:
Visio生成组织结构图的数据源可以来自于Excel,Txt文件,Exchange server,ODBC。我的组织结构数据保存在Sqlserver2000中。因此我建了一个ODBC数据源。ODBC数据源登录到sqlserver服务器有两种身份验证的方式:windows身份验证和Sqlserver验证。前者在本机或者在域中可以方便的使用;后者在使用ODBC时会提示输入密码。生成组织结构图是在后台以不可见的方式生成的,客户端不需要作交互式的操作(我是BS的客户端)。因此我只能采用不需要输入密码的方式。所以我采用了windows身份验证。但我所在的局域网只有工作组,没有域。因此如果IIS服务器与数据库服务器不在同一台机时需要先建立两台机的信任(可以直接访问另一台机,也可以用net.exe命令来访问),然后在创建ODBC数据源的时候选择windows身份验证并将客户端设置为使用命名管道。这样的设置在Visio中以及使用C#直接访问Visio(winForm)都能正确的输出组织结构图。可以使用System.Diagnostics.Process.Start("net.exe",args);来建立两台机的信任关系。
由于我的系统是BS的,所以我需要将这些功能移植到asp.net中,移植过去后我在web.config文件的system.web节中加上
<identity impersonate="true"/>以使用客户端模拟Asp.Net用户来使用visio,并运行DCOMCNFG.exe为运行Visio配置相应的权限。
当数据库服务器与IIS服务器在同一机器上时是可以正确输出组织结构图的。
但我现在的情况就是不在同一机器上,我使用System.Diagnostics.Process.Start("net.exe",args);先访问目标机器以建立信任关系。但没有用,在生成组织结构数据的时候会出现“找不到数据源的错误"
这里还有其他两种附带来的问题和奇怪的现象:
1、自从设置了<identity impersonate="true"/>后,我以前使用System.Diagnostics.Process.Start("net.exe",args);去访问另一台机并随后使用Directory.Exists(filePath)去检查filepath所指的共享目录是否存在的功能也不正常了。永远都说那个目标不存在。我怀疑设置了<identity impersonate="true"/>后影响了System.Diagnostics.Process.Start("net.exe",args);的正确执行。
2、调用Visio生成组织结构图的过程如果数据源不存在或者出什么错很令人恼火。因为在正常情况下他会弹出一个DialogBox让用户确认。当用户确认完后才能做进一步的操作。因此在程序中调用他这个功能时如果出错了用户又无法按确定(Visio是以隐藏的方式运行在服务器端),所以程序永远的停在那里。我查visio的帮助,发现在Application中有个AlertResponse属性,我设置成1,但仍然不起作用。费解。
3、在DCOMCNFG.exe中将默认安全机制的默认访问权限中加上administrator,system,interactive三个用户,默认启运权限那里加上administrator,system,interactive以及internet来宾账号和启动IIS进程的账号,而在Visio的安全性属性那里全部使用默认安全性。你会发觉有意外的发现,这部分我都一下描述不清楚。虽然能正确输出组织结构图,但每次都会生成一个无法结束的Visio进程,这个进程只有重启才能被结束。
以上是我在解决生成组织结构图过程的经验和烦恼。相信很多公司都需要生成组织结构图,如果这些问题都解决了,我将会把整个解决方案和源代码整理成文章公布出来。