New Community Website

Ordinarily, you'd be at the right spot, but we've recently launched a brand new community website... For the community, by the community.

Yay... Take Me to the Community!

The Community Blog is a personal opinion of community members and by no means the official standpoint of DNN Corp or DNN Platform. This is a place to express personal thoughts about DNNPlatform, the community and its ecosystem. Do you have useful information that you would like to share with the DNN Community in a featured article or blog? If so, please contact .

The use of the Community Blog is covered by our Community Blog Guidelines - please read before commenting or posting.

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

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+ :

The DAL The DAL+

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:

  • ExecuteNonQuery - Used to execute a stored procedure that will not return a value.
  • ExecuteReader - Used to execute a stored procedure that will return multiple records.
  • ExecuteScalar - Used to execute a stored procedure that will return a single value.
  • ExecuteSQL - Used to execute a sql statement.

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

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

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

' 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

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 =
  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"))
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

Developing Your Own DotNetNuke Module

To develop your own DotNetNuke modules, it is recommended that you follow these tutorials in this order:

DotNetNuke® 4 Module Tutorial Series:



Comment Form

Only registered users may post comments.


Aderson Oliveira (22)
Alec Whittington (11)
Alessandra Davies (3)
Alex Shirley (10)
Andrew Hoefling (3)
Andrew Nurse (30)
Andy Tryba (1)
Anthony Glenwright (5)
Antonio Chagoury (28)
Ash Prasad (37)
Ben Schmidt (1)
Benjamin Hermann (25)
Benoit Sarton (9)
Beth Firebaugh (12)
Bill Walker (36)
Bob Kruger (5)
Bogdan Litescu (1)
Brian Dukes (2)
Brice Snow (1)
Bruce Chapman (20)
Bryan Andrews (1)
cathal connolly (55)
Charles Nurse (163)
Chris Hammond (213)
Chris Paterra (55)
Clint Patterson (108)
Cuong Dang (21)
Daniel Bartholomew (2)
Daniel Mettler (181)
Daniel Valadas (48)
Dave Buckner (2)
David Poindexter (12)
David Rodriguez (3)
Dennis Shiao (1)
Doug Howell (11)
Erik van Ballegoij (30)
Ernst Peter Tamminga (80)
Francisco Perez Andres (17)
Geoff Barlow (12)
George Alatrash (12)
Gifford Watkins (3)
Gilles Le Pigocher (3)
Ian Robinson (7)
Israel Martinez (17)
Jan Blomquist (2)
Jan Jonas (3)
Jaspreet Bhatia (1)
Jenni Merrifield (6)
Joe Brinkman (274)
John Mitchell (1)
Jon Henning (14)
Jonathan Sheely (4)
Jordan Coopersmith (1)
Joseph Craig (2)
Kan Ma (1)
Keivan Beigi (3)
Kelly Ford (4)
Ken Grierson (10)
Kevin Schreiner (6)
Leigh Pointer (31)
Lorraine Young (60)
Malik Khan (1)
Matt Rutledge (2)
Matthias Schlomann (16)
Mauricio Márquez (5)
Michael Doxsey (7)
Michael Tobisch (3)
Michael Washington (202)
Miguel Gatmaytan (3)
Mike Horton (19)
Mitchel Sellers (40)
Nathan Rover (3)
Navin V Nagiah (14)
Néstor Sánchez (31)
Nik Kalyani (14)
Oliver Hine (1)
Patricio F. Salinas (1)
Patrick Ryan (1)
Peter Donker (54)
Philip Beadle (135)
Philipp Becker (4)
Richard Dumas (22)
Robert J Collins (5)
Roger Selwyn (8)
Ruben Lopez (1)
Ryan Martinez (1)
Sacha Trauwaen (1)
Salar Golestanian (4)
Sanjay Mehrotra (9)
Scott McCulloch (1)
Scott Schlesier (11)
Scott Wilkinson (3)
Scott Willhite (97)
Sebastian Leupold (80)
Shaun Walker (237)
Shawn Mehaffie (17)
Stefan Cullmann (12)
Stefan Kamphuis (12)
Steve Fabian (31)
Steven Fisher (1)
Timo Breumelhof (24)
Tony Henrich (3)
Torsten Weggen (3)
Tycho de Waard (4)
Vicenç Masanas (27)
Vincent Nguyen (3)
Vitaly Kozadayev (6)
Will Morgenweck (40)
Will Strohl (180)
William Severance (5)
What is Liquid Content?
Find Out
What is Liquid Content?
Find Out
What is Liquid Content?
Find Out