DAL & DAL+: Connect Your DotNetNuke® Module to The Database

Also see:

DotNetNuke and Data Access

When you create a DotNetNuke module that needs to connect to the database, you have the option of coding the data access methods manually or leveraging the DotNetNuke framework.

The DotNetNuke framework provides a full featured Data Access Layer (DAL). The DAL also includes an special subset of methods commonly refereed to as the DAL+

The DAL and the DAL+

The following diagram shows an overview of the DAL and the DAL+ :

Graphic courtesy of  http://www.effority.net  ITM GmbH

 

The Purpose of the DAL (and the DAL+)

The DAL has this purpose:

To allow DotNetNuke (and it's modules) to communicate with any data source.

A Close-up Look at the DAL+

The DAL+ does not require an Abstract Data Provider and it does not require that you code a custom Concrete Provider. The DAL+ is a subset of the DAL. It is comprised of 4 methods that exist in the DotNetNuke framework's currently configured Concrete Provider. The methods are:

Below is an explanation of the format used to implement the DAL+ using the ExecuteReader method:

The DAL+ allows you to use code such as this (in the Controller Class) to connect to the currently configured database:

Public Shared Function ThingsForSale_SelectAll(ByVal ModuleId As Integer) As List(Of ThingsForSaleInfo)
    Return CBO.FillCollection(Of ThingsForSaleInfo)(CType(DataProvider.Instance().ExecuteReader("ThingsForSale_SelectAll", ModuleId), IDataReader))
End Function

(note: CBO.FillCollection is a special method provided by the DotNetNuke framework to hydrate a custom collection. See further reading at the end of this article for more information)

However, unlike the DAL, the DAL+ is not 100% portable to other data sources. For example, if a module is developed using the DAL+ that retrieves data using one stored procedure, an alternate database must be able to perform the exact same functionality using only one stored procedure. In some cases this is not possible due to differences in databases.

However, in those instances where you will not need to run your module on alternate databases (for example for internal development) it is recommended that you use the DAL+. The code savings is significant.

A Close-up Look at the DAL

Graphic courtesy of  http://www.effority.net  ITM GmbH

The DAL does require that you code a Abstract Provider and one or more custom Concrete Providers. This allows you to create modules that are 100% portable to other databases.

The Abstract Provider reads the settings in the web.config file to determine what the currently configured database is and exposes data access methods. In the example below the method is GetSurveys which is declared MustOverride.

' return the provider
Public Shared Shadows Function Instance() As DataProvider
  Return objProvider
End Function

' dynamically create provider
Private Shared Sub CreateProvider()
  objProvider =
CType(Framework.Reflection.CreateObject("data", "DotNetNuke.Modules.Survey", ""), DataProvider)
End Sub

' methods to be overridden by the concrete provider
Public MustOverride Function GetSurveys(ByVal ModuleId As Integer) As IDataReader

The Concrete Provider overrides the methods in the Abstract Provider and performs the data access task.

Public Class SqlDataProvider
  Inherits DataProvider

Public
Overrides Function GetSurveys(ByVal ModuleId As Integer) As IDataReader
  Return CType(SqlHelper.ExecuteReader(ConnectionString, DatabaseOwner & ObjectQualifier & "GetSurveys", ModuleId), IDataReader)
End Function

(note: SqlHelper is a special method provided by the DotNetNuke framework (using the Microsoft Application Blocks) to reduce the code needed for data access. See further reading at the end of this article for more information)

The Controller Class uses DataProvider.Instance() to call methods in the Abstract Provider which calls the corresponding overridden methods in the Concrete Provider.

Public Shared Function GetSurveys(ByVal ModuleId As Integer) As List(Of SurveyInfo)
Dim SurveyInfolist As List(Of SurveyInfo) = New List(Of SurveyInfo)
 Using dr As IDataReader = DataProvider.Instance().GetSurveys(ModuleId)
  While dr.Read
   Dim SurveyInfo As SurveyInfo = New SurveyInfo
   SurveyInfo.SurveyId = Convert.ToInt32(dr(
"SurveyId"))
   SurveyInfo.Question = Convert.ToString(dr(
"Question"))
   SurveyInfo.OptionType = Convert.ToString(dr(
"OptionType"))
   SurveyInfo.ViewOrder = Convert.ToInt32(ConvertNullInteger(dr(
"ViewOrder")))
   SurveyInfo.CreatedByUser = Convert.ToInt32(dr(
"CreatedByUser"))
   SurveyInfo.CreatedDate = Convert.ToDateTime(dr(
"CreatedDate"))
   SurveyInfolist.Add(SurveyInfo)
  End While
 End
Using
Return
SurveyInfolist
End Function

Leverage the DotNetNuke Framework

Using the DAL+ allows a module developer to write less code to access the database than they would if they did not use the DotNetNuke framework. The DAL+ has it's limitations and the DAL is provided in those cases where 100% portability is required.

Sample Code

DAL+  - Super-Fast Super-Easy Module (DAL+)

DAL     - DNN4 Survey Module (Beta)

Further Reading

Data Access Guidelines
http://www.dotnetnuke.com/About/Documentation/ProjectDocuments/tabid/478/Default.aspx

Developing Your Own DotNetNuke Module

To develop your own DotNetNuke modules, it is recommended that you start with one of these tutorials:

 

[Back to: The ADefWebserver DotNetNuke HELP WebSite]


DotNetNuke® is a registered trademark of Perpetual Motion Interactive Systems Inc.