Волгоградский государственный университет
Опубликован: 02.03.2009 | Доступ: свободный | Студентов: 1479 / 172 | Оценка: 4.20 / 4.03 | Длительность: 16:55:00
Лекция 15:

Разработка модулей для DotNetNuke в Visual Studio 2005

< Лекция 14 || Лекция 15: 123456

Структура файлов и каталогов созданного шаблона модуля

За просмотр гостевой книги отвечает элемент управления 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.

Соответствие файлов модуля уровням модели

Рис. 15.21. Соответствие файлов модуля уровням модели

Этапы реализации уровня доступа к данным

При создании уровня доступа к данным буду проделаны следующие операции:

  • создана таблица в БД;
  • созданы хранимые процедуры;
  • изменен файл SqlDataProvider.vb, в который будет помещен код, вызывающий хранимые процедуры;
  • изменен файл DataProvider.vb, в который будут добавлены методы (которые переопределяются в файле SqlDataProvider.vb ).

Подключение к БД

Так как в данной лабораторной работе используется СУБД MS SQL Server Express, то подключение уже настроено. Для просмотра текущего подключения следует выбрать пункт главного меню Visual Studio View | Server Explorer. Откроется окно Server Explorer (рис. 15.22).

Компонент Visual Studio Server Explorer

Рис. 15.22. Компонент Visual Studio Server Explorer

Удаление демонстрационной таблицы и хранимых процедур

При создании нового модуля автоматически была создана таблица 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).

Созданная таблица

Рис. 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).

Созданные хранимые процедуры

Рис. 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.
< Лекция 14 || Лекция 15: 123456