ArcEngine 许可初始化问题

时间:2021-01-24 15:00:10
今天用AE做拓扑,出现了这个错误提示“The application is not licensed to create or modify schema for this type of data”
关于初始化Engine许可的,其实原理都很简单,大家一般都没有问题,但又往往会因为不够细心加上Engine的“小脾气”,让不少程序员都要在这里犯错。

以Engine9.2为例,应用程序是强制初始化许可,也就是说必须使用LicenseControl或AO接口初始化许可,否则应用程序无法启动。 Engine9.1未采取强制初始化许可策略,而是应用程序创建时就初始化标准Engine许可。在一般情况下,我们会用将LicenseControl 拖放到主窗体上完成初始化。但当Engine程序需要使用ArcGIS Engine Enterprise Geodatabase(以下简称GDB Update)许可的时候,我们就往往会由于意识不到应该使用该许可,以及无法正确的初始化该许可而陷入麻烦。

注意:以下所探讨的所有“许可”并不包括扩展模块许可,如三维分析、空间分析和网络分析;而只是包括Engine可使用的Engine标准许可、Engine GDB Update许可、ArcView许可、ArcEditor许可和ArcInfo许可五种。

问题分为三方面:

1.什么情况下需要GDB Update许可

当需要对SDE里数据进行编辑时,以及需要在SDE和Personal Geodatabase中创建复杂ArcGIS对象时,我们需要使用GDB Update许可。

对SDE里的数据编辑,很好理解,大致就是进行数据插入,删除,更新;对表添加、删除和修改,表结构的变化(添加、删除列)等,因为这些动作都会造成后台数据库的写操作。

对于Personal Geodatabase,进行简单数据对象和编辑,包括创建、删除和修改普通表都是不需要GDB Update许可的,但对于复杂的Geodatabse对象的创建、删除和修改,则需要GDB Update许可,其中复杂的Geodatabse对象包括几何网络,网络分析模型,拓扑,关系类。这也是为什么往往有些经验的程序员写好了一个创建几何网络或拓扑的程序后,执行起来会被报“需要Geodatabase Update许可”的错。

 

2.怎样初始化GDB Update许可

当我们意识到需要使用Engine的GDB Update许可时,怎样才能将它正确的初始化呢?Engine给我们提供了两种初始化许可的方法:

1)使用LicenseControl控件。将该控件拖放到主窗体之上,勾选适当的许可,并确保程序启动该窗体可加载,就可以完成许可初始化。如下图:


2)使用IAoInitialize.Initialize方法加入适当的参数进行初始化。VB6的例子代码如下:

Option Explicit

Dim m_pAoInitialize As IAoInitialize

Private Sub Form_Load()

    '实例化

    Set m_pAoInitialize = New AoInitialize

    '初始化 EngineGeoDB 许可

    Call m_pAoInitialize.Initialize(esriLicenseProductCodeEngineGeoDB)

End Sub

 

当然,对于一个健壮的程序而言,我们还需要在初始化之前先判断将被初始化的许可是否可用,应先使用IsProductCodeAvailable方法进行判断,需要初始化扩展模块的许可,可使用CheckOutExtension方法。

 

3.初始化过程中容易犯的错误

我们应该注意到,Engine是有些“小脾气”的。如果没有按照它的“习惯”,它是不会为我们乖乖工作的。其中有个很重要的原则(以下简称“重要原则”)就是一个程序只能初始化许可一次,已经初始化许可的程序一旦运行就无法再修改其初始化的许可,即程序运行期间无法修改其使用的许可。

1)LicenseControl和IAoInitialize接口两种初始化方法,一个应用程序中只能使用一种方法,如果两种一起使用,哪一个“说得算”就不一定了。如果这两种方式同时使用,且两种初始化的许可级别一样时,也许我们感觉不到什么不对,但当我们需要修改初始化许可级别,而又只改了一种初始化方法却忘记了另一种,根据“重要原则”可知,这次修改初始化很可能无法生效。

2)使用LicenseControl初始化时,当我们将其拖放到窗体上时,它往往会自动勾选“ArcGIS Engine”许可,也就是自动初始化标准Engine许可。但当我们需要通过它更改许可级别时,Engine9.2会提示如下信息:


该信息的含义是警告我们该程序已经初始化了Engine标准许可,若要初始化其他许可,重启开发环境后才会生效。对这句话的解释是,如果我们想通过 LicenseControl初始化其他级别的Engine许可,需要在勾选其他许可之后关闭开发环境(如图为VB6)再打开才生效,否则还是原来的许可。另外,对于Engine9.1,此种情况下没有该警告,问题会更隐蔽(无语吧 -_-!)。
 

3)LicenseControl中多选许可是没有意义的,第一个被勾选的许可生效。
这种情况下,实际上该应用程序初始化的是Engine标准许可,而不是其他。虽然LicneseControl从操作上可以让用户多选许可,但并不代表它会将您勾选的许可全部签出。另外,这些许可都是有对应和包含关系的。其中ArcGIS Engine与ArcView是对应的,ArcGIS Engine Enterprise Geodatabase与ArcEditor是对应的;ArcGIS Engine Enterprise Geodatabase是包含ArcGIS Engine许可的。当我们需要GDB Update许可的时候,仅仅需要勾选ArcGIS Engine Enterprise Geodatabase即可,为了“保险起见”勾选上其他许可反而会弄巧成拙。 

使用IAoInitialize接口进行初始化,Initialize方法只能调用一次,多余的调用是不会生效的,道理就像上面LicenseControl勾选了多个许可一样。

一个 初始化许可的例子,这里初始化了编辑和网络分析许可