Monday, December 01, 2008 Login    Register

 


  Search Blog  
  Blog Listing  
  Blog Archive  
Photos for your web site
  FREE CODE: DNN v4.05.03 SqlDataProvider Optimization  
Location: BlogsThe Mighty Blog    
Posted by: Will Strohl 6/25/2007
I have a great need for a current project to optimize whereever I can.  The DotNetNuke SqlDataProvider is one of those areas where optimizations are NEEDED.

I have a great need for a current project to optimize whereever I can.  The DotNetNuke SqlDataProvider is one of those areas where optimizations are NEEDED.

As of right now, I have only optimized the string portions of the code.  I replaced the normal concatenation with String.Concat() and am also using String comparison instead of strString <> "".  Oh yeah, and you cannot forget to use StringBuilders!  :)

There is also a few mail methods leftover in there from a script I had inserted to show me some information during troubleshooting something. There are certainly better implementations for it, but like I said, it was just for some real quick troubleshooting. I suggest removing it if you aren't going to use it.

There is much more to be done...  Check it out and enjoy!  (The DOWNLOAD is available at the bottom.)


Imports System
Imports System.Data
Imports System.Data.Common
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports Microsoft.ApplicationBlocks.Data
Imports System.IO
Imports System.Text
Imports System.Web
Imports DotNetNuke
Imports DotNetNuke.Common.Utilities
Imports DotNetNuke.Framework.Providers
Imports DotNetNuke.Entities.Users
Namespace DotNetNuke.Data
    Public Class SqlDataProvider
        Inherits DataProvider
#Region "Private Members"
        Private Const ProviderType As String = "data"
        Private p_providerConfiguration As ProviderConfiguration = ProviderConfiguration.GetProviderConfiguration(ProviderType)
        Private p_connectionString As String = String.Empty
        Private p_providerPath As String = String.Empty
        Private p_objectQualifier As String = String.Empty
        Private p_databaseOwner As String = String.Empty
        Private p_upgradeConnectionString As String = String.Empty
        Private p_DbOwnerQualifier As String = String.Empty
#End Region
#Region "Constructors"
        Sub New()
            Try
                ' Read the configuration specific information for this provider
                Dim objProvider As DotNetNuke.Framework.Providers.Provider = _
                    CType(p_providerConfiguration.Providers(p_providerConfiguration.DefaultProvider), DotNetNuke.Framework.Providers.Provider)
                ' Read the attributes for this provider
                'Get Connection string from web.config
                p_connectionString = DotNetNuke.Common.Utilities.Config.GetConnectionString()
                If String.IsNullOrEmpty(p_connectionString) Then
                    ' Use connection string specified in provider
                    p_connectionString = objProvider.Attributes("connectionString")
                End If
                If Not String.IsNullOrEmpty(Convert.ToString(objProvider.Attributes("upgradeConnectionString"))) Then
                    p_upgradeConnectionString = objProvider.Attributes("upgradeConnectionString")
                Else
                    p_upgradeConnectionString = p_connectionString
                End If
                p_providerPath = DotNetNuke.Common.Utilities.Config.GetProviderPath(ProviderType)
                p_objectQualifier = DotNetNuke.Common.Utilities.Config.GetObjectQualifer()
                p_databaseOwner = DotNetNuke.Common.Utilities.Config.GetDataBaseOwner()
                p_DbOwnerQualifier = String.Concat(p_databaseOwner, p_objectQualifier)
            Catch ex As Exception
                SendExceptionToAdmin(ex)
                Throw ex
            End Try
        End Sub
#End Region
#Region "Public Properties"
        ReadOnly Property ConnectionString() As String
            Get
                Return p_connectionString
            End Get
        End Property
        ReadOnly Property ProviderPath() As String
            Get
                Return p_providerPath
            End Get
        End Property
        ReadOnly Property ObjectQualifier() As String
            Get
                Return p_objectQualifier
            End Get
        End Property
        ReadOnly Property DatabaseOwner() As String
            Get
                Return p_databaseOwner
            End Get
        End Property
        ReadOnly Property UpgradeConnectionString() As String
            Get
                Return p_upgradeConnectionString
            End Get
        End Property
        ReadOnly Property DbOwnerQualifier() As String
            Get
                Try
                    Return p_DbOwnerQualifier
                Catch ex As Exception
                    SendExceptionToAdmin(ex)
                    Return String.Empty
                End Try
            End Get
        End Property
#End Region
#Region "Private Methods"
        Private Sub ExecuteADOScript(ByVal trans As SqlTransaction, ByVal SQL As String)
            'Get the connection
            Dim connection As SqlConnection = trans.Connection
            'Create a new command (with no timeout)
            Dim command As New SqlCommand(SQL, trans.Connection)
            command.Transaction = trans
            command.CommandTimeout = 0
            command.ExecuteNonQuery()
        End Sub
        Private Sub ExecuteADOScript(ByVal SQL As String)
            'Create a new connection
            Dim connection As New SqlConnection(UpgradeConnectionString)
            'Create a new command (with no timeout)
            Dim command As New SqlCommand(SQL, connection)
            command.CommandTimeout = 0
            connection.Open()
            command.ExecuteNonQuery()
            connection.Close()
        End Sub
        Private Function GetRoleNull(ByVal RoleID As Integer) As Object
            If RoleID.ToString = DotNetNuke.Common.Globals.glbRoleNothing Then
                Return DBNull.Value
            Else
                Return RoleID
            End If
        End Function
#End Region
#Region "Generic Methods"
        'Generic Methods
        '===============
        '
        ''' -----------------------------------------------------------------------------
        '''
        ''' ExecuteReader executes a stored procedure or "dynamic sql" statement, against
        ''' the database
        '''
        '''
        '''
        ''' The name of the Stored Procedure to Execute
        ''' An array of parameters to pass to the Database
        '''
        '''  [cnurse] 12/11/2005 created
        '''
        ''' -----------------------------------------------------------------------------
        Overrides Sub ExecuteNonQuery(ByVal ProcedureName As String, ByVal ParamArray commandParameters() As Object)
            SqlHelper.ExecuteNonQuery(ConnectionString, QueryName(ProcedureName), commandParameters)
        End Sub
        Overrides Function ExecuteReader(ByVal ProcedureName As String, ByVal ParamArray commandParameters() As Object) As IDataReader
            Return SqlHelper.ExecuteReader(ConnectionString, QueryName(ProcedureName), commandParameters)
        End Function
        Overrides Function ExecuteScalar(ByVal ProcedureName As String, ByVal ParamArray commandParameters() As Object) As Object
            Return SqlHelper.ExecuteScalar(ConnectionString, QueryName(ProcedureName), commandParameters)
        End Function
        Overrides Function ExecuteSql(ByVal strSql As String) As IDataReader
            Return ExecuteSql(strSql, Nothing)
        End Function
        Overrides Function ExecuteSql(ByVal strSql As String, ByVal ParamArray commandParameters() As IDataParameter) As IDataReader
            SendMailToAdmin(String.Concat("ExecuteSql(", strSql, ") ENTERED"), String.Concat("ExecuteSql(", strSql, ") ENTERED"))
            Dim sqlCommandParameters() As SqlParameter = Nothing
            If Not commandParameters Is Nothing Then
                sqlCommandParameters = New SqlParameter(commandParameters.Length - 1) {}
                For intIndex As Integer = 0 To commandParameters.Length - 1
                    sqlCommandParameters(intIndex) = CType(commandParameters(intIndex), SqlParameter)
                Next
            End If
            strSql = strSql.Replace("{databaseOwner}", DatabaseOwner)
            strSql = strSql.Replace("{objectQualifier}", ObjectQualifier)
            SendMailToAdmin(String.Concat("FINAL strSql = ", strSql), String.Concat("FINAL strSql = ", strSql))
            Try
                Return CType(SqlHelper.ExecuteReader(ConnectionString, CommandType.Text, strSql, sqlCommandParameters), IDataReader)
            Catch ex As Exception
                SendExceptionToAdmin(ex)
                ' error in SQL query
                Return Nothing
            End Try
        End Function
#End Region
#Region "Abstract Method Implementation"
#Region "General Methods"
        Overrides Function GetConnectionStringBuilder() As DbConnectionStringBuilder
            Return New SqlConnectionStringBuilder
        End Function
        Overrides Function GetNull(ByVal Field As Object) As Object
            Return DotNetNuke.Common.Utilities.Null.GetNull(Field, System.DBNull.Value)
        End Function
#End Region
#Region "Install/Upgrade Methods"
        Overloads Overrides Function ExecuteScript(ByVal Script As String) As String
            Return ExecuteScript(Script, False)
        End Function
        Overloads Overrides Function ExecuteScript(ByVal Script As String, ByVal UseTransactions As Boolean) As String
            Try
                Dim strSql As String = String.Empty
                'Dim Exceptions As String = String.Empty
                Dim sbExceptions As New StringBuilder
                Dim Delimiter As String = String.Concat("GO", Microsoft.VisualBasic.ControlChars.CrLf)
                Dim arrSQL As String() = Split(Script, Delimiter, , CompareMethod.Text)
                If UseTransactions Then
                    Dim Conn As New SqlConnection(UpgradeConnectionString)
                    Conn.Open()
                    Try
                        Dim Trans As SqlTransaction = Conn.BeginTransaction
                        Dim IgnoreErrors As Boolean
                        For Each strSql In arrSQL
                            If Not String.IsNullOrEmpty(strSql) Then
                                ' script dynamic substitution
                                strSql = strSql.Replace("{databaseOwner}", DatabaseOwner)
                                strSql = strSql.Replace("{objectQualifier}", ObjectQualifier)
                                IgnoreErrors = False
                                If strSql.Trim.StartsWith("{IgnoreError}") Then
                                    IgnoreErrors = True
                                    strSql = strSql.Replace("{IgnoreError}", String.Empty)
                                End If
                                Try
                                    ExecuteADOScript(Trans, strSql)
                                Catch objException As SqlException
                                    If Not IgnoreErrors Then
                                        sbExceptions.Append(ExceptionString(objException, strSql))
                                    End If
                                End Try
                            End If
                        Next
                        If sbExceptions.ToString.Length = 0 Then
                            'No exceptions so go ahead and commit
                            Trans.Commit()
                        Else
                            'Found exceptions, so rollback db
                            Trans.Rollback()
                            With sbExceptions
                                .Append("SQL Execution failed.  Database was rolled back")
                                .Append(Environment.NewLine)
                                .Append(Environment.NewLine)
                                .Append(strSql)
                                .Append(Environment.NewLine)
                                .Append(Environment.NewLine)
                            End With
                        End If
                    Finally
                        Conn.Close()
                    End Try
                Else
                    For Each strSql In arrSQL
                        If Not String.IsNullOrEmpty(strSql) Then
                            ' script dynamic substitution
                            strSql = strSql.Replace("{databaseOwner}", DatabaseOwner)
                            strSql = strSql.Replace("{objectQualifier}", ObjectQualifier)
                            Try
                                ExecuteADOScript(strSql)
                            Catch objException As SqlException
                                sbExceptions.Append(ExceptionString(objException, strSql))
                            End Try
                        End If
                    Next
                End If
                ' if the upgrade connection string is specified
                If Not String.Equals(UpgradeConnectionString, ConnectionString) Then
                    Try
                        ' grant execute rights to the public role for all stored procedures. This is
                        ' necesary because the UpgradeConnectionString will create stored procedures
                        ' which restrict execute permissions for the ConnectionString user account.
                        sbExceptions.Append(GrantStoredProceduresPermission("EXECUTE", "public"))
                    Catch objException As SqlException
                        sbExceptions.Append(ExceptionString(objException, strSql))
                    End Try
                    Try
                        ' grant execute or select rights to the public role for all user defined functions based
                        ' on what type of function it is (scalar function or table function). This is
                        ' necesary because the UpgradeConnectionString will create user defined functions
                        ' which restrict execute permissions for the ConnectionString user account.
                        sbExceptions.Append(GrantUserDefinedFunctionsPermission("EXECUTE", "SELECT", "public"))
                    Catch objException As SqlException
                        sbExceptions.Append(ExceptionString(objException, strSql))
                    End Try
                End If
                Return sbExceptions.ToString
            Catch ex As Exception
                SendExceptionToAdmin(ex)
                Return String.Empty
            End Try
        End Function
        Overrides Function FindDatabaseVersion(ByVal Major As Integer, ByVal Minor As Integer, ByVal Build As Integer) As IDataReader
            Return CType(SqlHelper.ExecuteReader(UpgradeConnectionString, QueryName("FindDatabaseVersion"), Major, Minor, Build), IDataReader)
        End Function
        Overrides Function GetDatabaseVersion() As IDataReader
            Return CType(SqlHelper.ExecuteReader(UpgradeConnectionString, QueryName("GetDatabaseVersion")), IDataReader)
        End Function
        Overrides Function GetProviderPath() As String
            SendMailToAdmin("BEGIN GetProviderPath()", "BEGIN GetProviderPath()")
            Try
                Dim objHttpContext As HttpContext = HttpContext.Current
                GetProviderPath = ProviderPath
                If Not String.IsNullOrEmpty(GetProviderPath) Then
                    SendMailToAdmin("GetProviderPath Is Null or Empty", "GetProviderPath Is Null or Empty")
                    GetProviderPath = objHttpContext.Server.MapPath(GetProviderPath)
                    If Directory.Exists(GetProviderPath) Then
                        SendMailToAdmin("DIRECTORY EXISTS", "DIRECTORY EXISTS")
                        Try
                            ' check if database is initialized
                            Dim dr As IDataReader = GetDatabaseVersion()
                            dr.Close()
                        Catch
                            ' initialize the database
                            Dim objStreamReader As StreamReader
                            objStreamReader = File.OpenText(String.Concat(GetProviderPath, "00.00.00.", p_providerConfiguration.DefaultProvider))
                            Dim strScript As String = objStreamReader.ReadToEnd
                            objStreamReader.Close()
                            If Not String.IsNullOrEmpty(ExecuteScript(strScript)) Then
                                GetProviderPath = "ERROR: Could not connect to database specified in connectionString for SqlDataProvider"
                            End If
                        End Try
                    Else
                        SendMailToAdmin("DIRECTORY DOESN'T EXIST", "DIRECTORY DOESN'T EXIST")
                        GetProviderPath = String.Concat("ERROR: providerPath folder ", GetProviderPath, " specified for SqlDataProvider does not exist on web server")
                    End If
                Else
                    SendMailToAdmin("GetProviderPath Is NOT Null or Empty", "GetProviderPath Is NOT Null or Empty")
                    GetProviderPath = "ERROR: providerPath folder value not specified in web.config for SqlDataProvider"
                End If
            Catch ex As Exception
                SendExceptionToAdmin(ex)
                Throw ex
            End Try
            SendMailToAdmin("END GetProviderPath()", String.Concat("GetProviderPath = ", GetProviderPath))
        End Function
        Private Function GrantStoredProceduresPermission(ByVal Permission As String, ByVal LoginOrRole As String) As String
            'Dim SQL As String = String.Empty
            Dim sbSql As New StringBuilder
            Dim Exceptions As String = String.Empty
            Try
                ' grant rights to a login or role for all stored procedures
                With sbSql
                    .Append("declare @exec nvarchar(2000) ")
                    .Append("declare @name varchar(150) ")
                    .Append("declare sp_cursor cursor for select o.name as name ")
                    .Append("from dbo.sysobjects o ")
                    .Append("where ( OBJECTPROPERTY(o.id, N'IsProcedure') = 1 or OBJECTPROPERTY(o.id, N'IsExtendedProc') = 1 or OBJECTPROPERTY(o.id, N'IsReplProc') = 1 ) ")
                    .Append("and OBJECTPROPERTY(o.id, N'IsMSShipped') = 0 ")
                    .Append("and o.name not like N'#%%' ")
                    .Append("and (left(o.name,len('")
                    .Append(ObjectQualifier)
                    .Append("')) = '")
                    .Append(ObjectQualifier)
                    .Append("' or left(o.name,7) = 'aspnet_') ")
                    .Append("open sp_cursor ")
                    .Append("fetch sp_cursor into @name ")
                    .Append("while @@fetch_status >= 0 ")
                    .Append("begin")
                    .Append("  select @exec = 'grant ")
                    .Append(Permission)
                    .Append(" on ' +  @name  + ' to ")
                    .Append(LoginOrRole)
                    .Append("'")
                    .Append("  execute (@exec)")
                    .Append("  fetch sp_cursor into @name ")
                    .Append("end ")
                    .Append("deallocate sp_cursor")
                End With
                SqlHelper.ExecuteNonQuery(UpgradeConnectionString, CommandType.Text, sbSql.ToString)
            Catch objException As SqlException
                SendExceptionToAdmin(objException)
                Exceptions = ExceptionString(objException, sbSql.ToString())
            End Try
            Return Exceptions
        End Function
        Private Function GrantUserDefinedFunctionsPermission(ByVal ScalarPermission As String, ByVal TablePermission As String, ByVal LoginOrRole As String) As String
            Dim sbSql As New StringBuilder
            Dim Exceptions As String = String.Empty
            Try
                ' grant EXECUTE rights to a login or role for all functions
                With sbSql
                    .Append("declare @exec nvarchar(2000) ")
                    .Append("declare @name varchar(150) ")
                    .Append("declare @isscalarfunction int ")
                    .Append("declare @istablefunction int ")
                    .Append("declare sp_cursor cursor for select o.name as name, OBJECTPROPERTY(o.id, N'IsScalarFunction') as IsScalarFunction ")
                    .Append("from dbo.sysobjects o ")
                    .Append("where ( OBJECTPROPERTY(o.id, N'IsScalarFunction') = 1 OR OBJECTPROPERTY(o.id, N'IsTableFunction') = 1 ) ")
                    .Append("and OBJECTPROPERTY(o.id, N'IsMSShipped') = 0 ")
                    .Append("and o.name not like N'#%%' ")
                    .Append("and (left(o.name,len('")
                    .Append(ObjectQualifier)
                    .Append("')) = '")
                    .Append(ObjectQualifier)
                    .Append("' or left(o.name,7) = 'aspnet_') ")
                    .Append("open sp_cursor ")
                    .Append("fetch sp_cursor into @name, @isscalarfunction ")
                    .Append("while @@fetch_status >= 0 ")
                    .Append("begin ")
                    .Append("if @IsScalarFunction = 1 ")
                    .Append("begin")
                    .Append("  select @exec = 'grant ")
                    .Append(ScalarPermission)
                    .Append(" on ' +  @name  + ' to ")
                    .Append(LoginOrRole)
                    .Append("'")
                    .Append("  execute (@exec)")
                    .Append("  fetch sp_cursor into @name, @isscalarfunction  ")
                    .Append("end ")
                    .Append("else ")
                    .Append("begin")
                    .Append("  select @exec = 'grant ")
                    .Append(TablePermission)
                    .Append(" on ' +  @name  + ' to ")
                    .Append(LoginOrRole)
                    .Append("'")
                    .Append("  execute (@exec)")
                    .Append("  fetch sp_cursor into @name, @isscalarfunction  ")
                    .Append("end ")
                    .Append("end ")
                    .Append("deallocate sp_cursor")
                End With
                SqlHelper.ExecuteNonQuery(UpgradeConnectionString, CommandType.Text, sbSql.ToString)
            Catch objException As SqlException
                SendExceptionToAdmin(objException)
                Exceptions = ExceptionString(objException, sbSql.ToString)
            End Try
            Return Exceptions
        End Function
        Overrides Function TestDatabaseConnection(ByVal builder As DbConnectionStringBuilder, ByVal Owner As String, ByVal Qualifier As String) As String
            Try
                Dim sqlBuilder As SqlConnectionStringBuilder = TryCast(builder, SqlConnectionStringBuilder)
                Dim connectionString As String = Null.NullString
                If Not sqlBuilder Is Nothing Then
                    connectionString = sqlBuilder.ToString()
                    Dim dr As IDataReader = Nothing
                    Try
                        dr = SqlHelper.ExecuteReader(connectionString, String.Concat(Owner, Qualifier, "GetDatabaseVersion"))
                    Catch ex As SqlException
                        SendExceptionToAdmin(ex)
                        Dim message As String = "ERROR:"
                        Dim bError As Boolean = True
                        Dim i As Integer
                        Dim errorMessages As New StringBuilder()
                        For i = 0 To ex.Errors.Count - 1
                            Dim sqlError As SqlError = ex.Errors(i)
                            If sqlError.Number = 2812 And sqlError.Class = 16 Then
                                bError = False
                                Exit For
                            Else
                                With errorMessages
                                    .Append("Index #: ")
                                    .Append(i.ToString())
                                    .Append("
Source: ")
                                    .Append(sqlError.Source)
                                    .Append("
Class: ")
                                    .Append(sqlError.Class)
                                    .Append("
Number: ")
                                    .Append(sqlError.Number)
                                    .Append("
Message: ")
                                    .Append(sqlError.Message)
                                    .Append("

")
                                End With
                            End If
                        Next i
                        If bError Then
                            connectionString = String.Concat(message, errorMessages.ToString())
                        End If
                    Finally
                        If Not dr Is Nothing Then
                            dr.Close()
                        End If
                    End Try
                Else
                    'Invalid DbConnectionStringBuilder
                End If
                Return connectionString
            Catch ex As Exception
                SendExceptionToAdmin(ex)
                Return String.Empty
            End Try
        End Function
        Overrides Sub UpgradeDatabaseSchema(ByVal Major As Integer, ByVal Minor As Integer, ByVal Build As Integer)
            ' not necessary for SQL Server - use Transact-SQL scripts
        End Sub
        Public Overrides Sub UpdateDatabaseVersion(ByVal Major As Integer, ByVal Minor As Integer, ByVal Build As Integer)
            SqlHelper.ExecuteNonQuery(UpgradeConnectionString, QueryName("UpdateDatabaseVersion"), Major, Minor, Build)
        End Sub
#End Region

        ' host
        Overrides Function GetHostSettings() As IDataReader
            Return CType(SqlHelper.ExecuteReader(ConnectionString, QueryName("GetHostSettings")), IDataReader)
        End Function
        Overrides Function GetHostSetting(ByVal SettingName As String) As IDataReader
            Return CType(SqlHelper.ExecuteReader(ConnectionString, QueryName("GetHostSetting"), SettingName), IDataReader)
        End Function
        Overrides Sub AddHostSetting(ByVal SettingName As String, ByVal SettingValue As String, ByVal SettingIsSecure As Boolean)
            SqlHelper.ExecuteNonQuery(ConnectionString, QueryName("AddHostSetting"), SettingName, SettingValue, SettingIsSecure)
        End Sub
        Overrides Sub UpdateHostSetting(ByVal SettingName As String, ByVal SettingValue As String, ByVal SettingIsSecure As Boolean)
            SqlHelper.ExecuteNonQuery(ConnectionString, QueryName("UpdateHostSetting"), SettingName, SettingValue, SettingIsSecure)
        End Sub
        ' portal
        Overrides Function AddPortalInfo(ByVal PortalName As String, ByVal Currency As String, ByVal FirstName As String, ByVal LastName As String, ByVal Username As String, ByVal Password As String, ByVal Email As String, ByVal ExpiryDate As Date, ByVal HostFee As Double, ByVal HostSpace As Double, ByVal PageQuota As Integer, ByVal UserQuota As Integer, ByVal SiteLogHistory As Integer, ByVal HomeDirectory As String) As Integer
            Return CType(SqlHelper.ExecuteScalar(ConnectionString, QueryName("AddPortalInfo"), PortalName, Currency, GetNull(ExpiryDate), HostFee, HostSpace, PageQuota, UserQuota, GetNull(SiteLogHistory), HomeDirectory), Integer)
        End Function
        Overrides Function CreatePortal(ByVal PortalName As String, ByVal Currency As String, ByVal ExpiryDate As Date, ByVal HostFee As Double, ByVal HostSpace As Double, ByVal PageQuota As Integer, ByVal UserQuota As Integer, ByVal SiteLogHistory As Integer, ByVal HomeDirectory As String) As Integer
            Return CType(SqlHelper.ExecuteScalar(ConnectionString, QueryName("AddPortalInfo"), PortalName, Currency, GetNull(ExpiryDate), HostFee, HostSpace, PageQuota, UserQuota, GetNull(SiteLogHistory), HomeDirectory), Integer)
        End Function
        Overrides Sub DeletePortalInfo(ByVal PortalId As Integer)
            SqlHelper.ExecuteNonQuery(ConnectionString, QueryName("DeletePortalInfo"), PortalId)
        End Sub
        Overrides Function GetExpiredPortals() As IDataReader
            Return CType(SqlHelper.ExecuteReader(ConnectionString, QueryName("GetExpiredPortals")), IDataReader)
        End Function
        Overrides Function GetPortal(ByVal PortalId As Integer) As IDataReader
            Return CType(SqlHelper.ExecuteReader(ConnectionString, QueryName("GetPortal"), PortalId), IDataReader)
        End Function
        Overrides Function GetPortalByAlias(ByVal PortalAlias As String) As IDataReader
            Return CType(SqlHelper.ExecuteReader(ConnectionString, QueryName("GetPortalByAlias"), PortalAlias), IDataReader)
        End Function
        Overrides Function GetPortalByTab(ByVal TabId As Integer, ByVal PortalAlias As String) As IDataReader
            Return CType(SqlHelper.ExecuteReader(ConnectionString, QueryName("GetPortalByTab"), TabId, PortalAlias), IDataReader)
        End Function
        Overrides Function GetPortalCount() As Integer
            Return CType(SqlHelper.ExecuteScalar(ConnectionString, QueryName("GetPortalCount")), Integer)
        End Function
        Overrides Function GetPortals() As IDataReader
            Return CType(SqlHelper.ExecuteReader(ConnectionString, QueryName("GetPortals")), IDataReader)
        End Function
        Overrides Function GetPortalsByName(ByVal nameToMatch As String, ByVal pageIndex As Integer, ByVal pageSize As Integer) As IDataReader
            Return CType(SqlHelper.ExecuteReader(ConnectionString, QueryName("GetPortalsByName"), nameToMatch, pageIndex, pageSize), IDataReader)
        End Function
        Overrides Function GetPortalSpaceUsed(ByVal PortalId As Integer) As IDataReader
            Return CType(SqlHelper.ExecuteReader(ConnectionString, QueryName("GetPortalSpaceUsed"), GetNull(PortalId)), IDataReader)
        End Function
        Overrides Sub UpdatePortalInfo(ByVal PortalId As Integer, ByVal PortalName As String, ByVal LogoFile As String, ByVal FooterText As String, ByVal ExpiryDate As Date, ByVal UserRegistration As Integer, ByVal BannerAdvertising As Integer, ByVal Currency As String, ByVal AdministratorId As Integer, ByVal HostFee As Double, ByVal HostSpace As Double, ByVal PageQuota As Integer, ByVal UserQuota As Integer, ByVal PaymentProcessor As String, ByVal ProcessorUserId As String, ByVal ProcessorPassword As String, ByVal Description As String, ByVal KeyWords As String, ByVal BackgroundFile As String, ByVal SiteLogHistory As Integer, ByVal SplashTabId As Integer, ByVal HomeTabId As Integer, ByVal LoginTabId As Integer, ByVal UserTabId As Integer, ByVal DefaultLanguage As String, ByVal TimeZoneOffset As Integer, ByVal HomeDirectory As String)
            SqlHelper.ExecuteNonQuery(ConnectionString, QueryName("UpdatePortalInfo"), PortalId, PortalName, GetNull(LogoFile), GetNull(FooterText), GetNull(ExpiryDate), UserRegistration, BannerAdvertising, Currency, GetNull(AdministratorId), HostFee, HostSpace, PageQuota, UserQuota, GetNull(PaymentProcessor), GetNull(ProcessorUserId), GetNull(ProcessorPassword), GetNull(Description), GetNull(KeyWords), GetNull(BackgroundFile), GetNull(SiteLogHistory), GetNull(SplashTabId), GetNull(HomeTabId), GetNull(LoginTabId), GetNull(UserTabId), GetNull(DefaultLanguage), GetNull(TimeZoneOffset), HomeDirectory)
        End Sub
        Overrides Sub UpdatePortalSetup(ByVal PortalId As Integer, ByVal AdministratorId As Integer, ByVal AdministratorRoleId As Integer, ByVal RegisteredRoleId As Integer, ByVal SplashTabId As Integer, ByVal HomeTabId As Integer, ByVal LoginTabId As Integer, ByVal UserTabId As Integer, ByVal AdminTabId As Integer)
            SqlHelper.ExecuteNonQuery(ConnectionString, QueryName("UpdatePortalSetup"), PortalId, AdministratorId, AdministratorRoleId, RegisteredRoleId, SplashTabId, HomeTabId, LoginTabId, UserTabId, AdminTabId)
        End Sub
        Overrides Function VerifyPortal(ByVal PortalId As Integer) As IDataReader
            Return CType(SqlHelper.ExecuteReader(ConnectionString, QueryName("VerifyPortal"), PortalId), IDataReader)
        End Function
        Overrides Function VerifyPortalTab(ByVal PortalId As Integer, ByVal TabId As Integer) As IDataReader
            Return CType(SqlHelper.ExecuteReader(ConnectionString, QueryName("VerifyPortalTab"), PortalId, TabId), IDataReader)
        End Function
        ' tab
        Overloads Overrides Function AddTab(ByVal PortalId As Integer, ByVal TabName As String, ByVal IsVisible As Boolean, ByVal DisableLink As Boolean, ByVal ParentId As Integer, ByVal IconFile As String, ByVal Title As String, ByVal Description As String, ByVal KeyWords As String, ByVal Url As String, ByVal SkinSrc As String, ByVal ContainerSrc As String, ByVal TabPath As String, ByVal StartDate As Date, ByVal EndDate As Date, ByVal RefreshInterval As Integer, ByVal PageHeadText As String) As Integer
            Return CType(SqlHelper.ExecuteScalar(ConnectionString, QueryName("AddTab"), GetNull(PortalId), TabName, IsVisible, DisableLink, GetNull(ParentId), IconFile, Title, Description, KeyWords, Url, GetNull(SkinSrc), GetNull(ContainerSrc), TabPath, GetNull(StartDate), GetNull(EndDate), GetNull(RefreshInterval), GetNull(PageHeadText)), Integer)
        End Function
        _
         Overloads Overrides Sub UpdateTab(ByVal TabId As Integer, ByVal TabName As String, ByVal IsVisible As Boolean, ByVal DisableLink As Boolean, ByVal ParentId As Integer, ByVal IconFile As String, ByVal Title As String, ByVal Description As String, ByVal KeyWords As String, ByVal IsDeleted As Boolean, ByVal Url As String, ByVal SkinSrc As String, ByVal ContainerSrc As String, ByVal TabPath As String, ByVal StartDate As Date, ByVal EndDate As Date)
            SqlHelper.ExecuteNonQuery(ConnectionString, QueryName("UpdateTab"), TabId, TabName, IsVisible, DisableLink, GetNull(ParentId), IconFile, Title, Description, KeyWords, IsDeleted, Url, GetNull(SkinSrc), GetNull(ContainerSrc), TabPath, GetNull(StartDate), GetNull(EndDate))
        End Sub
        Overloads Overrides Sub UpdateTab(ByVal TabId As Integer, ByVal TabName As String, ByVal IsVisible As Boolean, ByVal DisableLink As Boolean, ByVal ParentId As Integer, ByVal IconFile As String, ByVal Title As String, ByVal Description As String, ByVal KeyWords As String, ByVal IsDeleted As Boolean, ByVal Url As String, ByVal SkinSrc As String, ByVal ContainerSrc As String, ByVal TabPath As String, ByVal StartDate As Date, ByVal EndDate As Date, ByVal RefreshInterval As Integer, ByVal PageHeadText As String)
            SqlHelper.ExecuteNonQuery(ConnectionString, QueryName("UpdateTab"), TabId, TabName, IsVisible, DisableLink, GetNull(ParentId), IconFile, Title, Description, KeyWords, IsDeleted, Url, GetNull(SkinSrc), GetNull(ContainerSrc), TabPath, GetNull(StartDate), GetNull(EndDate), GetNull(RefreshInterval), GetNull(PageHeadText))
        End Sub
        Overrides Sub UpdateTabOrder(ByVal TabId As Integer, ByVal TabOrder As Integer, ByVal Level As Integer, ByVal ParentId As Integer, ByVal TabPath As String)
            SqlHelper.ExecuteNonQuery(ConnectionString, QueryName("UpdateTabOrder"), TabId, TabOrder, Level, GetNull(ParentId), TabPath)
        End Sub
        Overrides Sub DeleteTab(ByVal TabId As Integer)
            SqlHelper.ExecuteNonQuery(ConnectionString, QueryName("DeleteTab"), TabId)
        End Sub
        Overrides Function GetTabs(ByVal PortalId As Integer) As IDataReader
            Return CType(SqlHelper.ExecuteReader(ConnectionString, QueryName("GetTabs"), GetNull(PortalId)), IDataReader)
        End Function
        Overrides Function GetAllTabs() As IDataReader
            Return CType(SqlHelper.ExecuteReader(ConnectionString, QueryName("GetAllTabs")), IDataReader)
        End Function
        Overrides Function GetTab(ByVal TabId As Integer) As IDataReader
            Return CType(SqlHelper.ExecuteReader(ConnectionString, QueryName("GetTab"), TabId), IDataReader)
        End Function
        Overrides Function GetTabByName(ByVal TabName As String, ByVal PortalId As Integer) As IDataReader
            Return CType(SqlHelper.ExecuteReader(ConnectionString, QueryName("GetTabByName"), TabName, GetNull(PortalId)), IDataReader)
        End Function
        Overrides Function GetTabCount(ByVal PortalId As Integer) As Integer
            Return CType(SqlHelper.ExecuteScalar(ConnectionString, QueryName("GetTabCount"), PortalId), Integer)
        End Function
        Overrides Function GetTabsByParentId(ByVal ParentId As Integer) As IDataReader
            Return CType(SqlHelper.ExecuteReader(ConnectionString, QueryName("GetTabsByParentId"), ParentId), IDataReader)
        End Function
        Overrides Function GetTabPanes(ByVal TabId As Integer) As IDataReader
            Return CType(SqlHelper.ExecuteReader(ConnectionString, QueryName("GetTabPanes"), TabId), IDataReader)
        End Function
        Overrides Function GetPortalTabModules(ByVal PortalId As Integer, ByVal TabId As Integer) As IDataReader
            Return CType(SqlHelper.ExecuteReader(ConnectionString, QueryName("GetTabModules"), TabId), IDataReader)
        End Function
        Overrides Function GetTabModules(ByVal TabId As Integer) As IDataReader
            Return CType(SqlHelper.ExecuteReader(ConnectionString, QueryName("GetTabModules"), TabId), IDataReader)
        End Function
        ' module
        Overrides Function GetAllModules() As IDataReader
            Return CType(SqlHelper.ExecuteReader(ConnectionString, QueryName("GetAllModules")), IDataReader)
        End Function
        Overrides Function GetModules(ByVal PortalId As Integer) As IDataReader
            Return CType(SqlHelper.ExecuteReader(ConnectionString, QueryName("GetModules"), PortalId), IDataReader)
        End Function
        Overrides Function GetAllTabsModules(ByVal PortalId As Integer, ByVal AllTabs As Boolean) As IDataReader
            Return CType(SqlHelper.ExecuteReader(ConnectionString, QueryName("GetAllTabsModules"), PortalId, AllTabs), IDataReader)
        End Function
        Overrides Function GetModule(ByVal ModuleId As Integer, ByVal TabId As Integer) As IDataReader
            Return CType(SqlHelper.ExecuteReader(ConnectionString, QueryName("GetModule"), ModuleId, GetNull(TabId)), IDataReader)
        End Function
        Overrides Function GetModuleByDefinition(ByVal PortalId As Integer, ByVal FriendlyName As String) As IDataReader
            Return CType(SqlHelper.ExecuteReader(ConnectionString, QueryName("GetModuleByDefinition"), GetNull(PortalId), FriendlyName), IDataReader)
        End Function
        Overrides Function AddModule(ByVal PortalID As Integer, ByVal ModuleDefID As Integer, ByVal ModuleTitle As String, ByVal AllTabs As Boolean, ByVal Header As String, ByVal Footer As String, ByVal StartDate As DateTime, ByVal EndDate As DateTime, ByVal InheritViewPermissions As Boolean, ByVal IsDeleted As Boolean) As Integer
            Return CType(SqlHelper.ExecuteScalar(ConnectionString, QueryName("AddModule"), GetNull(PortalID), ModuleDefID, ModuleTitle, AllTabs, GetNull(Header), GetNull(Footer), GetNull(StartDate), GetNull(EndDate), InheritViewPermissions, IsDeleted), Integer)
        End Function
        Overrides Sub UpdateModule(ByVal ModuleId As Integer, ByVal ModuleTitle As String, ByVal AllTabs As Boolean, ByVal Header As String, ByVal Footer As String, ByVal StartDate As DateTime, ByVal EndDate As DateTime, ByVal InheritViewPermissions As Boolean, ByVal IsDeleted As Boolean)
            SqlHelper.ExecuteNonQuery(ConnectionString, QueryName("UpdateModule"), ModuleId, ModuleTitle, AllTabs, GetNull(Header), GetNull(Footer), GetNull(StartDate), GetNull(EndDate), InheritViewPermissions, IsDeleted)
        End Sub
        Overrides Sub DeleteModule(ByVal ModuleId As Integer)
            SqlHelper.ExecuteNonQuery(ConnectionString, QueryName("DeleteModule"), ModuleId)
        End Sub
        Overrides Function GetTabModuleOrder(ByVal TabId As Integer, ByVal PaneName As String) As IDataReader
            Return CType(SqlHelper.ExecuteReader(ConnectionString, QueryName("GetTabModuleOrder"), TabId, PaneName), IDataReader)
        End Function
        Overrides Sub UpdateModuleOrder(ByVal TabId As Integer, ByVal ModuleId As Integer, ByVal ModuleOrder As Integer, ByVal PaneName As String)
            SqlHelper.ExecuteNonQuery(ConnectionString, QueryName("UpdateModuleOrder"), TabId, ModuleId, ModuleOrder, PaneName)
        End Sub
        Overrides Sub AddTabModule(ByVal TabId As Integer, ByVal ModuleId As Integer, ByVal ModuleOrder As Integer, ByVal PaneName As String, ByVal CacheTime As Integer, ByVal Alignment As String, ByVal Color As String, ByVal