ConnectionString属性尚未初始化

时间:2009-07-15 04:58:52

标签: vb.net connection-string

我在不同的论坛上看了很多帖子,其他人也收到了同样的错误。大多数人说他们没有正确引用web.config文件中的连接字符串,或者他们在设置连接字符串之前尝试打开连接。好吧,如果对我来说就是这种情况,那么它如何在两个不同的系统上运行,而不是在第三个系统上呢?它适用于我的开发PC和开发服务器,但不适用于生产环境。不同之处在于,Web和数据库服务器是我的生产环境中单独的物理服务器,也是单个服务器上用于开发的。我的设置,错误消息和代码将在下面列出。

如果我将web.config文件(appsettings,connectionstrings)的任一部分中的连接字符串重命名为其他内容,我可以在我的PC上模拟错误。你会看到我在下面测试过的。

任何帮助都会非常感激,因为我在时间紧迫的情况下想知道为什么这在生产环境中不起作用。


'/'应用程序中的服务器错误。

ConnectionString属性尚未初始化。

描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中的起源位置的更多信息。

异常详细信息:System.InvalidOperationException:尚未初始化ConnectionString属性。

Line 114:
Line 115:  Private Sub Page_Error(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Error
Line 116:   ErrHandler.LogError(Server.GetLastError)
Line 117:  End Sub
Line 118:

Source File: D:\IIS\SSIP\web\App_Code\SitePage.vb    Line: 116
[InvalidOperationException: The ConnectionString property has not been initialized.]
   System.Data.SqlClient.SqlConnection.PermissionDemand() +4876643
   System.Data.SqlClient.SqlConnectionFactory.PermissionDemand(DbConnection outerConnection) +20
   System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) +117
   System.Data.SqlClient.SqlConnection.Open() +122
   Database.Open(String connectionstring) in C:\wwwroot\EIIASSIP\common\Core\Database.vb:47
   Components.BasePage.get_DB() in C:\wwwroot\EIIASSIP\common\Core\BasePage.vb:41
   Components.BasePage.get_ErrHandler() in C:\wwwroot\EIIASSIP\common\Core\BasePage.vb:49
   Components.SitePage.Page_Error(Object sender, EventArgs e) in D:\IIS\SSIP\web\App_Code\SitePage.vb:116
'** web.config'
<appSettings>
    <add key="ConnectionString" value="Persist Security Info=True;Initial Catalog=[database];Data Source=[server];User ID={0};Password={1};"/>
</appSettings>

<connectionStrings>
    <add name="ConnectionString" connectionString="Data Source=[server];Initial Catalog=[database];Persist Security Info=True;User ID={0};Password={1};" providerName="System.Data.SqlClient"/>
</connectionStrings>

'** BasePage.vb'
Public ReadOnly Property DB() As Database
    Get
        If m_DB Is Nothing Then
            'open database connection
            m_DB = New Database
            m_DB.Open(ConnectionString) ' ********** Line 41'
        End If
        Return m_DB
    End Get
End Property

Public ReadOnly Property ErrHandler() As ErrorHandler
    Get
        If m_ErrHandler Is Nothing Then m_ErrHandler = New ErrorHandler(DB)
        Return m_ErrHandler '**********Line 49'
    End Get
End Property

Private Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit
    'if using "appSettings" section for connectionstring'
    ConnectionString = DBConnectionString.GetConnectionString(ConfigurationManager.AppSettings("ConnectionString"), ConfigurationManager.AppSettings("ConnectionStringUsername"), ConfigurationManager.AppSettings("ConnectionStringPassword"))
    'if using "connectionStrings" section for getting connectionstring'
    'ConnectionString = DBConnectionString.GetConnectionString(ConnectionStrings.Item("ConnectionString").ConnectionString, AppSettings("ConnectionStringUsername"), AppSettings("ConnectionStringPassword"))'
End Sub

'** ConnectionStrings.vb'
Public Shared Function GetConnectionString(ByVal cs, ByVal Username, ByVal Password) As String
    Dim ConnString As DBConnectionString = New DBConnectionString(cs, Username, Password)
    Return ConnString.ConnectionString
End Function

'** Database.vb'
    Public Sub Open(ByVal connectionstring As String)
        RefCount = RefCount + 1

        If con Is Nothing Then
            con = New SqlConnection(connectionstring)
        End If
        If Not IsOpen() Then
            con.Open() ' ********** Line 47'
        End If
    End Sub

'** SitePage.vb'
Private Sub Page_Error(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Error
    ErrHandler.LogError(Server.GetLastError) '********** Line 116'
End Sub

2 个答案:

答案 0 :(得分:1)

包括几个因素,您需要进一步测试。

*)请确保您的连接字符串确实正确。您可以尝试连接到同一服务器但不同的数据库。但是请确保连接字符串是正确的,这样我们就可以消除一种可能性。

*)数据库服务器和应用服务器之间是否有防火墙?因为如果连接在一段时间后保持打开状态,防火墙可能会终止现有的SQL Server连接。某些防火墙硬件具有一些配置,可在X时间后自动终止SQL连接

*)我认为有一种方法或一些代码片段可以测试SQL连接是否已经建立。或者请执行此操作:

  • 创建一个文件,即connection.udl(确保它不是connection.udl.txt,但应该是connection.udl)。该文件应在APP服务器上创建。
  • 双击该文件
  • 配置必要的连接字符串
  • 最后点击“测试连接”
  • 如果测试连接成功运行,则表示它可以很好地连接到数据库服务器

编辑:

这个特殊的错误行非常有趣:System.Data.SqlClient.SqlConnection.PermissionDemand() 从错误消息堆栈跟踪中可以看出,也许你需要使用PermissionDemand关键字进行谷歌搜索。

另一件事:您是否尝试过使用Windows集成身份验证或SQL身份验证?尝试使用Windows用户或SQL用户并检查结果。我在您的连接字符串中看到,在web.config中,您使用的是Integrated Security = true,这意味着它将对运行ASP.NET Web应用程序的应用程序池的用户帐户进行身份验证。我怀疑此用户帐户没有足够的权限来访问SQL Server。

要本地化问题,尝试使用SQL身份验证进行身份验证,如果有效,则表示此集成安全性是罪魁祸首

您可以检查运行当前ASP.NET Web应用程序的应用程序池的用户帐户吗?

答案 1 :(得分:0)

我明白了。我决定查看我的应用程序池并将开发服务器与生产服务器进行比较。我找到了解决问题的一个区别。

两台服务器都使用IIS7,因为它们自然位于Windows 2008 Server上。我转到每个应用程序池的“高级设置”,并注意到“常规”部分下的“启用32位应用程序”在网站工作的开发服务器上设置为False,在生产服务器上设置为True,但它不起作用。所以我在生产服务器上将其切换为False以使其正常工作!

感谢哈迪的时间和帮助。

相关问题