Разработка модулей для 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 Namespace15.1.