【发布时间】:2018-11-29 20:38:51
【问题描述】:
使用 c# .net 4.6.1 我有一个程序正在尝试查询 MS SQL Server 2016 数据库。我有 2 台远程服务器,服务器 A 和服务器 B。我的 c# 程序在服务器 A 上运行没有问题。当我在服务器 B 上运行程序时,出现以下错误:
System.Data.SqlClient.SqlException (0x80131904):网络相关或 与实例建立连接时发生特定错误 SQL 服务器。服务器未找到或无法访问。核实 实例名称正确且配置了 SQL Server 允许远程连接。 (提供者:命名管道提供者,错误: 40 - 无法打开与 SQL Server 的连接)---> Syste m.ComponentModel.Win32Exception (0x80004005):访问被拒绝 System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdent ity 身份、SqlConnectionString 连接选项、SqlCredential 凭证、对象 providerInfo、字符串 newPassword、SecureString newSecurePassword、布尔重定向用户实例、SqlConnectionString userConnectionOptions, SessionData 重新连接SessionData, DbConnectionPool 池、字符串 accessToken、布尔型 applyTra nsientFaultHandling、SqlAuthenticationProviderManager sqlAuthProviderManager) 在 System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOp 选项,DbConnectionPoolKey poolKey,对象 poolGroupProviderInfo、DbConn ectionPool 池、DbConnection owningConnection, DbConnectionOptions userOptions)
在 System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConn ectionPool 池、DbConnection owningObject、DbConnectionOptions 选项,DbConne ctionPoolKey poolKey,DbConnectionOptions 用户选项)在 System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection 拥有对象,DbConnectionOptions userOptions,DbConnectionInternal 旧连接)在 System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection o wningObject、DbConnectionOptions 用户选项、DbConnectionInternal 旧连接)在 System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owingObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions 用户选项、DbConnectionInternal 和连接)在 System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection 拥有对象,TaskCompletionSource
1 retry, DbConnectionOptions userOptions, DbCon nectionInternal& connection) at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource1 重试,DbConnectionOptions userOptions , DbConnectionInternal oldConnection, DbConnectionInternal& 连接)在 System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(Db 连接外部连接,DbConnectionFactory 连接工厂, TaskCompletio nSource1 retry, DbConnectionOptions userOptions) at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource1 重试,DbConnectionOptions userOptions)在 System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource1 re try) at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource1 重试)在 System.Data.SqlClient.SqlConnection.Open() 在 YetAnotherSmallConsoleApp.Program.Main(String[] args) 在 C:\存储库\临 jects\YetAnotherSmallConsoleApp\YetAnotherSmallConsoleApp\Program.cs:line 28 ClientConnectionId:00000000-0000-0000-0000-000000000000
这是我的程序:
using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.IO;
namespace YetAnotherSmallConsoleApp
{
class Program
{
static void Main(string[] args)
{
SqlConnection con = new SqlConnection("Server = IP_ADDRESS; User Id = USER_NAME; Password = PASSWORD;");
string[] arrExcludeLines = File.ReadAllLines(FILEPATH_TO_QUERY);
string strExcludeQuery = default(string);
foreach (string line in arrExcludeLines)
{
strExcludeQuery = strExcludeQuery + line + Environment.NewLine;
}
try
{
using (con)
{
con.Open();
SqlCommand cmdExclude = new SqlCommand(strExcludeQuery, con);
SqlDataReader dr1 = cmdExclude.ExecuteReader();
while (dr1.HasRows)
{
while (dr1.Read())
{
Console.WriteLine(dr1[0].ToString());
Console.ReadLine();
}
dr1.NextResult();
}
}
}
catch(Exception ex)
{
Console.WriteLine(ex.ToString());
Console.ReadLine();
}
}
}
}
错误是从读取 con.Open(); 的行引发的。以下是有关服务器的一些事实:
- 服务器 A 和服务器 B 在同一个网络上,而这个网络不在 我的 MS SQL Server 2016 数据库在同一个网络上。
- 服务器 A 上安装了 MS SQL Server 2012 实例,服务器 B 有 没有安装 MS SQL Server。
- 即使我的程序在服务器 A 上正常运行,我也无法 ping 通 IP 地址 来自服务器 A 或服务器 B 的 MS SQL Server 2016 数据库服务器。
- 服务器 A 或服务器 B 上没有防火墙。
- 服务器 A 和服务器 B 都运行 MS Server 2012 R2。
这些是我能想到的唯一可以在服务器 A 和服务器 B 之间进行比较的东西。显然,服务器 A 和服务器 B 之间存在一些不同之处,它允许程序在服务器 A 上成功运行。我不知道是否服务器 A 上的配置不同,服务器 B 上的配置不同,或者我的 MS SQL Server 2016 数据库服务器上配置的东西允许服务器 A 在程序运行时成功连接到数据库,但阻止程序连接到数据库并在服务器 B 上成功运行。如果有人能给我任何关于如何解决此问题以使程序在服务器 B 上运行的建议,我将不胜感激。提前致谢。
编辑:当我尝试从服务器 B 连接到 MS SQL Server 2016 数据库时,使用的凭据与使用 SSMS 从服务器 A 连接到数据库的凭据相同,我收到以下错误:
编辑:另一件事:我尝试使用连接字符串中的 MS SQL Server 2016 数据库服务器的计算机名称以及连接字符串中的数据库服务器的实际 IP 地址来运行程序,两者方法导致能够在服务器 A 上成功运行程序,但我在服务器 B 上收到错误。
【问题讨论】:
-
在有问题的机器上,加载 SQL Management Studio 并尝试连接到它无法连接的数据库。可以连接吗?
-
@mjwills ,我刚刚更新了我的 OP ,当我尝试使用 SSMS 从服务器 B 连接到数据库时出现错误,以及在服务器上使用 SSMS 连接到数据库时的相同凭据一个
-
如果 SSMS 失败,这与 C# 无关。投票结束,这应该是serverfault.com。
-
@mjwills 感谢您的建议,我不知道 serverfault.com 。我会把它放在那里。
标签: c# sql-server database-connection