如何在DNN自定义模块开发包中添加数据库脚本?

时间:2010-01-19 17:05:44

标签: c# sql-server package dotnetnuke-module

我已经在DNN上创建了一个自定义模块,创建了它的包并与另一个DNN应用程序集成。它工作正常。但是在另一个DNN应用程序上传模块后我手动创建模块数据库。这就是我的问题..

我想创建一个带有数据库脚本的模块包。因此,当最终用户上传我的模块时,模块数据库应该自动创建。

简单来说,我需要一个点击解决方案,就像市场上可用的商业模块一样。请提出任何解决方案。

1 个答案:

答案 0 :(得分:26)

欢迎开发DotNetNuke,官方网站提供零文档,所有内容都来自试验,博客,论坛和试图向您推销的网站。

我建议您转到DNN根文件夹并打开/Install/Module/UsersOnline_05.01.00_Install.resources文件。它只是一个名为.resources的zip存档。在该档案内部是打包的“在线用户”模块,这是我将要介绍的例子。

如果您已经为模块创建了.DNN xml软件包,则需要添加一个新的<component>条目,让DNN知道在安装过程中执行SQL脚本:

...snip...
<components>
    <component type="Script">
      <scripts>
        <basePath>DesktopModules\UsersOnline</basePath>
        <script type="Install">
          <path>Providers\DataProviders\SqlDataProvider</path>
          <name>04.09.04.SqlDataProvider</name>
          <version>04.09.04</version>
        </script>
        <script type="Install">
          <path>Providers\DataProviders\SqlDataProvider</path>
          <name>05.01.00.SqlDataProvider</name>
          <version>05.01.00</version>
        </script>
        <script type="UnInstall">
          <path>Providers\DataProviders\SqlDataProvider</path>
          <name>Uninstall.SqlDataProvider</name>
          <version>05.01.00</version>
        </script>
      </scripts>
</component>
...snip...

在模块安装期间,DNN将按其版本号的顺序执行此处输入的脚本。如果从未安装过当前正在安装的模块,那么它将按以下顺序进行:

  1. 04年9月4日
  2. 00年1月5日
  3. 如果模块已经安装并且正在升级(从04.09.04开始),它将跳过以前版本的脚本(假设它们已经被执行)并且只运行较新的05.01.00脚本,这应该可以解决所有问题。至今。您有责任创建SQL脚本以支持内置升级机制。

    还有一个“UnInstall”脚本,在用户卸载模块时执行。这使您可以在模块之后进行清理。

    每个SQL脚本都包含创建模块架构,默认数据,存储过程等所需的T-SQL命令。以下是OnlineUsers模块脚本的片段:

    /************************************************************/
    /*****              SqlDataProvider                     *****/
    /*****                                                  *****/
    /*****                                                  *****/
    /***** Note: To manually execute this script you must   *****/
    /*****       perform a search and replace operation     *****/
    /*****       for {databaseOwner} and {objectQualifier}  *****/
    /*****                                                  *****/
    /************************************************************/
    
    if exists (select * from dbo.sysobjects where id = object_id(N'{databaseOwner}[{objectQualifier}DNNUOL_GetOnlineUsers]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
        DROP PROCEDURE {databaseOwner}{objectQualifier}DNNUOL_GetOnlineUsers
    GO
    
    CREATE PROCEDURE {databaseOwner}{objectQualifier}DNNUOL_GetOnlineUsers
    @PortalID int,
    @IncludeHosts bit
    AS
    IF @IncludeHosts = 0
    BEGIN
    SELECT 
        UO.UserID,
        U.UserName,
        U.DisplayName,
        U.FirstName, 
        U.LastName, 
        U.FirstName + ' ' + U.LastName AS FullName
    FROM
        {databaseOwner}{objectQualifier}UsersOnline UO INNER JOIN {databaseOwner}{objectQualifier}Users U ON UO.UserID = U.UserID INNER JOIN {databaseOwner}{objectQualifier}UserPortals UP ON U.UserID = UP.UserID
    WHERE
        UO.PortalID = @PortalID AND UO.UserID = U.UserID AND UP.Authorised = 1 AND U.IsSuperUser = 0 -- Inner Join takes care of SU = 0, but for sanity.
    END
    ELSE
    BEGIN
    SELECT DISTINCT
        UO.UserID,
        U.UserName,
        U.DisplayName,
        U.FirstName, 
        U.LastName, 
        U.FirstName + ' ' + U.LastName AS FullName
    FROM
        {databaseOwner}{objectQualifier}UsersOnline UO INNER JOIN {databaseOwner}{objectQualifier}Users U ON UO.UserID = U.UserID, {databaseOwner}{objectQualifier}UserPortals UP
    WHERE
        UO.PortalID = @PortalID AND UO.UserID = U.UserID AND UP.Authorised = 1
    END
    GO
    
    /************************************************************/
    /*****              SqlDataProvider                     *****/
    /************************************************************/
    

    请注意在数据库中创建的每个表或过程的前面使用{databaseOwner}和{objectQualifier}。这些是令牌,在运行时使用安装的web.config文件中的设置进行替换。您通常可以假设这些将被替换为“dbo”。但如果您正在销售模块或将其提供给第三方进行安装,则需要支持自定义所有者和限定符。

    以下是一些其他资源: