数据访问层(DAL)
数据访问层(DAL)必须实现数据提供者抽象类中声明的方法。然而,每一个DAL提供者在实现这些方法时也许很不相同。这种处理允许提供者灵活的选择他们自己的数据库访问协议(也就是说:.NET管理的OleDB, ODBC等)。同样也允许提供者处理数据库平台之间的所有不同之处(例如:存储过程,sql语言语法,@@IDENTITY)。
每一个数据提供者必须为其在web.config中的自定义属性指定一个实现方法。
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports Microsoft.ApplicationBlocks.Data
Imports System.IO
Imports System.Web
Imports DotNetNuke
Namespace DotNetNuke.Data
Public Class SqlDataProvider
Inherits DataProvider
Private Const ProviderType As String = "data"
Private _providerConfiguration As ProviderConfiguration = ProviderConfiguration.GetProviderConfiguration(ProviderType)
Private _connectionString As String
Private _providerPath As String
Private _objectQualifier As String
Private _databaseOwner As String
Public Sub New()
' Read the configuration specific information for this provider
Dim objProvider As Provider = CType(_providerConfiguration.Providers(_providerConfiguration.DefaultProvider), Provider)
' Read the attributes for this provider
_connectionString = objProvider.Attributes("connectionString")
_providerPath = objProvider.Attributes("providerPath")
_objectQualifier = objProvider.Attributes("objectQualifier")
If _objectQualifier <> "" And _objectQualifier.EndsWith("_") = False Then
_objectQualifier += "_"
End If
_databaseOwner = objProvider.Attributes("databaseOwner")
If _databaseOwner <> "" And _databaseOwner.EndsWith(".") = False Then
_databaseOwner += "."
End If
End Sub
Public ReadOnly Property ConnectionString() As String
Get
Return _connectionString
End Get
End Property
Public ReadOnly Property ProviderPath() As String
Get
Return _providerPath
End Get
End Property
Public ReadOnly Property ObjectQualifier() As String
Get
Return _objectQualifier
End Get
End Property
Public ReadOnly Property DatabaseOwner() As String
Get
Return _databaseOwner
End Get
End Property
数据访问方法必须涉及成简单的查询(例如 单一的select,insert,update,delete),以便于在所有的数据库平台上他们都能被实现。业务逻辑(例如条件分支,计算或局部变量)应该在业务逻辑层实现,这样才能从数据库抽象出来并集中到一个应用程序(模块)里处理。如果你经常用那些使你可以在数据库层实现程序逻辑的富sql语言变量工作的话,这种数据库访问是相当简单的。
DNN中的Sql server/msde 数据提供者用了存储过程作为最好的数据访问技术。
' links module
Public Overrides Function GetLinks(ByVal ModuleId As Integer) As IDataReader
Return CType(SqlHelper.ExecuteReader(ConnectionString, DatabaseOwner & ObjectQualifier & "GetLinks", ModuleId), IDataReader)
End Function
Public Overrides Function GetLink(ByVal ItemId As Integer, ByVal ModuleId As Integer) As IDataReader
Return CType(SqlHelper.ExecuteReader(ConnectionString, DatabaseOwner & ObjectQualifier & "GetLink", ItemId, ModuleId), IDataReader)
End Function
Public Overrides Sub DeleteLink(ByVal ItemId As Integer)
SqlHelper.ExecuteNonQuery(ConnectionString, DatabaseOwner & ObjectQualifier & "DeleteLink", ItemId)
End Sub
Public Overrides Sub AddLink(ByVal ModuleId As Integer, ByVal UserName As String, ByVal Title As String, ByVal Url As String, ByVal MobileUrl As String, ByVal ViewOrder As String, ByVal Description As String, ByVal NewWindow As Boolean)
SqlHelper.ExecuteNonQuery(ConnectionString, DatabaseOwner & ObjectQualifier & "AddLink", ModuleId, UserName, Title, Url, MobileUrl, IIf(ViewOrder <> "", ViewOrder, DBNull.Value), Description, NewWindow)
End Sub
Public Overrides Sub UpdateLink(ByVal ItemId As Integer, ByVal UserName As String, ByVal Title As String, ByVal Url As String, ByVal MobileUrl As String, ByVal ViewOrder As String, ByVal Description As String, ByVal NewWindow As Boolean)
SqlHelper.ExecuteNonQuery(ConnectionString, DatabaseOwner & ObjectQualifier & "UpdateLink", ItemId, UserName, Title, Url, MobileUrl, IIf(ViewOrder <> "", ViewOrder, DBNull.Value), Description, NewWindow)
End Sub
DNN用到存储过程(存储过程查询)但是没有用参数自动查找的特性( CommandBuilder.DeriveParameters ),因此参数必须明确的定义。
' links module
Public Overrides Function GetLinks(ByVal ModuleId As Integer) As IDataReader
Return CType(OleDBHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, ObjectQualifier & "GetLinks", _
New OleDbParameter("@ModuleId", ModuleId)), IDataReader)
End Function
Public Overrides Function GetLink(ByVal ItemId As Integer, ByVal ModuleId As Integer) As IDataReader
Return CType(OleDBHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, ObjectQualifier & "GetLink", _
New OleDbParameter("@ItemId", ItemId), _
New OleDbParameter("@ModuleId", ModuleId)), IDataReader)
End Function
Public Overrides Sub DeleteLink(ByVal ItemId As Integer)
OleDBHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, ObjectQualifier & "DeleteLink", _
New OleDbParameter("@ItemId", ItemId))
End Sub
Public Overrides Sub AddLink(ByVal ModuleId As Integer, ByVal UserName As String, ByVal Title As String, ByVal Url As String, ByVal MobileUrl As String, ByVal ViewOrder As String, ByVal Description As String, ByVal NewWindow As Boolean)
OleDBHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, ObjectQualifier & "AddLink", _
New OleDbParameter("@ModuleId", ModuleId), _
New OleDbParameter("@UserName", UserName), _
New OleDbParameter("@Title", Title), _
New OleDbParameter("@Url", Url), _
New OleDbParameter("@MobileUrl", MobileUrl), _
New OleDbParameter("@ViewOrder", IIf(ViewOrder <> "", ViewOrder, DBNull.Value)), _
New OleDbParameter("@Description", Description), _
New OleDbParameter("@NewWindow", NewWindow))
End Sub
Public Overrides Sub UpdateLink(ByVal ItemId As Integer, ByVal UserName As String, ByVal Title As String, ByVal Url As String, ByVal MobileUrl As String, ByVal ViewOrder As String, ByVal Description As String, ByVal NewWindow As Boolean)
OleDBHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, ObjectQualifier & "UpdateLink", _
New OleDbParameter("@ItemId", ItemId), _
New OleDbParameter("@UserName", UserName), _
New OleDbParameter("@Title", Title), _
New OleDbParameter("@Url", Url), _
New OleDbParameter("@MobileUrl", MobileUrl), _
New OleDbParameter("@ViewOrder", IIf(ViewOrder <> "", ViewOrder, DBNull.Value)), _
New OleDbParameter("@Description", Description), _
New OleDbParameter("@NewWindow", NewWindow))
End Sub