无法连接到远程主机

vptzau2j  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(382)

连接到远程主机时出现问题。我可以用数据库的副本连接到本地服务器。
我正在尝试连接到我的web主机上的xenforodb并获取一些信息。所有这些都在本地主机上工作。

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(异常异常)在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()

wrrgggsh

wrrgggsh1#

我没有尝试对您的connection命令进行故障排除,但是当连接到远程计算机上的sqldb时,以下命令对我有效
即使是本地机器,也可以提供机器名,因此如果程序与数据库在同一台机器上运行,或者程序在一台机器上运行,而数据库在另一台机器上运行,则下面的代码将起作用,只要这两台机器联网,并且运行程序的帐户可以访问机器、示例和数据库。
请注意,在下面的示例中,安装sql时使用了“默认”示例名(mssqlserver)。当db instance name是默认名称时,则不能显式地提供示例名称(如果提供,则会出现错误)。只有当示例名不是默认示例名时,才显式提供示例名。下面的代码可以处理这两种情况(通过将dbinstancename变量设置为“”或示例名称,例如“\sqlexpress”)。请参阅s.o.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"))
{
   .
   .
   .
}
1u4esq0p

1u4esq0p2#

连接到远程主机时出现问题。
不一定。根据错误,问题不是你不能连接。您正在尝试使用未连接的连接:
连接必须有效且打开。
特别是在执行命令时:
mysql.data.mysqlclient.mysqlcommand.executereader(命令行为)
你展示的代码里没有。但是,您所展示的代码中有几个基本错误,很容易导致如下错误:
1使用静态共享连接对象。
这是一个众所周知的坏主意。我们可能都试过,也可能都遇到过类似的问题。底层系统在创建/池化/使用/处理数据库连接方面相当有效。不要试图优化它。相反,您应该在尽可能小的范围内创建/使用/处理连接。例如:

using (var  connection = new MySqlConnection(SOME_CONNECTION_STRING))
{
    var userCommand = new MySqlCommand(SOME_COMMAND_STRING);
    // use the command, get the data you need from it
}
// leave the context of the database and return to business logic, UI, etc.

这是因为保持像数据库连接这样复杂的事情的同步是很困难的,而保持连接的开放是很昂贵的。让基础系统打开/共用/关闭连接。
2不等待异步操作。
这里会发生什么

connection.OpenAsync();
userCommand.ExecuteNonQuery();

一个错误。因为代码没有等待异步操作,所以当您尝试使用它时连接没有打开。或者不要使用异步操作:

connection.Open();
userCommand.ExecuteNonQuery();

或者等待它:

await connection.OpenAsync();
userCommand.ExecuteNonQuery();

(很明显,这是一种包容的方法 async ,它的呼叫者应该等待它,等等),但绝对不要在它有机会打开之前尝试使用连接。
3. (不相关,但仍然很重要)您的代码易受sql注入攻击。
sql注入就发生在这里:

"SELECT * FROM xf_user WHERE username='" + emailoruser + "'"

你去哪了 emailoruser 从哪里来?是用户输入的吗?它是从用户以前提供的数据中提取的值吗?它有多可信?这种字符串连接方法的作用是允许任何用户在您的数据库上执行所需的任何sql代码。相反,使用查询参数并将用户输入视为值,而不是可执行代码。

相关问题