2006年6月14日 星期三

連接aspnetdb問題的解決方式

最近在測試ASP .NET 2.0網站登入管理相關的控制項,因為不是用SQL Server 2005的Express版本,所以一開頭就碰了個大釘子,找了不少網站查資料,再加上自己的測試,整理出以下的幾個方法:

方法一:直接修改machine.config(爛方法不要用,除非你以後都不再寫其他網站應用程式)

檔案路徑在C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config,修改<connectionStrings>區段,改成自己的資料庫連線字串定義。

<connectionStrings>
<add name="LocalSqlServer" connectionString="data source=127.0.0.1;Integrated Security=SSPI;Initial Catalog=aspnetdb;" providerName="System.Data.SqlClient" />
</connectionStrings>

方法二:所有網站應用程式共用同一個apsnetdb(SQL Server 2000也適用)
如果機器上裝的不是Express版,或是資料庫不在本機上,就要先在Visual Studio 2005 命令提示字元執行aspnet_regsql.exe,aspnet_regsql會在SQL SERVER上建立一個aspnetdb資料庫,接著將Web.Config中的<connectionStrings>區段,改成自己的資料庫連線字串定義。
<connectionStrings>
<remove name="LocalSqlServer" />
<add name="LocalSqlServer" connectionString="data source=127.0.0.1;Integrated Security=SSPI;Initial Catalog=aspnetdb;" providerName="System.Data.SqlClient" />
</connectionStrings>
但是因為在C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config中
<membership>、<profile>、<roleManager>三個區段內的applicationName attrib都設定為"\",所以如果不修改就直接使用,多個網站的member、role及profile資料都會混在一起,除非自行在web.config加入以下這些設定,並設定applicationName attrib(字很小,看到了嗎?我設為applicationName="WebSite1" )

<membership>
<providers>
<remove name="AspNetSqlMembershipProvider" />
<add name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="LocalSqlServer"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="WebSite1"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="1"
passwordAttemptWindow="10"
passwordStrengthRegularExpression="" />
</providers>
</membership>
<profile>
<providers>
<remove name="AspNetSqlProfileProvider" />
<add name="AspNetSqlProfileProvider"
connectionStringName="LocalSqlServer"
applicationName="WebSite1"
type="System.Web.Profile.SqlProfileProvider" />
</providers>
</profile>

<roleManager enabled="true">
<providers>
<remove name="AspNetSqlRoleProvider" />
<remove name="AspNetWindowsTokenRoleProvider" />
<add name="AspNetSqlRoleProvider"
connectionStringName="LocalSqlServer"
applicationName="WebSite1"
type="System.Web.Security.SqlRoleProvider" />
<add name="AspNetWindowsTokenRoleProvider"
applicationName="WebSite1"
type="System.Web.Security.WindowsTokenRoleProvider" />
</providers>
</roleManager>


方法三:每個網站應用程式都用自己的apsnetdb(僅適用於SQL Server 2005)
當您裝了非Express版的SQL SERVER 2005,但卻想像Express版一樣,將資料直接存在程式路徑下App_Data資料夾中的aspnetdb.mdf,
可以這樣作:
1.執行aspnet_regsql.exe在SQL SERVER上建立一個aspnetdb資料庫
2.進入SQL Server Management Studio,將aspnetdb卸離
3.copy C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\aspnetdb.mdf及aspnetdb.ldf到程式路徑下的App_Data資料夾
4.修改web.config的<connectionStrings>區段
<connectionStrings>
<remove name="LocalSqlServer" />
<add name="LocalSqlServer"
connectionString="data source=.;Integrated Security=SSPI;AttachDBFilename=DataDirectoryaspnetdb.mdf;"
providerName="System.Data.SqlClient" />
</connectionStrings>

方法四:換Express版吧!

我用Express版試過,就真的很簡單!什麼問題也沒有,直接會幫您將aspnetdb開在程式路徑下的App_Data資料夾中。