【问题标题】:SQL Server connection Error Number:2,State:0,Class:20SQL Server 连接错误号:2,状态:0,类:20
【发布时间】:2018-12-15 21:30:50
【问题描述】:

当尝试连接到本地 SQL 服务器 (MAMP) 时,我遇到了这个异常:

抛出异常:System.Data.dll 中的“System.Data.SqlClient.SqlException” System.Data.SqlClient.SqlException (0x80131904):建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)---> System.ComponentModel.Win32Exception (0x80004005):系统找不到指定的文件 在 System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity 身份,SqlConnectionString connectionOptions,SqlCredential 凭据,对象 providerInfo,字符串 newPassword,SecureString newSecurePassword,布尔重定向用户实例,SqlConnectionString userConnectionOptions,SessionData reconnectSessionData,DbConnectionPool 池,字符串 accessToken,布尔 applyTransientFaultHandling,SqlAuthenticationProviderManager sqlAuthProviderManager ) 在 System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions 选项,DbConnectionPoolKey poolKey,对象 poolGroupProviderInfo,DbConnectionPool 池,DbConnection owningConnection,DbConnectionOptions userOptions) 在 System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool 池,DbConnection owningObject,DbConnectionOptions 选项,DbConnectionPoolKey poolKey,DbConnectionOptions 用户选项) 在 System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject,DbConnectionOptions userOptions,DbConnectionInternal oldConnection) 在 System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject,DbConnectionOptions userOptions,DbConnectionInternal oldConnection) 在 System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject,UInt32 waitForMultipleObjectsTimeout,布尔allowCreate,布尔onlyOneCheckConnection,DbConnectionOptions userOptions,DbConnectionInternal& 连接) 在 System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject,TaskCompletionSource1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource1 重试,DbConnectionOptions userOptions,DbConnectionInternal oldConnection,DbConnectionInternal& 连接) 在 System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection,DbConnectionFactory connectionFactory,TaskCompletionSource1 retry, DbConnectionOptions userOptions) at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource1 重试,DbConnectionOptions userOptions) 在 System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource1 retry) at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource1 重试) 在 System.Data.SqlClient.SqlConnection.Open() 在 C:\Users******\DatabaseClass.cs:line 35 中的 login_page.DatabaseClass.dbRead(String sqlQuery) ClientConnectionId:00000000-0000-0000-0000-000000000000 错误号:2,状态:0,类:20

这是我用来执行SELECT SQL 函数的类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace login_page
{
    class DatabaseClass
    {
        public void dbSignIn(String username, String password)
        {
            dbRead("SELECT * FROM user_credentials WHERE username = '" + username + "' AND password = '" + password + "'");
        }

        public void dbRegisterUser()
        {
            dbRead("SQL READ TO DATABASE");
            //dbWrite("SQL WRITE TO DATABASE")
        }

        private void dbRead(String sqlQuery)
        {
            SqlDataReader dataReader;
            SqlCommand command;

            // *** CONNECT TO DATABASE
            Console.WriteLine("** Database Connection: Connecting to database");

            SqlConnection dbConnection = new SqlConnection("User Id=root;" + "Password=root;" + "Server=localhost;" + "Trusted_Connection=true;" + "Database=dbmentum;" + "Connection Timeout=10;");
            try
            {
                dbConnection.Open();
                Console.WriteLine("** Database Connection: Connected to database server");

                // *** READ FROM DATABASE
                command = new SqlCommand(sqlQuery, dbConnection);
                dataReader = command.ExecuteReader();

                while (dataReader.Read())
                {
                    Console.WriteLine(dataReader[0].ToString());    
                    Console.WriteLine(dataReader[1].ToString());
                }

                dataReader.Close();
                command.Dispose();
                dbConnection.Close();
            }
            catch (SqlException e)
            {
                Console.WriteLine(e.ToString());
                MessageBox.Show(e.Message, "Mentum - Database Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            /*
            // CLOSE DATABASE
            try
            {
                dbConnection.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            } */
        }
    }
}

所有适当的端口都已启用,并且数据库详细信息正确。

【问题讨论】:

  • 连接字符串的连接背后有什么特殊原因吗?
  • N 错误是:建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。
  • 确认连接字符串对错!
  • 在 Web 配置中定义您的连接字符串,例如:
  • 字符串是正确的,如果我不连接我该如何处理呢?

标签: c# sql-server


【解决方案1】:

根据错误消息,连接字符串中提供的数据库实例错误、不可访问或未配置为允许远程连接(但您使用的是 localhost,所以这不是原因)

MAMP 似乎使用 MySQL 作为数据库。请参考MySQL NET Developer Guide 了解如何连接到 MySQL。 我还建议对 SQL 注入进行研究,因为您的方法 dbSignIn 是此类攻击的良好目标。

【讨论】:

    【解决方案2】:

    您提到了 MAMP,在我的理解中它是一个 MySql 服务器。尽管如此,您使用的是SqlConnectionSqlCommand,它们用于连接到MS SQL Server。对于 MySql,您需要 MySqlConnectionMySqlCommand 等等。

    正如 Prashant Pimpale 指出的,您观察到的错误与网络连接有关。如果是这种情况,您使用 MS SQL Server 客户端连接到 MySQL 数据库,原因很明显。 MSSQL默认端口是1433,MySQL默认端口是3306。所以客户端会尝试连接1433端口,但是没有服务监听。因此,无法建立连接...

    【讨论】:

    • 你的论点很有道理,但我在使用 MySqlConnection 时遇到语法错误,例如,我还尝试包含库 using System.Data.SqlClient;,然后我尝试更改 MAMP 服务器上的端口到 1134,现在它似乎让步并停在下一行 System.InvalidOperationException: 'Internal connection fatal error. Error state: 18'
    • System.Data.SqlClient 仅用于连接到 MS SQL Server。这是一个与 MySql Server 完全不同的协议。您必须使用正确的库。如果您想连接到 MySql,您必须使用 MySql 连接器。有关文档,请参阅 dev.mysql.com/doc/connector-net/en。 MySql 连接器未内置于 .NET,但您必须下载外部库并将引用添加到您的项目才能使用 MySql.Data
    猜你喜欢
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多