首页 > 解决方案 > c# System.Data.SqlClient.SqlException (0x80131904)

问题描述

使用 c# .net 4.6.1 我有一个程序试图查询 MS SQL Server 2016 数据库。我有 2 台远程服务器,服务器 A 和服务器 B。我的 c# 程序在服务器 A 上运行没有问题。当我在服务器 BI 上运行程序时,出现以下错误:

System.Data.SqlClient.SqlException (0x80131904):建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。(提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)---> Syste m.ComponentModel.Win32Exception (0x80004005):访问在 System.Data.SqlClient.SqlInternalConnectionTds..ctor( DbConnectionPoolIdentity 身份、SqlConnectionString connectionOptions、SqlCredential credential、对象 providerInfo、String newPassword、SecureString newSecurePassword、Boolean redirectedUserInstance、SqlConnectionString userConnectionOptions、SessionData r econnectSessionData、

在 System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool 池,DbConnection owningObject,DbConnectionOptions 选项,DbConne ctionPoolKey poolKey,DbConnectionOptions userOptions)在 System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection 拥有对象,DbConnectionOptions userOptions,DbConnectionInternal oldConnection)在System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owingObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection ow ningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean o nlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& co nnection) 在 System.Data.ProviderBase。DbConnectionPool.TryGetConnection(DbConnection owingObject, TaskCompletionSource1 retry, DbConnectionOptions userOptions, DbCon nectionInternal& connection) at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource在 System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(Db Connection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource 1 retry, DbConnectionOptions userOptions) at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource1 次重试, DbConnectionOptions userOptions , DbConnectionInternal oldConnection, DbConnectionInternal& connection) 在 System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource 1 re try) at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource1 次重试)在 System.Data.SqlClient.SqlConnection.Open() at YetAnotherSmallConsoleApp.Program.Main(String[] args) 在 C:\Repository\Projects\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. 即使我的程序在服务器 AI 上正确运行,也无法从服务器 A 或服务器 B ping MS SQL Server 2016 数据库服务器的 IP 地址。
  4. 服务器 A 或服务器 B 上没有防火墙。
  5. 服务器 A 和服务器 B 都运行 MS Server 2012 R2。

这些是我唯一能想到的比较服务器 A 和服务器 B 的东西。显然服务器 A 和服务器 B 之间存在一些不同之处,这使得程序可以在服务器 A 上成功运行。我不知道是否有什么东西在服务器 A 上配置不同,在服务器 B 上配置不同,或者如果在我的 MS SQL Server 2016 数据库服务器上配置了某些内容,允许服务器 A 在程序运行时成功连接到数据库,但阻止程序连接到数据库并在服务器 B 上成功运行。如果有人能给我任何关于如何解决此问题以使程序在服务器 BI 上运行的建议,将不胜感激。提前致谢。

编辑:当我尝试使用与使用 SSMS 从服务器 A 连接到数据库相同的凭据尝试从服务器 B 连接到 MS SQL Server 2016 数据库时,我收到以下错误:

在此处输入图像描述

编辑:另一件事:我尝试使用连接字符串中的 MS SQL Server 2016 数据库服务器的计算机名称以及连接字符串中数据库服务器的实际 IP 地址运行程序,这两种方式都会导致能够在服务器 A 上成功运行程序,但在服务器 B 上出现错误。

标签: c#sql-serverdatabase-connection

解决方案


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


推荐阅读