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, 欢迎你的参与。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值