2010-01-19 65 views
6

我在DNN上創建了一個自定義模塊,創建了它的軟件包並與另一個DNN應用程序集成在一起。它工作正常。但是在將模塊上傳到另一個DNN應用程序後,我正在手動創建模塊數據庫。這就是我的問題所在。如何在DNN自定義模塊開發包中添加數據庫腳本?

我想用它的數據庫腳本創建一個模塊包,當最終用戶上傳我的模塊時,模塊數據庫應該自動創建。

簡而言之,我需要一個點擊解決方案就像商業模塊avilable在市場上。請提出任何解決方案。

回答

24

歡迎開發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年4月9日
  2. 00年5月1日

如果該模塊已安裝並正在升級(從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」。但如果您銷售您的模塊或將其提供給第三方進行安裝,則需要支持自定義所有者和限定符。

這裏有一些額外的資源:

+10

+1第一段 – 2010-11-14 22:56:57

相關問題