我正在尝试与位于另一台计算机上的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的每个教程和网站。每个人都以与上一次失败相同的方式结束。有什么帮助吗?
答案 0 :(得分:3)
以下是我为连接而采取的措施。
替换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连接。如果没有这些变化,它将无法运作。