zoukankan      html  css  js  c++  java
  • DotNetNuke中理解{objectQualifier} {databaseOwner} dodo

     
     

    在DotNetNuke3.0中,如果我们用英文版安装的时候,在数据库中我们可以看到大部分表都有一个前缀_DNN。为什么要设置这个前缀呢,是因为利用objectqualifier(表现为前缀),可以允许在同一个数据库中建立多个主机。在每个存储过程和表中都指定了objectqualifier。例如,你可以设置一个主机利用 'DNN1'作为前缀,同时设置另一个主机的前缀为'DNN2'。通过这种方式,可以在同一个数据库中生成两个用户表,其结构一致,功能一致,但是一个表名为DNN1_Portals,另一个表名为DNN2_Portals。这两个表且能够在同一个数据库并行运行,而不相互影响。

    在什么地方设置表安装时候的前缀呢?在DNN3.0 web.config(第273行)中,我们可以看看

        <data defaultProvider="SqlDataProvider">

            <providers>

                <clear />

                <add name="SqlDataProvider"

                    type="DotNetNuke.Data.SqlDataProvider, DotNetNuke.SqlDataProvider"

                    connectionStringName="SiteSqlServer"

                    upgradeConnectionString=""

                    providerPath="~\Providers\DataProviders\SqlDataProvider\"

                    objectQualifier="DNN"

                    databaseOwner="dbo" />

            </providers>

        </data>

    在这个xml节中,objectQualifier="DNN"设置了前缀,所有的表和存储过程,就加上了这个相应地前缀。上边的实例中,只不过在这里设置了两个不同的前缀而已,一个为"DNN1",一个为"DNN2"罢了。

    接下来,我们先看看在创建表和存储过程的SQL脚本中,其具体实现。

    CREATE TABLE {databaseOwner}{objectQualifier}PortalAlias (

        [PortalAliasID] [int] IDENTITY (1, 1) NOT NULL ,

        [PortalID] [int] NOT NULL ,

        [HTTPAlias] [varchar] (200)

    ) ON [PRIMARY]

    GO

     

    CREATE procedure {databaseOwner}{objectQualifier}GetPortalByAlias

    @HTTPAlias nvarchar(200)

    可以看到在表和存储过程中,都需要加上 {databaseOwner}{objectQualifier}这个前缀。我们可以在存储过程中看到这样一个存储过程DNN_GetPortalByAlias。那么我们在实际使用这样一个带前缀的存储过程的时候,如何保证正确使用存储过程呢?

    在具体的应用中,我们在vb代码中利用DatabaseOwner and ObjectQualifier来保证我们正确的使用这些存储过程。下边看一个对该存储过程使用的实例:

        Public Overrides Function GetPortalByAlias(ByVal PortalAlias As String) As IDataReader

    Return CType(SqlHelper.ExecuteReader(ConnectionString, DatabaseOwner & ObjectQualifier & "GetPortalByAlias", PortalAlias), IDataReader)

          该语句实现利用MS的数据访问块之方法SqlHelper.ExecuteReader,在使用该方法中,常规方式中我们所传入的参数中存储过程名 "GetPortalByAlias",加了前缀后,我们所传入的参数中存储过程名

    DatabaseOwner & ObjectQualifier & "GetPortalByAlias" ,这里的DatabaseOwner和ObjectQualifier 是在类中的定义好的两个属性

            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

    通过这两个属性,得到web.config中已定义好的objectQualifier="DNN" 和databaseOwner="dbo" ,也就是得到了定义好的前缀"DNN"和"dbo" 。关于在属性实现中,如何得到_objectQualifier和_databaseOwner这些配置信息呢?是通过以下方法来实现的

     Public Class SqlDataProvider

            Inherits DataProvider

            Private Const ProviderType As String = "data"

        '读取data配置节信息

            Private _providerConfiguration As ProviderConfiguration = ProviderConfiguration.GetProviderConfiguration(ProviderType)

            Private _connectionString As String

            Private _providerPath As String

            Private _objectQualifier As String

            Private _databaseOwner As String

            Private _upgradeConnectionString As String

     

            Public Sub New()

                '读取DefaultProvider配置节信息

                Dim objProvider As Provider = CType(_providerConfiguration.Providers(_providerConfiguration.DefaultProvider), Provider)

     

                ' 读取Provider的属性
                If objProvider.Attributes("connectionStringName") <> "" AndAlso _

                System.Configuration.ConfigurationSettings.AppSettings(objProvider.Attributes("connectionStringName")) <> "" Then

                    _connectionString = System.Configuration.ConfigurationSettings.AppSettings(objProvider.Attributes("connectionStringName"))

                Else

                    _connectionString = objProvider.Attributes("connectionString")

                End If

     

     

                _providerPath = objProvider.Attributes("providerPath")

     

                _objectQualifier = objProvider.Attributes("objectQualifier")

       '依次读取,并得到配置节点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

     

                If Convert.ToString(objProvider.Attributes("upgradeConnectionString")) <> "" Then

                    _upgradeConnectionString = objProvider.Attributes("upgradeConnectionString")

                Else

                    _upgradeConnectionString = _connectionString

                End If

            End Sub

  • 相关阅读:
    负载(Load)分析及问题排查
    MySQL 数据库规范--调优篇(终结篇)
    AbstractQueuedSynchronizer
    为什么String被设计为不可变?是否真的不可变?
    数据库 分库 分表 分区
    Oracle 数据库知识汇总篇
    小知识:如何判断数据文件的高水位线
    RHEL7安装11204 RAC的注意事项
    案例:DG主库未设置force logging导致备库坏块
    Oracle 11g RAC之HAIP相关问题总结
  • 原文地址:https://www.cnblogs.com/zgqys1980/p/415504.html
Copyright © 2011-2022 走看看