【问题标题】:Why does this code cause an error?为什么这段代码会导致错误?
【发布时间】:2011-03-16 18:39:21
【问题描述】:

我一直在寻找如何连接到我的本地 SQL 数据库的几个小时。我不敢相信它是如此困难。无论如何,我认为我在这段代码上更正确。

<%
    Dim myConnection as System.Data.SqlClient.SqlConnection
    Dim myCommand as System.Data.SqlClient.SqlCommand

    myConnection = New System.Data.SqlClient.SqlConnection("Data Source=localhost;Initial Catalog=dbtest;Integrated Security=True")
    myConnection.Open()
%>

但是,它仍然不起作用。我不知道从哪里开始,因为在页面加载时我也会收到此消息:

运行时错误

说明:服务器上出现应用程序错误。此应用程序的当前自定义错误设置阻止远程查看应用程序错误的详细信息(出于安全原因)。但是,它可以被本地服务器机器上运行的浏览器查看。

详细信息:要使此特定错误消息的详细信息可以在远程计算机上查看,请在位于当前网站根目录的“web.config”配置文件中创建一个标签应用。然后,此标记应将其“模式”属性设置为“关闭”。

我创建了一个 web.config 文件,它并没有改变任何东西。我迷路了。任何帮助表示赞赏!

堆栈跟踪:[SqlException (0x80131904): 无法打开数据库 登录请求的“dbtest”。这 登录失败。用户登录失败 'IIS APPPOOL\DefaultAppPool'。]
System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,布尔型 breakConnection) +6244425 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) +245
System.Data.SqlClient.TdsParser.Run(运行行为 runBehavior,SqlCommand cmdHandler, SqlDataReader 数据流, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2811
System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(布尔值 征募OK)+53
System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo,字符串 newPassword, 布尔忽略SniOpenTimeout,Int64 计时器过期,SqlConnection 拥有对象)+248
System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(字符串 主机,字符串 newPassword,布尔值 重定向用户实例,SqlConnection 拥有对象,SqlConnectionString connectionOptions, Int64 timerStart) +6260362 System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection 拥有对象,SqlConnectionString 连接选项,字符串新密码, 布尔重定向用户实例) +6260328 System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity 身份,SqlConnectionString 连接选项,对象 providerInfo,字符串 newPassword, SqlConnection owningObject,布尔值 重定向用户实例)+354
System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions 选项,对象 poolGroupProviderInfo, DbConnectionPool 池,DbConnection 拥有连接)+703
System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection 拥有连接,DbConnectionPool 池,DbConnectionOptions 选项)+54 System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection 拥有对象)+6261592
System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection 拥有对象)+81
System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection 拥有对象)+1657
System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection 拥有连接)+88
System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection 外部连接,数据库连接工厂 连接工厂)+6265031
System.Data.SqlClient.SqlConnection.Open() +258 ASP.index_aspx.__Render__control1(HtmlTextWriter __w, 控制参数容器) +71 System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter 作家,ICollection 儿童)+115
System.Web.UI.Page.Render(HtmlTextWriter 作家)+38
System.Web.UI.Page.ProcessRequestMain(布尔值 includeStagesBeforeAsyncPoint,布尔值 includeStagesAfterAsyncPoint) +4240

【问题讨论】:

    标签: asp.net ado.net connection sqlclient


    【解决方案1】:

    来了

    无法打开数据库“dbtest” 登录请求。登录 失败的。用户 'IIS 登录失败 APPPOOL\DefaultAppPool'

    应用程序池身份帐户在 SQL Server 中设置,但未在数据库 dbtest 中设置。如果您无法连接到 SQL Server 实例,则会收到不同的错误消息,但您正在连接以获取上述错误消息。1

    所以,在 SQL 中:

    USE dbtest
    GO
    CREATE USER [IIS APPPOOL\DefaultAppPool] FROM LOGIN [IIS APPPOOL\DefaultAppPool]
    

    编辑:

    当你连接到一个“数据库”时,你实际上验证了 3 次(基本上)

    1. 到托管 SQL Server 实例的 Windows/域安装(此处超出范围)
    2. 到 SQL Server 实例,您是“登录”,通过 CREATE LOGIN 设置 SQL Server
    3. 此登录作为“用户”映射到零个或多个数据库,这是您需要在此处执行的操作

    在这种情况下,您在 SQL Server 中设置为登录名,但未在 SQL Server 实例中托管的目标数据库中设置。

    【讨论】:

    • Msg 15401,级别 16,状态 1,行 1 Windows NT 用户或组 'IISAPPPOOL\DefaultAppPool' 未找到。再次检查名称
    • 这需要特别注意他在数据库中授予哪些对象和哪些命令的权限。
    • 在IIS和APPPOOL之间有一个空格
    • 谢谢!!它工作虽然有人可以向我解释这个错误的起源吗?这一切都非常混乱。
    • @Liam,该网页不在您的帐户下运行,出于安​​全原因,它在另一个更受限制的帐户下运行 - 特别是网页不能做危险的事情。默认情况下,数据库没有这个受限帐户的登录名——为什么会这样。
    【解决方案2】:

    正确放置 CustomError 标记和值,例如:

    <configuration>
        <system.web>
          <customErrors mode="Off"/>
        </system.web>
    </configuration>
    

    这将向您揭示确切的问题。

    【讨论】:

    • 它确实打印堆栈,但我不知道该怎么做
    • 所以用户登录数据库失败(在您的跟踪输出中看到)。在连接字符串中输入实际的用户 ID 和密码。正在使用的用户是 IIS apppool [user 'IIS APPPOOL\DefaultAppPool']
    【解决方案3】:

    尝试设置Data Source=(local)

    【讨论】:

      【解决方案4】:

      您是否按照所有说明操作并确保 web.config 中的 customerErrors 标记如下所示:

      &lt;customErrors mode="Off" /&gt;

      真正的错误似乎是用户 ASP.Net 正在运行,因为没有权限登录到数据库。

      【讨论】:

      • 是的,它导致该行出现错误。由于某种原因,该代码不起作用
      • 如果您在 web.config 中将 customErrors 设置为 Off,您将收到更具描述性的错误消息。
      • 没关系,我又试了一次,它为我打印了堆栈跟踪。
      猜你喜欢
      • 1970-01-01
      • 2017-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-17
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      相关资源
      最近更新 更多