3

我正在尝试与位于另一台机器上的 MySql 数据库建立简单的连接。我可以远程登录到 Windows 上的数据源,并使用 OSX和 Ubuntu上的终端——无论是在我的网络内部还是外部。但是,它拒绝通过我在 OSX 上的单声道项目进行连接。

我收到:

无法连接到任何指定的 MySQL 主机...

我已经确认没有生效的防火墙规则——在我的 OSX 或 Ubuntu 机器上都没有,数据库托管在哪里。MySQL 工作台与 mono 项目在同一台机器上,能够毫无问题地连接。

我试图通过代码连接到数据库:

服务器=我的IP;数据库=FK;用户 ID=乔治;密码=通过;端口=3306

并通过 OSX 上 Mono 中预装的插件:

Tools > Database > Add Database Connection > MySql database

我不使用我的连接字符串——我让它根据我的数据库信息创建它自己的。但是,这并没有什么不同。当我测试我的连接时 - 它仍然失败,并在我尝试以编程方式连接时收到相同的消息。

托管 mySQL 数据库的服务器显示没有连接尝试。

我尝试同时使用 5.2 单声道 .NET 连接器和 6.3 连接器(v2 和 v4) 没关系,两者都无法连接。

我已经尝试将我的程序集放在 GAC 中,并在我的项目的 bin 目录中本地放置。这没什么区别。

我在连接协议中尝试过socket和tcp,以及内存和管道。没有工作。

为什么我无法连接到我的服务器,这对我来说完全没有意义,它在其他任何地方都可以工作,除了在 Mono 中。没有运行防火墙会阻止我的请求。

从 Mono 连接应该不难,所以某处显然是非常错误的——看到 IDE 甚至无法连接到数据库。

我的凭据是绝对正确的,尽管这并不重要——因为我什至无法访问服务器。我假设它正在尝试连接,因为大约需要 10-15 秒才能收到表示无法连接的响应。

当部署到我的 Ubuntu 服务器(作为 mySQL 服务器位于单独的机器和网络上)时,完全相同的代码可以正常连接,该服务器通过 mono 和 apache 提供服务。会不会是 XSP 问题?我不知道。

我花了无数个小时试图让它工作,浏览了我能找到的关于从 mono 连接到 mySQL 的每个教程和网站。每个人都以与上一个相同的方式得出结论,失败。有什么帮助吗?

4

1 回答 1

3

这是我为使其连接所做的工作。

  1. 下载 MySql.Data 适配器的源代码。
  2. 替换CreateSocketStream方法StreamCreator.cs (见代码注释)

     private Stream CreateSocketStream(IPAddress ip, bool unix)
        {
            EndPoint endPoint;
    
            // You don't need the following lines.
            //if (!Platform.IsWindows() && unix)
            //  endPoint = CreateUnixEndPoint(hostList);
            //else
    
            // Instead create a regular IPEndPoint.
            endPoint = new IPEndPoint(ip, (int)port);
            // Replace the socket it is trying to use with the following.
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            if (keepalive > 0)
            {
                SetKeepAlive(socket, keepalive);
            }
             // Remove the async.  connection.  This hangs and fails.  Not sure why.
            //IAsyncResult ias = socket.BeginConnect(endPoint, null, null);
            //if (!ias.AsyncWaitHandle.WaitOne((int)timeOut * 1000, false))
            //{
            //  socket.Close();
            //  return null;
            //}
            try {
                // Instead do a regular blocking connect to the endpoint.
                socket.Connect(endPoint);
            } catch (Exception ex) {
                throw;
            }
    
            // No longer relevant.
            //try
            //{
            //  socket.EndConnect(ias);
            //}
            //catch (Exception)
            //{
            //  socket.Close();
            //    throw;
            //}
            MyNetworkStream stream = new MyNetworkStream(socket, true);
            GC.SuppressFinalize(socket);
            GC.SuppressFinalize(stream);
            return stream;
        }
    

显然,这是丑陋的,也是一种黑客行为。但是,除了我上面评论的让 OSX + Mono 连接之外,我没有找到其他方法。如果没有这些更改,它根本无法工作。

于 2011-05-20T14:34:09.163 回答