ASP.NET的MEMBERSHIP問題:你在用WEBPART, 登陸控件的時候,可能會發生的數據庫連接錯誤。

在我使用WEBPART,或登陸控件的時候,簡單的加載webpart,或任意一個登錄控件,有可能會返回一個這樣的錯誤:

在建立與服務器的連接時出錯。在連接到 SQL Server 2005 時,在默認的設置下 SQL Server 不允許進行遠程連接可能會導致此失敗。 (provider: SQL 網絡接口, error: 26 - 定位指定的服務器/實例時出錯)



仔細察看我的頁面,其實沒有任何與數據庫連接的地方,爲什麼頁面會出現來自數據庫連接的錯誤呢?

問題在這裏:

使用WEBPART, 登錄控件如:login control 等,它們其實會嘗試建立一個數據的連接,去尋找與它相關的記錄在數據庫裏的信息。因爲ASP.NET 2.0的MEMBERSHIP PROVIDER是依賴微軟自生成的一系列表和存儲過程,視圖運行的。如果你沒有正確建立起WEBPART,登錄控件與這個數據表的連接,那麼你將會返回上述錯誤。

那麼,如何解決這個問題呢?

要使用WEBPART,或者登錄控件等,你就必須建立一個PROVIDER。並確定由VISUAL STUDIO生成的表被正確地導入你指定的數據庫中。在默認情況下,比如說,如果你安裝了SQL2005 express, 這個表將會被自動創建,以*.MDF名字出現在你的站點程序的APP_DATA中。如果你沒有在安裝visual studio 2005的時候安裝sql2005 express, 你就當然無法建立這個表。因爲賴以存在的sql 2005 express都沒有被安裝。

如果你沒有安裝sql 2005 express, 或者你不希望系統默認的使用sql 2005 express, 而是指定一個你希望的SQL服務,那麼應該怎麼辦呢?

解決辦法一:

這是最標準的辦法,也是最簡單的辦法,但是有可能會不成功,不成功不怕,我們將繼續尋找解決方案。

在 /$WINDOWS/Microsoft.NET/Framework/v2.0.50727 下找到文件:aspnet_regsql.exe 運行它。根據嚮導一步一步建立你的數據庫信息。(當然,你應該知道你自己的數據庫IP地址,用戶名和密碼),完成後,察看你的目標數據庫,應該會看到以下表:


以ASPNET開頭的就是系統生成的表。這是你在使用WEBPART,登錄控件等必須用到的表。如果你沒有發現這些表,你可以嘗試刷新一下數據庫。如果還沒有,就恐怕要再來一次了。

B.確定自己得到了這些表後,下一步,就是要爲自己建立一個正確的PROVIDER的數據連接了。

在一般情況下,你的配置已經被aspnet_reqsql悄悄地修改成功了。在你再次運行程序時,你就可以正確訪問你原來出錯的頁面了。但也有例外。在這個時候,你有兩週選擇,一種是改變aspnet的默認provider 屬性,一種是重新構造新的provider參數。

第二種方法涉及到另外一個研究課題:provider ,我們有時間專門講解吧。我現在專門說說第一種解決辦法,就是改變aspnet的默認provider配置。

我們這樣考慮:
竟然需要的表已經被自動建立了,那麼剩下的事情肯定是在建立連接的部分出現錯誤了,只要找到建立連接的部分,然後查看連接串,並把它們改到我們需要的數據庫上,這個建立不就成功了嗎?

這時,你需要用到這個文件:
/WINDOWS/Microsoft.NET/Framework/v2.0.50727/CONFIG/machine.config

machine.config 是什麼?你可以自己去看看文檔了。但是這裏有一句話是值得我們關注的:

<connectionStrings>
    <add name="LocalSqlServer" connectionString="data source=./SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient" />
  </connectionStrings>

還有這句:

<membership>
      <providers>
        <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="LocalSqlServer" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" applicationName="/" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="1" passwordAttemptWindow="10" passwordStrengthRegularExpression="" />
      </providers>
    </membership>
這說明了,membership provider 其實調用的是localSqlServer, 而默認的localSqlServer connectionString是指向SQLEXPRESS的!! 那麼一來,我們只是需要修改這一行,就可以達到我們的目的了。

<add name="LocalSqlServer" connectionString="Data Source=〔數據庫服務器名字〕;Initial Catalog=〔默認數據庫〕;User ID=〔〕;Password=〔〕"
      providerName="System.Data.SqlClient" providerName="System.Data.SqlClient" />
  </connectionStrings>


這樣,membership provider 的連接就被改掉了,你自然可以訪問到目標數據庫了。

後注:其實你知道原理以後,應該完全可以不修改machine.config的文件,而是在web.config中通過重新定義localSqlserver的各項參數就可以達到目的

如下:

<connectionStrings>
    <remove name="LocalSqlServer"/>
   <add name="LocalSqlServer" connectionString="Server=(local); UID=sa; PWD=sa; DataBase=aspnetdb;" providerName="System.Data.SqlClient" />
  </connectionStrings>

其實也就是刪除machine.config中的文件,再加上一樣的名稱的.當然直接在machine.config文件中修改也是一樣的
我是PAMPAS, 歡迎你的參與。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章