c#System.Data.SqlClient.SqlException(0x80131904)

时间:2018-11-29 20:38:52

标签: c# sql-server database-connection

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

  

System.Data.SqlClient.SqlException(0x80131904):与网络相关或   建立与以下对象的连接时发生实例特定错误   SQL Server。服务器未找到或无法访问。校验   实例名称正确且已配置SQL Server   允许远程连接。 (提供者:命名管道提供者,错误:   40-无法打开与SQL Server的连接)---> Syste   m.ComponentModel.Win32Exception(0x80004005):在以下位置拒绝访问   System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdent   身份,SqlConnectionString connectionOptions,SqlCredential   凭据,对象providerInfo,字符串newPassword,SecureString   newSecurePassword,布尔型redirectedUserInstance,SqlConnectionString   userConnectionOptions,SessionData r econnectSessionData,   DbConnectionPool池,字符串accessToken,布尔值applyTra   nsientFaultHandling,SqlAuthenticationProviderManager   sqlAuthProviderManager)   System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOp   选项,DbConnectionPoolKey poolKey,对象   poolGroupProviderInfo,DbConn连接池,DbConnection   owningConnection,DbConnectionOptions userOptions)

     在

  System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConn   ectionPool池,DbConnection owningObject,DbConnectionOptions   选项,DbConne ctionPoolKey poolKey,DbConnectionOptions   userOptions)   System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection   拥有对象,DbConnectionOptions userOptions,DbConnectionInternal   oldConnection)在   System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection   o wningObject,DbConnectionOptions userOptions,DbConnectionInternal   oldConnection)位于   System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection   ow ningObject,UInt32 waitForMultipleObjectsTimeout,布尔值   allowCreate,布尔值nlyOneCheckConnection,DbConnectionOptions   userOptions,DbConnectionInternal&连接)   System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection   ow ningObject,TaskCompletionSource 1 retry, DbConnectionOptions userOptions, DbCon nectionInternal& connection) at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource 1重试,DbConnectionOptions   userOptions,DbConnectionInternal oldConnection,   DbConnectionInternal&connection)   System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(Db   连接externalConnection,DbConnectionFactory connectionFactory,   TaskCompletio nSource 1 retry, DbConnectionOptions userOptions) at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource 1重试,DbConnectionOptions userOptions)位于   System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource 1 re try) at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource 1   重试)在System.Data.SqlClient.SqlConnection.Open()在   YetAnotherSmallConsoleApp.Program.Main(String [] args)在   C:\ Repository \ Pro   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. 即使我的程序在Server 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上成功运行。如果有人可以给我任何有关如何解决此问题的建议,以便能够使程序在服务器BI上运行,将不胜感激。预先感谢。

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

enter image description here

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

2 个答案:

答案 0 :(得分:0)

尝试一下:

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

mofcomp“%programfiles(x86)%\ Microsoft SQL   Server \ 140 \ Shared \ sqlmgmproviderxpsp2up.mof“

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

这对我有用,但我不确定这是您的问题

答案 1 :(得分:-1)

肯定是由于错误的连接字符串导致的这种类型的错误。确认并确保服务器的连接字符串相同,