Мне часто в последнее время приходится работать с базами данных, вот решил немного упорядочить свои познания в этом. Не большой экскурс, MySQL это свободно распространяемая, очень популярная БД, некий стандарт де-факто в вебе, хотя после приобретения последней, компанией Oracle бытуют мнения что продукт захиреет либо превратится в коммерческий, ну что же поживем увидим. Для работы с этой БД в .NET на нужен коннектор, скачать его можно отсюда. После скачивания конектора, ставим его и приступаем к работе.
Не будем переводить много букв и сразу к делу, но перед тем как начнем, я не много расскажу о запросах к БД, что бы внести некоторую ясность. Условно говоря запросы к БД можно разделить на три категории:
- Обычный запрос, когда выбираются данные (SELECT *FROM users)
- Скалярный запрос, когда получаем некоторое число (SELECT COUNT(*) FROM users)
- Команда БД, когда запрос производит некоторую манипуляцию с базой или её структурой (DROP TABLE users)
Вот такое условное деление, ну теперь ближе к коду. Все достаточно просто сначала мы подключаемся к базе заполнив инициализирующую строку, где вводим имя базы, хост, логин и пасс. Открываем соединение. Создаем экземпляр класса MySqlCommand с помощью него мы будем исполнять запросы. Далее в классе мы заполняем, сам запрос и указываем к какому соединению он относится. В конце мы выполняем запрос, получая данные в MySqlDataReader. Как видите данный запросо относится к запросу на выборку данных.
MySqlConnection conn = new MySqlConnection(String.Format("Database={0};Data Source={1};User Id={2};Password={3}", "database", "localhost", "root", "123")); conn.Open(); MySqlCommand query = new MySqlCommand(); MySqlDataReader reader; query.CommandText = "SELECT *FROM users"; query.Connection = conn; reader = query.ExecuteReader(); while (reader.Read()) { //читаем данные }
Рассмотрим подробнее MySqlDataReader как видно из листинга что бы прочитать следующую порцию данных используется ф-ция Read(). Чтобы узнать количество полей извлеченных из базы нужно воспользоваться свойством FieldCount. Что бы получить название поля используем метод GetName(i) i- тут номер поля начинается с нуля. Думаю лучше показать это на примере.
string FieldName=""; string FieldValue="": while (reader.Read()) { for(int i=0;i<reader.FieldCount;i++) { if (!reader.IsDBNull(i)) { FieldName=reader.GetName(i); FieldValue=reader.GetString(i); } }
Таким образом мы получим данные, у меня здесь нет проверок, т.к. это просто примеры, но вам следует их расставить, а именно заключить в блоки try catch соединение с базой и выполнения запросов, так же при чтении из базы помните что нужно проверять, значение на не равенство null иначе будет получать краши, при первых не заполненных полях в базе как это показано в примере. Читать можно данные не только как строки, но и как битовые массивы, целые, числа с плавающей запятой. Общий принцип один и тот же, за более подробной информацией прошу сюда
Теперь посмотрим как выполнять скалярные запросы, тут ничего сложного, кроме одного нюанса, не знаю особенности ли это реализации коннектора что я использую либо же еще чего-то
object retval = new object(); query.CommandText = "SELECT COUNT(*) FROM users"; query.Connection = conn; retval= query.ExecuteScalar(); int result=int.Parse(retval.ToString());
Особенность здесь в том что я не использую приведение к Int32 как я видел в большинстве примеров, у меня почему-то не работало, так что сначала присываю, возвращенное значение переменной, а потом через приведение к строке и вызова int.Parse() получаею возвращенное значение.
Ну и осталась нам разобрать вопрос, как выполнять команды БД и как вставлять данные.
query.CommandText = "DROP TABLE users"; query.Connection = conn; retval= query.ExecuteNonQueryr();
Пример со вставкой
query.CommandText = String.Format("INSERT INTO table1 (name,balance) VALUES ('{0}','{1}')",name,balance); query.Connection = conn; retval= query.ExecuteNonQueryr();
Ну вот вроде и все основная идея думаю понятна, вообще я уверен еще очень много фишек которые стоит осветить, но как будет время обязательно. Это основы которых вам хватит, на первое время, остальное зависит от вас.
Оставить комментарий