【问题标题】:Unable to connect website to SQL Server无法将网站连接到 SQL Server
【发布时间】:2016-10-06 14:32:54
【问题描述】:

我在使用 SQL Server 设置基于 C# 的网站的开发实例时遇到了一些问题。我习惯于用 MySQL 做这一切,所以这对我来说有点陌生。通读 MS 故障排除后,我的设置似乎没问题,但这仍然无法正常工作,所以很明显我在某个地方有所不足。

我已使用以下配置将web.config 文件设置为指向新数据库;

<connectionStrings>
    <add name="External" 
         connectionString="Data Source=91.208.99.2,33114; Initial Catalog=sqldatabase;User ID=sqluser;Password=1234567890" 
         providerName="System.Data.SqlClient"/>
</connectionStrings>

但是,连接仍然失败并出现以下错误。有什么我可能会遗漏的想法吗?

[Win32Exception (0x80004005): 系统找不到指定的文件]

[SqlException (0x80131904):在建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)]

这是堆栈跟踪的其余部分;

System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +6569310
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +717
   System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean withFailover) +6595752
   System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover) +219
   System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout) +6598063
   System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance) +6598643
   System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData) +942
   System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) +1162
   System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) +72
   System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) +6601897
   System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) +103
   System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) +2102
   System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) +116
   System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) +1079
   System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) +6606391
   System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry) +233
   System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry) +278
   System.Data.SqlClient.SqlConnection.Open() +239
   SubSonic.SqlDataProvider.CreateConnection(String newConnectionString) +48
   SubSonic.AutomaticConnectionScope..ctor(DataProvider provider) +58
   SubSonic.SqlDataProvider.GetDataSet(QueryCommand qry) +383
   SubSonic.StoredProcedure.GetDataSet() +64
   _usercontrols_layout_header.Page_Load(Object sender, EventArgs e) in \\sambad\sites\dev.aciemgroup.co.uk\public_html\_usercontrols\layout\header.ascx.cs:57
   System.Web.UI.Control.LoadRecursive() +71
   System.Web.UI.Control.LoadRecursive() +190
   System.Web.UI.Control.LoadRecursive() +190
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3178

【问题讨论】:

  • 服务器引擎真的在服务器上运行吗?问题可能出在服务器本身。您可以在服务器上运行“SQL Management Studio”并使用连接字符串中的凭据连接到数据库吗?
  • 在此站点中搜索 sql-server 建立连接时发生与网络相关或特定于实例的错误。实际上有几十个(如果不是更多)现有问题(和答案)可以帮助解决这个问题。
  • 是的,我可以使用 SQL Management Studio 连接到服务器。当我设置这个时,主机确实必须添加我的本地 IP 以允许远程访问 SQL 服务器,也许 Web 服务器 IP 不允许访问?不过,他们确实设置了整个环境,所以我希望如此 - 仍在等待收到该票的回复。
  • 你在使用 sqlexpress 吗?您可能不需要端口修饰符 331114 或者您需要指定实例名称。看一些连接字符串示例。
  • 如果在连接字符串中指定网络协议会怎样? Network Library=DBMSSOCN。更多details。另见related question

标签: c# sql-server


【解决方案1】:

错误本身已经说明web.config上的服务器配置不正确:

发生网络相关或特定于实例的错误,同时 建立与 SQL Server 的连接。找不到服务器或 无法访问。验证实例名称是否正确,并且 SQL Server 配置为允许远程连接。 (提供者:命名 Pipes Provider,错误:40 - 无法打开与 SQL Server 的连接)

由于显示“未找到服务器”,SQL Server 连接字符串可能成为主要问题。

如果您在远程服务器上有 SQL Server 实例/服务器名称(例如 SERVERNAME),请将其附加在 IP 地址或机器名称之后,就在要连接的服务器端口之前:

<connectionStrings>
<add name="External" connectionString="Data Source=91.208.99.2\SERVERNAME,33114; Initial Catalog=sqldatabase;User ID=sqluser;Password=1234567890" providerName="System.Data.SqlClient"/>
</connectionStrings>

如果是 SQL Server Express 实例,连接字符串应该是这样的:

<connectionStrings>
<add name="External" connectionString="Data Source=91.208.99.2\SQLEXPRESS,33114; Initial Catalog=sqldatabase;User ID=sqluser;Password=1234567890" providerName="System.Data.SqlClient"/>
</connectionStrings>

关于将Network Library=DBMSSOCN 添加到web.config 上的连接字符串时出现HTTP 500 错误,请参阅下面的MS KB 参考了解更多详细信息,具体取决于HResult 代码。如果 HResult 代码返回0x8007000d,则需要按照上述说明正确修改连接字符串中的目标服务器。

添加网络库后的连接字符串应该是这样的:

<connectionStrings>
<add name="External" connectionString="Data Source=91.208.99.2\SERVERNAME,33114;Network Library=DBMSSOCN;Initial Catalog=sqldatabase;User ID=sqluser;Password=1234567890" providerName="System.Data.SqlClient"/>
</connectionStrings>

PS:检查并修改远程服务器的附加安全/机器/用户权限(如果有),确保数据库连接之后正常工作。

参考资料:

MS KB 942055 - https://support.microsoft.com/en-us/kb/942055

The right connection string for Remote SQL server for C#

ConnectionString for remote SQL Server

【讨论】:

    【解决方案2】:

    感谢大家的意见,事实证明托管公司(尽管声称一切都很好)有错。非常抱歉浪费了任何人的时间,让他们承认错误也有点令人沮丧!最后,我们设置了一个单独的 MS SQL 服务器并连接好了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-20
      • 2011-12-25
      • 2015-07-28
      • 2010-11-29
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      相关资源
      最近更新 更多