无论我尝试什么,MySQL .NET适配器都拒绝从Mono连接

时间:2011-05-09 18:22:44

标签: mysql mono mysql-connector

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

我收到:

  

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

我已经确认没有防火墙规则生效 - 无论是在托管数据库的OSX还是Ubuntu机器上。 MySQL工作台与单声道项目在同一台机器上,可以毫无问题地连接。

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

  

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

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

Tools > Database > Add Database Connection > MySql database

我不使用我的连接字符串 - 我让它根据我的数据库信息创建它自己的连接字符串。但是,它没有任何区别。当我测试我的连接时 - 当我尝试以编程方式连接时,它仍然会收到相同的消息。

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

我试图同时使用5.2 mono .NET连接器和6.3连接器(v2和v4)无关紧要,两者都无法连接。

我尝试将我的程序集放在GAC中,然后本地放在bin目录中的项目中。它没有什么区别。

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

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

从Mono连接起来应该不难,所以某些地方显然非常错误 - 看到IDE甚至无法连接到数据库。

我的凭据绝对正确,即使无关紧要 - 因为我甚至无法点击服务器。我会假设它正在尝试连接,因为它需要大约10-15秒才能收到回复,说它无法连接。

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

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

1 个答案:

答案 0 :(得分: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;
        }
    
  3. 显然这是丑陋和黑客。但是,我没有找到其他方法,除了我上面评论的让OSX + Mono连接。如果没有这些变化,它将无法运作。