【问题标题】:Connection to MySQL from .NET using SSH.NET Library使用 SSH.NET 库从 .NET 连接到 MySQL
【发布时间】:2015-12-12 18:25:16
【问题描述】:

我正在开发一个网页 (ASP.NET/C#),它通过 SSH 查询远程服务器上的 (MySQL) 数据库。我正在使用这两个库(mysql-connector-net-6.9.7)和(Renci.SshNet.dll)。

我可以通过 SSH 连接使用远程服务器上的 MySQL Workbench 访问 MySQL 数据库:
portal.RemoteServer.edu:22”使用“RemoteServerUsername”和
RemoteServerPassword”。

这是我的 C# 代码,它不会从远程服务器上的 Clients 表中返回任何数据:

MySqlConnectionStringBuilder connBuilder = new MySqlConnectionStringBuilder();
connBuilder.AllowBatch = true;
connBuilder.Server = "127.0.0.1";
connBuilder.Port = 3306;
connBuilder.UserID = "LocalHostUserID";
connBuilder.Password = "LocalHostPassword";
connBuilder.Database = "DatabaseName";

var auth =
    new PasswordAuthenticationMethod("RemoteServerUsername", "RemoteServerPassword");
ConnectionInfo conInfo =
    new ConnectionInfo("portal.RemoteServer.edu", "RemoteServerUsername", auth);

using (SshClient client = new SshClient(conInfo))
{
    ForwardedPortLocal port = new ForwardedPortLocal("127.0.0.1", 0, "127.0.0.1", 22);
    client.Connect();
    client.AddForwardedPort(port);
    port.Start();
    MySqlConnection conn = new MySqlConnection(connBuilder.ConnectionString);
    conn.Open();
    conn.ChangeDatabase(connBuilder.Database);

    var command = "SELECT * FROM DatabaseName.Clients LIMIT 10";
    using (MySqlCommand cmd = new MySqlCommand(command))
    {
        using (MySqlDataAdapter sda = new MySqlDataAdapter())
        {
            cmd.Connection = conn;
            sda.SelectCommand = cmd;
            using (DataTable dt = new DataTable())
            {
                sda.Fill(dt);
                GridView1.DataSource = dt;
                GridView1.DataBind();
            }
        }
    }
}

【问题讨论】:

    标签: c# mysql ssh mysql-workbench ssh.net


    【解决方案1】:

    下面的大部分代码都是不言自明的。我仍然放置了需要的 cmets。我能够使用下面的代码连接到 MySql 数据库。我使用了来自 here 的 SSH 库和用于 .NET 的 MySql 连接器。

    using(var client = new SshClient("ssh server id", "sshuser", "sshpassword")) // establishing ssh connection to server where MySql is hosted
    {
        client.Connect();
        if (client.IsConnected)
        {
            var portForwarded = new ForwardedPortLocal("127.0.0.1", 3306, "127.0.0.1", 3306);
            client.AddForwardedPort(portForwarded);
            portForwarded.Start();
            using (MySqlConnection con = new MySqlConnection("SERVER=127.0.0.1;PORT=3306;UID=someuser;PASSWORD=somepass;DATABASE=Dbname"))
            {
                using (MySqlCommand com = new MySqlCommand("SELECT * FROM cities", con))
                {
                    com.CommandType = CommandType.CommandText;
                    DataSet ds = new DataSet();
                    MySqlDataAdapter da = new MySqlDataAdapter(com);
                    da.Fill(ds);
                    foreach (DataRow drow in ds.Tables[0].Rows)
                    {
                        Console.WriteLine("From MySql: " + drow[1].ToString());
                    }
                }
            }
            client.Disconnect();
        }
        else
        {
            Console.WriteLine("Client cannot be reached...");
        }
    }
    

    【讨论】:

    • 如果您运行本地 mysql 实例,请将端口更改为 3307,如 new ForwardedPortLocal("127.0.0.1", 3306, "127.0.0.1", 3307) 然后连接字符串应更改为 PORT=3307
    【解决方案2】:
    1. 您必须将本地端口转发到远程 MySQL 端口 (3306),而不是 SSH 端口 22(这会造成循环)。

    2. 您将0 传递给ForwardedPortLocalboundPort 参数。这意味着操作系统会自动选择端口号。然而,您正试图通过固定端口3306 连接到 MySQL。

      • 要么将固定端口3306 传递给ForwardedPortLocal

        port = new ForwardedPortLocal("127.0.0.1", 3306, "127.0.0.1", 3306);
        

        如果本地 MySQL 数据库已使用本地 3306 端口,则此方法将不起作用。您当然可以使用任何其他本地端口(但远程端口必须是 3306)。

      • 或将port.BoundPort 值(在调用port.Start() 之后)用于connBuilder.Port

        port.Start();
        connBuilder.Port = port.BoundPort;
        conn = new MySqlConnection(connBuilder.ConnectionString);
        

        确保您拥有最新版本的 SSH.NET 库。 .BoundPort was not updated in the old versions

      请注意,第一个127.0.0.1 指的是您的本地机器(相对于您的本地机器的IP 地址),而第二个是指服务器(IP 地址是相对于服务器机器的)。您通常可以省略第一个参数。

    【讨论】:

      猜你喜欢
      • 2012-06-04
      • 2020-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多