【问题标题】:c# System.Data.SqlClient.SqlException (0x80131904)c# System.Data.SqlClient.SqlException (0x80131904)
【发布时间】: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 拥有对象,TaskCompletionSource1 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(); 的行引发的。以下是有关服务器的一些事实:

  1. 服务器 A 和服务器 B 在同一个网络上,而这个网络不在 我的 MS SQL Server 2016 数据库在同一个网络上。
  2. 服务器 A 上安装了 MS SQL Server 2012 实例,服务器 B 有 没有安装 MS SQL Server。
  3. 即使我的程序在服务器 A 上正常运行,我也无法 ping 通 IP 地址 来自服务器 A 或服务器 B 的 MS SQL Server 2016 数据库服务器。
  4. 服务器 A 或服务器 B 上没有防火墙。
  5. 服务器 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


【解决方案1】:

这种类型的错误肯定是由错误的连接字符串引起的。确认以确保服务器的连接字符串相同,

【讨论】:

  • 您指的是存储在我尝试连接的服务器上的连接字符串,在这种情况下是服务器 A 和服务器 B?我以前从未听说过在服务器上保存连接字符串。我检查了一下,服务器 A 和服务器 B 都没有配置用于连接数据库的 ODBC 数据源。至于我在 c# 程序中定义的连接字符串,当我尝试在服务器 A 或服务器 B 上运行它时,我没有更改程序中的任何内容。我在服务器 B 上运行它。
  • 您可以通过打开 sql server 数据库并检查第一个突出显示的名称来轻松检查连接字符串服务器名称。因此,请检查服务器 A 和 B 在 sql server 数据库中是否具有相同的名称。
  • 对不起,我没有听懂你说的话。我不会更改存储在我的 c# 程序中的连接字符串,它保持不变。使用连接字符串在服务器 A 上有效,但在服务器 B 上无效。您是说我在 c# 程序中使用的连接字符串在服务器 B 上与在服务器 A 上成功运行的连接字符串不同?或者您是说数据库中有一些配置允许服务器 A 在程序运行时成功连接,但在运行同一程序时不允许服务器 B 连接?
  • 如果说我可以添加图片,我会更好地解释它。服务器 A 上的连接字符串可能与服务器 B 不同......只需在两个服务器上打开 sql server 数据库并观察突出显示的名称,如果它们相同,则连接字符串应该在两个服务器上都可以工作,但如果不是,那就是问题。
【解决方案2】:

试试这个:

  • 右击cmd
  • 选择以管理员身份运行
  • 然后在命令提示符下输入:

mofcomp "%programfiles(x86)%\Microsoft SQL 服务器\140\Shared\sqlmgmproviderxpsp2up.mof"

140 是您的 sql server 的版本,请将其更改为您尝试使用的正确版本。

这对我有用,但我不安全,这是你的问题

【讨论】:

  • 你说我应该在什么服务器上运行它?服务器 A、服务器 B 还是数据库所在的服务器?这个命令到底应该做什么?
猜你喜欢
  • 1970-01-01
  • 2016-04-22
  • 2014-11-25
  • 1970-01-01
  • 2022-12-14
  • 2018-08-15
  • 2014-12-18
  • 2018-06-28
  • 2014-03-19
相关资源
最近更新 更多