MySQL .NET-адаптер отказывается подключаться из Mono, что бы я ни пытался - PullRequest
3 голосов
/ 09 мая 2011

Я пытаюсь установить простое соединение с базой данных MySql, расположенной на другом компьютере.Я могу подключиться к источнику данных в Windows и использовать терминал в OSX и Ubuntu - как для внутренней, так и для внешней сети.Однако он отказывается подключаться через мой монопроект на OSX.

Я получаю:

Невозможно подключиться к любому из указанных хостов MySQL ...

Я подтвердил, что правила брандмауэра не действуют - ни на моих машинах с OSX или Ubuntu, где размещается база данных.MySQL Workbench, который находится на том же компьютере, что и моно-проект, может подключаться без проблем.

Я попытался подключиться к базе данных с помощью кода:

Server =MyIP;Database = FK;Идентификатор пользователя = джордж;= ПАРОЛЬ;Порт = 3306

и через плагин, который предустановлен в Mono на OSX:

Tools > Database > Add Database Connection > MySql database

Не знаюt использовать мою строку подключения - я позволил ей создать свою собственную, основываясь на информации моей базы данных.Тем не менее, это не имеет значения.Когда я проверяю свое соединение - оно все равно не работает с тем же сообщением, которое я получаю, когда пытаюсь подключиться программно.

Сервер, на котором размещена база данных mySQL, не показывает никаких попыток соединения.

Я пыталсяиспользуйте как моно-разъем 5.2 .NET, так и разъемы 6.3 (как v2, так и v4). Неважно, оба не могут подключиться.

Я попытался разместить свои сборки в GAC и локально для моего проекта вкаталог bin.Это не имеет значения.

Я попробовал и сокет и TCP, а также память и канал в протоколе соединения.Ничего не работает.

Для меня абсолютно бессмысленно, почему я не могу подключиться к своему серверу, где он работает везде, кроме Mono.Есть нет запущенных брандмауэров, которые будут блокировать мои запросы.

Не должно быть так сложно подключиться из Mono, так что что-то явно очень где-то не так -- видя, что IDE не может даже подключиться к базе данных.

Мои учетные данные абсолютно правильные, хотя это и не имеет значения - поскольку я даже не могу попасть на сервер.Я предполагаю, что он пытается подключиться, так как для получения ответа о том, что он не может подключиться, требуется около 10-15 секунд.

Тот же самый точный код прекрасно подключается при развертывании намой сервер Ubuntu (расположенный на отдельной машине и в сети, как сервер MySQL), который обслуживает его через моно и apache.Может ли это быть проблемой XSP?Я понятия не имею.

Я потратил бесчисленные часы, пытаясь заставить это работать, просматривая все учебники и веб-сайты, которые я мог найти о подключении к mySQL из mono.Каждый заключил так же, как и последний, неудачу.Любая помощь?

1 Ответ

3 голосов
/ 20 мая 2011

Вот что я сделал, чтобы подключить его.

  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.Это просто не будет работать без этих изменений.

...