Работа с MySQL в C#

Язык программирования C#

   Надеюсь данная публикация не даст читателям повторить мои ошибки и поможет сделать изначально правильный выбор. Первое с чего бы хотелось начать это с настоятельной рекомендации: «Программируя под .NET всегда пользуйтесь MySQL .NET — Коннектором!». Можно конечно и через ADO подключаться к базе но это чревато тем что в будущем вам просто будет необходимо вносить изменения при переходе на Windows Vista и выше.

Маленькое отступление: MySQL очень удобно использовать при программировании для мобильных устройств на базе Windows. Стандартные библиотеки работают и на мобильном устройстве под .NET CF точно так-же как и на сервере или рабочей станции. (Имеются ввиду те случаи, когда необходимо обращение с мобильного компьютера к базе данных на сервере. На самом мобильном устройстве сервер MySQL установить нельзя.) И в дополнение. Крайне не советую использовать на мобильном устройстве SQL.CE для больших баз данных (свыше 50000 записей в таблице) при росте базы быстродействие сильно падает. На мой взгляд гораздо лучше продумать свою систему хранения данных. Но об этом в отдельной публикации.

Для работы с MySQL вам понадобится «MySQL Connector / NET».
Скачать его можно здесь http://dev.mysql.com/downloads/connector/net/5.2.html
Чтобы иметь возможность работать с базой, скачиваем и устанавливаем утилиту.

Далее открываем наш проект и подключаем MySQL Connector:
Project->Add references->.NET->MySQL.Data
После чего в Solution Explorer в ветка Reference должна появиться MySQL.Data.

Обязательно прописываем в проекте:

using MySql.Data.MySqlClient;


Создание подключения к базе данных:
string CommandText = "Наш SQL скрипт";
string Connect="Database=БАЗА;Data Source=ХОСТ;User Id=ПОЛЬЗОВАТЕЛЬ;Password=ПАРОЛЬ";
//Переменная Connect - это строка подключения в которой:
//БАЗА - Имя базы в MySQL
//ХОСТ - Имя или IP-адрес сервера (если локально то можно и localhost)
//ПОЛЬЗОВАТЕЛЬ - Имя пользователя MySQL
//ПАРОЛЬ - говорит само за себя - пароль пользователя БД MySQL
MySqlConnection myConnection = new MySqlConnection(Connect);
MySqlCommand myCommand = new MySqlCommand(CommandText, myConnection);
myConnection.Open(); //Устанавливаем соединение с базой данных.
//Что то делаем...
myConnection.Close(); //Обязательно закрываем соединение!


Пунктик "//Что делаем..." может отличаться в зависимости от того, делаем ли мы выборку или производим изменения в базе.

Случай первый делаем выборку:

Выборка может быть двух видов: когда запрос возвращает нам одно значение и когда запрос возвращает нам набор значений. Обрабатывать их соответственно можно по разному.

Если запрос нам возвращает одно значение (надо быть уверенным что запрос вернёт именно одно значение иначе будет ошибка).
string znachenie = MyCommand.ExecuteScalar().ToString();


Если запорс нам возвращает множество значений то так:
MySqlDataReader MyDataReader;
MyDataReader = myCommand.ExecuteReader();

            while (MyDataReader.Read())
            {
                string result = MyDataReader.GetString(0); //Получаем строку
                int id = MyDataReader.GetInt32(1); //Получаем целое число
            }
MyDataReader.Close();


Случай второй, вносим изменения:

Для выполнения скрипта изменяющего данные используется:
MyCommand.ExecuteNonQuery();


Вот собственно и всё, с остальным не сложно разобраться самостоятельно.

Работа с MySQL в C Sharp

Комментарии:

dimchik 11 January 2010, 12:44 1 0

привет, Роман
чего-то не получилось у мну на мобильном устройстве. на ББ все нормально, а вот на эмуляторе, после добавлении ссылки на MySql.Data, на стадии развертывания ругается на не хватку памяти. Мож я че упустил
Да, и добавить ссылку смог через последние файлы, во вкладке .NET мускульного файла не было (там вообще список маленький стал когда платформа от покета)

Ответить
dimchik 11 January 2010, 01:19 0 0

странная весчь — на эмуляторе копирует вместе с новоиспеченной прогой много всяких dll'ек, а на самом кпк все работает и без них!?
мож другие эмуляторы есть с большим объемом памяти, а то у этого (wm 6 mobile) всего 30 метров пзу

Ответить
Roman 11 January 2010, 06:40 1 1

Вообще сам не запускал такое на эмуляторе, но пробовал. Основная проблема у меня была в сетевых настройках, там надо сеть настраивать на эмуляторе Microsoft Vitual PC ставить чтобы оно заработало, мне почему-то проще и привычнее на реальных устройствах. В остальном всё как обычно. 30 мегабайт более чем достаточно, уж точно ошибки вылетать не должно. Я тестил на стандартном эмуляторе Win Mobile 6.0 который доставляется к Visual Studio.
Есть один небольшой нюанс — не знаю учли ли вы. В проект включать надо драйвер MySql.Data.CF а не MySql.Data.
Для Win Mobile 6 — я в своём случае использовал .NET Connector версии 5.2.7 (на 5.2.2 допустим пытался — не работало).
На эмулятор при запуске из студии должен автоматом поставится .NET фреймворк. На устройстве (и на эмуляторе тоже — это я проверял) для запуска достаточно только MySql.Data.Cf и исполняемого файла программы, много разных библиотек — точно быть не должно.

Ответить
dimchik 11 January 2010, 05:34 0 0

коннектор у меня 6.2.2, драйвера mysql.ata.cf не нашел (цеплял MySql.Data), в списке .NET его нет, хотя в папке мускула он есть, как его добавить в проект-то, не вкурю чего-то

Ответить
Roman 11 January 2010, 06:08 1 1

MySql.Data.CF — цепляется очень просто. Project -> Add Reference -> Вкладка «Browse» -> Выбираешь саму MySql.Data.CF.dll — и всё, она добавится. В свойствах для библиотеки лучше поставить CopyLockal — в true — чтобы само при компиляции к готовому проекту помещалось.

Ответить
dimchik 11 January 2010, 06:52 0 0

блин, ля-ля, куда я смотрел, х.з. Спасибо — попробую

Ответить
dimchik 11 January 2010, 10:38 0 0

ну теперь с подключением CF все гуд, зато теперь другой затык — ругается на открытие БД — myConnection.Open() Что на эмуляторе — что на КПК. ошибку смотриш (на КПК) везде вроде stream, когда запускаеш не устанавливая соединение (через ВиФи) там же — UnableToConnectToHost. Значит соединение есть. В обычной, виндовой платформе тот же код — все пучком (ну за исключением MySql.Data.CF) Мож на маленьком брате открывать соединение подругому надо?
Как обработать ошибки подключения к базе? (нет подключения — не правильный логин-пароль и т.д.)

Ответить
dimchik 11 January 2010, 10:47 0 0

на пятой платформе вот чего в ошибках пишет — Timeouts are not supported on this stream.

Ответить
dimchik 11 January 2010, 10:53 0 0

вроде как нет соединения с БД!

Ответить
Roman 12 January 2010, 06:58 1 1

Я бы проверял, для начала, вот так:

try
{
   string myConnectionString = "Database=имя_базы;Data Source=имя_сервера;User Id=пользователь;Password=пароль";
   MySqlConnection myConnection = new MySqlConnection(myConnectionString);
   myConnection.Open();
   myConnection.Close();
   MessageBox.Show("Подключение прошло успешно!");
}
catch (Exception ex)
{
   MessageBox.Show("Ошибка: " + ex.Message);
}

Строка подключения должна быть именно такая, как в этом примере, проверять лучше на устройстве — устройство должно быть в сети (лучше это проверить предварительно — пропинговать чего нибудь с него например).
Касаемо этой ошибки: «Timeouts are not supported on this stream.» думаю что тут вариантов два:
1 — Сеть — просто не видит сервер (до MySql в этом случае дело даже не доходит) — этот вариант более вероятен.
2 — Драйвер (бывает — но маловероятно) — если описанное выше никак не поможет — можно попробовать с 5.2.7 — с ним точно работает проверял и на Win 5 и на Win 7 — могу выложить примерчик простой (исходник с дистрибутивом и dll-кой) для проверки.

Ещё есть один важный момент, при установке MySql — там задаётся возможен ли удалённый доступ, как вариант может также и пользователь под которым пытаетесь войти — не иметь прав на удалённый доступ. Вобщем проверять коннект лучше от root-а.

Ответить
Roman 12 January 2010, 07:09 0 1

Выше ошибочка — не Win 7 а Win 6.

Ответить
dimchik 12 January 2010, 06:12 0 0

пробовал и на устройстве — все тоже.
1 — сеть — впринципе видеть должен, устройство видит этот же сервак через http, все пучком. Порт открыт для внутреней подсети, устройство находится в ней же (как уже говорил WiFi), цепляюсь от имени root'а
2 — Драйвер — 5.2.7. у меня нет, если скинеш свой (только проверенный 100% тобой) примерчик было бы прекрасно (как интересно поведет себя твой рабочий код на 6.2.2)

p.s. я так думаю что разницы ведь нет — Win CE и Win Mobile, код ведь одинаково должен работать и там и тут?

Ответить
Roman 12 January 2010, 08:46 1 1

В общем скачал 6.2.2 проверил — действительно не работает — по всей видимости что-то с самим драйвером. Тестировал на HTC-HD2 (Win Mob 6.5)

Вот результат работы с 6.2.2

Вот результат с 5.2.7


Я на 5.2.7 перешёл поскольку 5.2.2 на Win-6.5 — отказался работать не так давно — тоже всякие чудесные ошибки писал (хотя на Win-5.X и 5.2.2 и 5.2.7 ведут себя замечательно).

Исходник: ExampleMySqlConnect_CE.rar

Сделан как приложение для WinCE — работать будет и на PocketPC и на Mobile.

Ответить
Roman 12 January 2010, 08:49 1 1

Драйвера разных версий скачать можно здесь: http://dev.mysql.com/downloads/connector/net/6.1.html
Там правда возможно попросит зарегистрироваться, но это не долго.

Ответить
dimchik 13 January 2010, 03:44 0 0

Ну вот, теперь понятно что с драйверами трабла, 6.2.2 удалить интересно, или они вместе могут существовать? Спасибо — будем учится дальше

Ответить
Alexander 12 March 2012, 10:07 0 0

Привет, Roman
Устанавливается соединение с БД на localhost.
При попытке соединения с БД на Интернет сервере сообщает Connector «Connector/Net no longer supports server versions prior to 5». Версия коннектора 6.4.4.0
Помогите, пожалуйста, советом. Не пойму куда «копать» ))

Ответить
Roman 12 March 2012, 02:43 0 1

«Connector/Net no longer supports server versions prior to 5»

Перевод: Connector/Net более не поддерживает сервера ниже 5-ой версии.
Ваш коннектор 6.4.4.0 не умеет работать с такими старыми версиями сервера, к которому вы обращаетесь.

Следовательно, чтобы решить данную проблему, можно:
1 — использовать более старый Connector — который поддерживает версии MySQL 4.X
2 — использовать MySQL сервер версии 5.X.

Ответить
Alexander 14 March 2012, 01:19 1 0

Большое спасибо! Действительно, на localhost MySQL 5.x, а у Интернет провайдера MySQL 4.x. В документации connector-net-en.a4.pdf в Chapter 1 «Connector/Net 6.4 includes support for MySQL Server 5.5, 5.1, and 5.0.» т.е. MySQL 4.x не поддерживается. Поставил Connector 5.1.2 все заработало!

Ответить
Mihail 10 November 2013, 03:15 1 0

Более корректно было бы выводить множественные значения вот так:
while (MyDataReader.Read())
{
for (int i = 0; i < MyDataReader.FieldCount; i++)
{
Console.Write(MyDataReader.GetValue(i).ToString());
}
Console.WriteLine();
}

Ответить