首页 > 解决方案 > 无法连接到远程主机

问题描述

连接到远程主机时遇到问题。我可以使用数据库副本连接到本地服务器。

我正在尝试连接到我的网络主机上的 XenForo DB 并获取一些信息。一切都在本地主机上工作。

private static MySqlConnection _connection = 
    new MySqlConnection("Server=ip; database=ls-v_forum; UID=ls-v_forum; password=pass");

public static int? FetchUserId(string emailoruser)
{
    MySqlCommand userCommand = new MySqlCommand("SELECT * FROM xf_user WHERE username='" + emailoruser + "'", _connection);
    MySqlCommand emailCommand = new MySqlCommand("SELECT * FROM xf_user WHERE email='" + emailoruser + "'", _connection);

    _connection.OpenAsync();
}

那是代码,它抛出了这个错误

连接必须有效且打开。在 MySql.Data.MySqlClient.ExceptionInterceptor.Throw(Exception 异常) 在 MySql.Data.MySqlClient.MySqlCommand.CheckState() 在 MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior 行为)

编辑

public int? FetchUserId(string emailoruser)
    {
        using (var _connection = new MySqlConnection("server=ip; database=ls-v_forum; UID=ls-v_forum; password=pass"))
        {
            MySqlCommand userCommand = new MySqlCommand("SELECT * FROM xf_user WHERE username='" + emailoruser + "'", _connection);
            MySqlCommand emailCommand = new MySqlCommand("SELECT * FROM xf_user WHERE email='" + emailoruser + "'", _connection);

            _connection.Open();


            MySqlDataReader userReader = userCommand.ExecuteReader();

            int? userId = null;

            while (userReader.Read())
            {
                userId = userReader.GetInt32("user_id");
            }

            userReader.Close();

            if (userId == null || userId == 0)
            {
                MySqlDataReader emailReader = emailCommand.ExecuteReader();

                while (emailReader.Read())
                {
                    userId = emailReader.GetInt32("user_id");
                }

                emailReader.Close();
            }

            _connection.Close();

            return userId;
        }
    }

MySql.Data.MySqlClient.MySqlException (0x80004005):无法连接到任何指定的 MySQL 主机。在 MySql.Data.MySqlClient.NativeDriver.Open() 在 MySql.Data.MySqlClient.Driver.Open() 在 MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder 设置) 在 MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection()在 MySql.Data.MySqlClient.MySqlPool.GetPooledConnection() 在 MySql.Data.MySqlClient.MySqlPool.TryToGetDriver() 在 MySql.Data.MySqlClient.MySqlPool.GetConnection() 在 MySql.Data.MySqlClient.MySqlConnection.Open()

标签: c#mysqldatabase

解决方案


我没有尝试对您的连接命令进行故障排除,但是在连接到远程计算机上的 SQL DB 时,以下内容对我有用

即使它是本地机器,您也可以提供机器名称,因此如果程序与数据库在同一台机器上运行,或者如果程序在一台机器上运行而数据库在另一台机器上,那么下面的代码将起作用,这么久因为两台机器是联网的,并且您运行程序的帐户可以访问机器、实例和数据库。

请注意,在下面的示例中,安装 SQL 时使用了“默认”实例名称 (MSSQLSERVER)。当数据库实例名称是默认名称时,您不得显式提供实例名称(如果这样做会出现错误)。唯一显式提供实例名称的情况是它不是默认实例名称。下面的代码可以处理任何一种情况(通过将 dbInstanceName 变量设置为“”或实例名称,例如“\SQLEXPRESS”)。请参阅 SO SQL Server:如何查找所有 localdb 实例名称。当它怀疑时,尝试一个空的实例名称和一个您认为是实例名称的名称,看看什么是有效的。

string databaseMachineName = "machine_name";
string databaseInstanceName = ""; 
string dbName = "database_name";

using (SqlConnection sqlConnection = new SqlConnection("Data Source=" + databaseMachineName + databaseInstanceName + "; Initial Catalog=" + dbName + "; Integrated Security=True;Connection Timeout=10"))
{
   .
   .
   .
}

推荐阅读