Разработка модулей для DotNetNuke в Visual Studio 2005
Структура файлов и каталогов созданного шаблона модуля
За просмотр гостевой книги отвечает элемент управления ViewGuestBook.ascx, относящийся к уровню представления. Этот элемент управления загружается, когда ядро DNN отображает модуль GuestBook. Ассоциированный с ним файл ViewGuestBook.ascx.vb содержит следующий код:
Dim objGuestBooks As New GuestBookController Dim colGuestBooks As List(Of GuestBookInfo) ' get the content from the GuestBook table colGuestBooks = objGuestBooks.GetGuestBooks(ModuleId)
Этот код ссылается на файл GuestBookController, определенный в файле GuestBookController.vb, относящемуся к уровню бизнес-логики. Этот файл содержит следующий код:
Public Function GetGuestBooks(ByVal ModuleId As Integer) As List(Of GuestBookInfo) Return CBO.FillCollection(Of GuestBookInfo)(DataProvider.Instance().GetGuestBooks(ModuleId)) End Function
В свою очередь, этот код ссылается на класс GuestBookInfo, содержащийся в файле GuestBookInfo.vb, который также относится к уровню бизнес-логики.
Код
DataProvider.Instance().GetGuestBooks(ModuleId)
в классе GuestBookController ссылается на код
' return the provider Public Shared Shadows Function Instance() As DataProvider Return objProvider End Function
в файле DataProvider.vb, который является частью уровня доступа к данным. Файл DataProvider.vb содержит код
Public MustOverride Function GetGuestBooks(ByVal ModuleId As Integer) As IDataReader
который ссылается на метод, переопределенный в файле SQLDataProvider.vb этим кодом:
Public Overrides Function GetGuestBooks(ByVal ModuleId As Integer) As IDataReader
Return CType(SqlHelper.ExecuteReader(ConnectionString, _
GetFullyQualifiedName("GetGuestBooks"), ModuleId), _
IDataReader)
End FunctionЭтот код использует Data Access Application Blocks и возвращает IDataReader.
Таким образом, соответствие файлов модуля уровням приведенной модели может быть представлено в виде рис. 15.21.
Этапы реализации уровня доступа к данным
При создании уровня доступа к данным буду проделаны следующие операции:
- создана таблица в БД;
- созданы хранимые процедуры;
- изменен файл SqlDataProvider.vb, в который будет помещен код, вызывающий хранимые процедуры;
- изменен файл DataProvider.vb, в который будут добавлены методы (которые переопределяются в файле SqlDataProvider.vb ).
Подключение к БД
Так как в данной лабораторной работе используется СУБД MS SQL Server Express, то подключение уже настроено. Для просмотра текущего подключения следует выбрать пункт главного меню Visual Studio View | Server Explorer. Откроется окно Server Explorer (рис. 15.22).
Удаление демонстрационной таблицы и хранимых процедур
При создании нового модуля автоматически была создана таблица YourCompany_GuestBook, а также ряд хранимых процедур:
- YourCompany_AddGuestBook,
- YourCompany_DeleteGuestBook,
- YourCompany_GetGuestBook,
- YourCompany_GetGuestBooks,
- YourCompany_UpdateGuestBook.
Их необходимо удалить.
Создание таблицы
Для создания таблицы, в которой будут храниться используемые модулем данные, следует зарегистрироваться на сайте под учетной записью host, и выбрать в меню Host пункт SQL. При помощи открывшейся страницы следует выполнить следующий SQL-скрипт:
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE
id = object_id(N'{databaseOwner}[{objectQualifier}YourCompany_GuestBook]')
and OBJECTPROPERTY(id, N'IsTable') = 1)
DROP TABLE {databaseOwner}[{objectQualifier}YourCompany_GuestBook]
GO
CREATE TABLE {databaseOwner}[{objectQualifier}YourCompany_GuestBook] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[ModuleID] [int] NULL ,
[Name] [nvarchar] (50) NULL ,
[Email] [nvarchar] (50) NULL ,
[Message] [nvarchar] (250) NULL ,
[DateEntered] [datetime] NULL
) ON [PRIMARY]
ALTER TABLE {databaseOwner}[YourCompany_GuestBook] ADD
CONSTRAINT [PK_{objectQualifier}YourCompany_GuestBook] PRIMARY KEY CLUSTERED
(
[ID]
) ON [PRIMARY]В результате будет создана следующая таблица YourCompany_GuestBook (рис. 15.23).
Создание хранимых процедур
Аналогичным образом следует выполнить следующий SQL-скрипт, создающий хранимые процедуры:
CREATE PROCEDURE {databaseOwner}[{objectQualifier}YourCompany_GuestBook_Delete]
(
@ID int
)
AS
DELETE FROM {objectQualifier}YourCompany_GuestBook
WHERE (ID = @ID)
RETURN
GO
CREATE PROCEDURE {databaseOwner}[{objectQualifier}YourCompany_GuestBook_GetAll]
(
@ModuleID int
)
AS
SELECT ID, ModuleID, Name, Email, Message, DateEntered
FROM {objectQualifier}YourCompany_GuestBook
WHERE (ModuleID = @ModuleID)
order by DateEntered DESC
RETURN
GO
CREATE PROCEDURE {databaseOwner}[{objectQualifier}YourCompany_GuestBook_Insert]
(
@ModuleID int,
@Name nvarchar(50),
@Email nvarchar(50),
@Message nvarchar(250)
)
AS
INSERT INTO {objectQualifier}YourCompany_GuestBook
(ModuleID, Name, Email, Message, DateEntered)
VALUES (@ModuleID,@Name,@Email,@Message,getdate())
RETURN
GO
CREATE PROCEDURE {databaseOwner}[{objectQualifier}YourCompany_GuestBook_Update]
(
@ID int,
@Name nvarchar(50),
@Email nvarchar(50),
@Message nvarchar(250),
@DateEntered datetime
)
AS
UPDATE {objectQualifier}YourCompany_GuestBook
SET Name = @Name, Email = @Email, Message = @Message, DateEntered = @DateEntered
WHERE (ID = @ID)
RETURN
GOВ результате будут созданы хранимые процедуры, отвечающие за удаление записей, отображение всех записей, вставку новой записи и модификацию существующей записи в гостевой книге (рис. 15.24).
Модификация файла SqlDataProvider.vb
Содержимое файла SqlDataprovider.vb следует заменить следующим кодом:
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports Microsoft.ApplicationBlocks.Data
Imports DotNetNuke.Common.Utilities
Imports DotNetNuke.Framework.Providers
Namespace YourCompany.Modules.GuestBook
Public Class SqlDataProvider
Inherits DataProvider
Private Const ProviderType As String = "data"
Private Const ModuleQualifier As String = ""
Private _providerConfiguration As ProviderConfiguration = _
ProviderConfiguration.GetProviderConfiguration(ProviderType)
Private _connectionString As String
Private _providerPath As String
Private _objectQualifier As String
Private _databaseOwner As String
' <summary>
' Constructs new SqlDataProvider instance
' </summary>
Public Sub New()
MyBase.New()
'Read the configuration specific information for this provider
Dim objProvider As Provider = _
CType(_providerConfiguration.Providers(_providerConfiguration.DefaultProvider), Provider)
' This code handles getting the connection string from either the connectionString /
' appsetting section and uses the connectionstring section by default if it exists.
' Get Connection string from web.config
_connectionString = Config.GetConnectionString()
' If above funtion does not return anything then
' connectionString must be set in the dataprovider section.
If _connectionString = "" Then
' Use connection string specified in provider
_connectionString = objProvider.Attributes("connectionString")
End If
_objectQualifier = objProvider.Attributes("objectQualifier")
If ((_objectQualifier <> "") _
AndAlso (_objectQualifier.EndsWith("_") = False)) Then
_objectQualifier = (_objectQualifier + "_")
End If
_databaseOwner = objProvider.Attributes("databaseOwner")
If ((_databaseOwner <> "") _
AndAlso (_databaseOwner.EndsWith(".") = False)) Then
_databaseOwner = (_databaseOwner + ".")
End If
End Sub
' <summary>
' Gets and sets the connection string
' </summary>
Public ReadOnly Property ConnectionString() As String
Get
Return _connectionString
End Get
End Property
' <summary>
' Gets and sets the Provider path
' </summary>
Public ReadOnly Property ProviderPath() As String
Get
Return _providerPath
End Get
End Property
' <summary>
' Gets and sets the Object qualifier
' </summary>
Public ReadOnly Property ObjectQualifier() As String
Get
Return _objectQualifier
End Get
End Property
' <summary>
' Gets and sets the database ownere
' </summary>
Public ReadOnly Property DatabaseOwner() As String
Get
Return _databaseOwner
End Get
End Property
' -----------------------------------------------------------------------------
' <summary>
' Gets the fully qualified name of the stored procedure
' </summary>
' <param name="name">The name of the stored procedure</param>
' <returns>The fully qualified name</returns>
' -----------------------------------------------------------------------------
Private Function GetFullyQualifiedName(ByVal name As String) As String
Return (DatabaseOwner _
+ (ObjectQualifier _
+ (ModuleQualifier + name)))
End Function
' -----------------------------------------------------------------------------
' <summary>
' Gets the value for the field or DbNull if field has "null" value
' </summary>
' <param name="Field">The field to evaluate</param>
' <returns></returns>
' -----------------------------------------------------------------------------
Private Function GetNull(ByVal Field As Object) As Object
Return Null.GetNull(Field, DBNull.Value)
End Function
Public Overrides Sub YourCompany_GuestBook_Insert(ByVal ModuleId As Integer, _
ByVal Name As String, ByVal Email As String, ByVal Message As String)
SqlHelper.ExecuteNonQuery(ConnectionString, _
GetFullyQualifiedName("YourCompany_GuestBook_Insert"), _
ModuleId, Name, Email, Message)
End Sub
Public Overrides Sub YourCompany_GuestBook_Delete(ByVal ID As Integer)
SqlHelper.ExecuteNonQuery(ConnectionString, _
GetFullyQualifiedName("YourCompany_GuestBook_Delete"), ID)
End Sub
Public Overrides Function YourCompany_GuestBook_GetAll(ByVal ModuleId As Integer) As IDataReader
Return CType(SqlHelper.ExecuteReader(ConnectionString, _
GetFullyQualifiedName("YourCompany_GuestBook_GetAll"), ModuleId), IDataReader)
End Function
Public Overrides Sub YourCompany_GuestBook_Update(ByVal ID As Integer, ByVal Name As String, _
ByVal Email As String, ByVal Message As String, ByVal DateEntered As DateTime)
SqlHelper.ExecuteNonQuery(ConnectionString, _
GetFullyQualifiedName("YourCompany_GuestBook_Update"), ID, Name, Email, Message, DateEntered)
End Sub
End Class
End Namespace
15.1.



