C# + MySQL запросы на выборку
C# + MySQL запросы на выборку

C# + MySQL запросы на выборку

14 июля 2022       125 просмотров

Будет немного больно длинно, так что безотлагательно приступим:

В какчестве примера возьмём мою говноподелку из разряда "tools_2", которые я набрасываю, чтобы было удобнее заполнять базу и на ней разберем выборку с несколькими значениями (ну, типа SELECT * FROM porn;) и с одним (ну, типа SELECT video FROM porn WHERE id=1; ).

На этот раз я не буду рассказывать как привычным движением чесать жопу создавать проект и добавлять формочки так что перейдём сразу к говнокоду. В Program.cs я объявляю несколько глобальных переменных, которые мне понадобятся:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace tools_2_addmain
{
    internal static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form2());//с какой формы хочу, с такой и начинаю
        }
        static public string username;//эта мне нужна для авторизации
        static public string password;//впрочем как и эта (надеюсь Ирина Анатольевна не увидит это, иначе она разочаруется, что я не делаю две больших разницы промеж аутентификацией и авторизацией)
        static public string uid;//а эта мне понадобится для передачи значения из одного блока "private" в другой, да технически это можно сделать внутри той же формы, но сделал как сделал короче, отъебитесь
    }
}

Не менее привычным движением забираю форму авторизации из другого проекта (да, я добавил кое-какие обработчики, но чтобы ишак из Роснано не растерялся, я всё подробно расписал):

using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace tools_2_addmain
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Escape)//нам нужна реакция только на Esc
            {
                Application.Exit();//закрываем программу
            }
            if (e.KeyCode == Keys.Enter)//нам нужна реакция только на Enter
            {
                try
                {
                    Program.username = textBox1.Text;//забираем значение из первого текстбокса
                    Program.password = textBox2.Text;//и из второго
                    string connect = "Server=92.126.251.58;database=tankdb;port=3306;Uid=" + Program.username + ";pwd=" + Program.password;//параметры подключения
                    MySqlConnection pconn = new MySqlConnection(connect);//создаем подключение
                    MySqlCommand command = new MySqlCommand("", pconn);//не забываем про параметры
                    pconn.Open();//открываем соединение
                    pconn.Close();//не забываем закрыть соединение
                    Form1 form1 = new Form1();
                    form1.Show();//объявляем и переходим ко второй форме
                    this.Hide();//а эту с глаз долой прячем
                }
                catch
                {
                    MessageBox.Show("not OK");//что-то пошло не так
                }
            }
        }

        private void textBox2_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Escape)//нам нужна реакция только на Esc
            {
                Application.Exit();//закрываем программу
            }
            if (e.KeyCode == Keys.Enter)//нам нужна реакция только на Enter
            {
                try
                {
                    Program.username = textBox1.Text;//забираем значение из первого текстбокса
                    Program.password = textBox2.Text;//и из второго
                    string connect = "Server=92.126.251.58;database=tankdb;port=3306;Uid=" + Program.username + ";pwd=" + Program.password;//параметры подключения
                    MySqlConnection pconn = new MySqlConnection(connect);//создаем подключение
                    MySqlCommand command = new MySqlCommand("", pconn);//не забываем про параметры
                    pconn.Open();//открываем соединение
                    pconn.Close();//не забываем закрыть соединение
                    Form1 form1 = new Form1();
                    form1.Show();//объявляем и переходим ко второй форме
                    this.Hide();//а эту с глаз долой прячем
                }
                catch
                {
                    MessageBox.Show("not OK");//что-то пошло не так
                }
            }
        }

        private void Form2_FormClosed(object sender, FormClosedEventArgs e)
        {
            Application.Exit();//закрываем программу
        }

        private void textBox1_Click(object sender, System.EventArgs e)
        {
            textBox1.SelectAll();//при клике выделяем всё содержимое текстбокса, я свои пальцы не на помойке нашел, чтобы каждый раз выделять вручную
        }

        private void textBox1_Enter(object sender, System.EventArgs e)
        {
            textBox1.SelectAll();//при входе выделяем всё содержимое текстбокса
        }

        private void textBox2_Enter(object sender, System.EventArgs e)
        {
            textBox2.SelectAll();//при входе выделяем всё содержимое текстбокса
        }

        private void textBox2_Click(object sender, System.EventArgs e)
        {
            textBox2.SelectAll();//при клике выделяем всё содержимое текстбокса
        }
    }
}

Ну и в качестве примера привожу то, как можно делать и выводить запросы на 1 и несколько значений (по одному полю, если полей несколько, вам, вероятно нужно выводить инфу в dataGridView, а про такое я уже писал):

using System;
using System.Data;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace tools_2_addmain
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        static string connect = "Server=92.126.251.58;database=tankdb;port=3306;Uid=" + Program.username + ";pwd=" + Program.password;//параметры подключения
        MySqlConnection pconn = new MySqlConnection(connect);//создаем подключение

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            Application.Exit();//закрываем программу при закрытии формы
        }

        private void comboBox1_Click(object sender, EventArgs e)//при клике на comboBox
        {
            try
            {
                DataTable login = new DataTable();//нам понадобится табличка, создаем
                string sqlsel = "SELECT login FROM logpasst;";//вот такой запрос номер 1
                pconn.Open();//открываем подключение
                MySqlCommand choose = new MySqlCommand(sqlsel, pconn);//создаем комманду
                MySqlDataAdapter adapter = new MySqlDataAdapter(choose);//для нескольких значений нам понадобится адаптер
                adapter.Fill(login);//через который мы наполняем табличку
                comboBox1.DataSource = login;//указываем источник данных для нашего comboBox'а
                comboBox1.DisplayMember = "login";//это нужно для отображения содержимого
                pconn.Close();//не забываем закрыть соединение
            }
            catch
            {
                MessageBox.Show("Проверьте подключение");//если что-то пошло не так, пёстелеком, допустим, чудит
            }
        }

        private void button1_Click(object sender, EventArgs e)//жамкаем по кнопке
        {
            string login = comboBox1.Text;//объявляем и читаем что мы там выбрали/ввели
            string idsel = "SELECT idlogpasst FROM logpasst WHERE login=@login;";//это уже запрос на одно конкретное значение
            pconn.Open();//открываем соединение
            MySqlCommand chooseid = new MySqlCommand(idsel, pconn);//создаем команду
            chooseid.Parameters.AddWithValue("@login", login);//передаем значение
            MySqlDataReader uid = chooseid.ExecuteReader();//в этом случаем нам достаточно ридера, создаем
            uid.Read();//читаем
            Program.uid = uid.GetString(0);//и присваиваем значение переменной
            pconn.Close();//закрываем соединение
            MessageBox.Show(Program.uid);//смотрим что мы там забрали из базы
        }
    }
}

Да, технически id'шник, было бы можно передавать как int параметром GetValue, но я уже объявил переменную uid в Program.cs как string, так что пусть будет так.

Осталось только проверить результат:

Привычным движением запускаем лечение герпеса нашу залипуху:

стартуем

Проверяем, загружаются ли данные в comboBox:

внезапно, загружаются

Выберем какую-нибудь запись и посмотрим какой у неё id, жамкнув по кнопке:

ок, сойдёт

Вы, конечно же, спросите: "Александр, а почему для челочисленного значения (id) ты используешь string, а не int?
А я вам отвечу: "Эту срань я буду в дальнейшем использовать в sql-запросах, вот зачем мне она нужна в Program.cs и в качестве переменной string — чтобы не ебаться с преобразованием типа переменных".