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

标签 c# sql-server package dotnetnuke-module

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

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

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

最佳答案

欢迎使用 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.09.04
  2. 05.01.00

如果模块已经安装并且正在升级(从 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”。但如果您要出售模块或将其提供给第三方进行安装,则需要支持自定义所有者和限定符。

这里有一些额外的资源:

关于c# - 如何在DNN自定义模块开发包中添加数据库脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2095318/

相关文章:

java - 如何在不依赖的情况下从不同项目中的包中获取所有类?

c# - System.Drawing Bitmap 给出了错误的尺寸

c# - 在 C# View 模型中访问 XAML 对象

c# - 我是否完全误解了如何使用 Visual Studio 的 2008 分析器?

sql - 如果存在则更新行的存储过程

sql - SELECT 与 UPDATE,使用 ABS 函数时出现意外四舍五入

sql-server - SQL Server 查询中的自定义总和

python - 如何在 anaconda 本地卸载软件包?

Java - 为什么另一个包中的子级无法通过父级引用访问父级的 protected 方法?

c# - 在 C# 中获取当前位置(在区域和语言中指定)