Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
1 / 1 / 1
Регистрация: 07.11.2017
Сообщений: 52

Очистка полученной таблицы

14.12.2019, 04:19. Показов 2601. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ситуация такая: поля: роль, фио, логин, пароль, подтверждение пароля при создании пользователя.
В коде прописана проверка на непустые поля, на совпадение введенных паролей и на проверку уникальности логина.

При проведении каждой из этих проверок стопорюсь на одном - если сначала ввести логин пользователя уже существующего - выпадет месседж об ошибке (что и должно быть), а после нажатия ОК и изменения логина на новый, уникальный, выдает ошибку от предыдущей проверки.

Я так понимаю, проблема в том, что после указания другого логина новый SELECT почему-то не проводится при очередном выполнении метода, поэтому остается старая строка, а как почистить это дело, чтобы работало - не знаю(

Если видите какие еще косяки - поправьте меня, пожалуйста. В связке MySQL-C# работаю всего второй раз, мог что-то забыть или что-то недописать, а то и лишнего влепить)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
private void AddUsr_Click(object sender, EventArgs e)
        {
            MySqlConnection con = new MySqlConnection(conString);
            DataTable table = new DataTable();
            MySqlDataAdapter adapter = new MySqlDataAdapter();
 
            string n = uname.Text;
            string un = username.Text;
            string p = upass.Text;
            string rp = rpass.Text;
            string g = ugroup.Text;
 
            if (g == "Администратор")
                g = "Administrator";
            if (g == "Кассир")
                g = "Cassir";
            if (g == "Оператор")
                g = "Operator";
            
            if ((n != "") && (un != "") && (p != "") && (rp != ""))
            {
                if (p == rp)
                {
                    string login = null; 
                    string SQLcom = "SELECT username, pass, groupe, name FROM users WHERE username = @uL";
                    con.Open();
                    cmd.Parameters.AddWithValue("@uL", un);
                    cmd.Connection = con;
                    cmd.CommandText = SQLcom;
                    adapter.SelectCommand = cmd;
                    adapter.Fill(table);
 
                    MySqlDataReader reader = cmd.ExecuteReader();                    
                    while (reader.Read())
                        {
                            login = reader[0].ToString();
                        }
                    con.Close();
                    if (table.Rows.Count > 0)                    
                        {
                            MessageBox.Show("Пользователь с указанным логином уже существует!", "Ошибка");
                        }
                    else
                    {                        
                        string com = "INSERT INTO users (name, username, pass, groupe) VALUES (@uN, @usN, @uP, @uG)";
                        con.Open();
                        cmd.Parameters.AddWithValue("@uN", n);
                        cmd.Parameters.AddWithValue("@usN", un);
                        cmd.Parameters.AddWithValue("@uP", p);
                        cmd.Parameters.AddWithValue("@uG", g);
                        cmd.Connection = con;
                        cmd.CommandText = com;
                        adapter.SelectCommand = cmd;
                        adapter.Fill(table);
                        con.Close();
                    }
                }
                else MessageBox.Show("Пароли не совпадают", "Ошибка");
            }
            else MessageBox.Show("Не все поля заполнены", "Ошибка");
        }
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.12.2019, 04:19
Ответы с готовыми решениями:

Очистка таблицы базы данных Access
Как можно полностью очистить данные таблицы БД на C#? Пробовал таким способом: var dataSet = new TasksDataSet(); // Объявление...

Сортировка Таблицы формы (полученной из Дерева значений) по клику на заголовки таблицы
Добрый день уважаемые форумчане ... Есть проблема - прошу совета у Гуру ... Пришлось для списка Документов сделать Дерево значений и...

Не захватывает совпадения из таблицы полученной в запросе
/** * * @param EnteredString - введенное значение в текствое поле окна * @param strField - название поля в SQL таблице *...

12
Эксперт .NET
 Аватар для Usaga
14321 / 9411 / 1356
Регистрация: 21.01.2016
Сообщений: 35,474
14.12.2019, 06:03
Не-шарю, да не трогайте вы этот бедный MySqlDataAdapter и DataTable. Посмотрите в FAQ примеры более правильной работы с ADO.NET.
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
14.12.2019, 10:38
Цитата Сообщение от Не-шарю Посмотреть сообщение
Если видите какие еще косяки - поправьте меня, пожалуйста.
Сам напросился)
Цитата Сообщение от Не-шарю Посмотреть сообщение
C#
1
2
3
4
5
6
if (g == "Администратор")
                g = "Administrator";
            if (g == "Кассир")
                g = "Cassir";
            if (g == "Оператор")
                g = "Operator";
Если пользователь напишет Касир, то появится новая группа? Чтобы такого не происходило, группу нужно выбирать из уже существующих. Поэтому делается таблица Groups(да, по английски надо писать Group а не Groupe) и в ней 2 поля
GroupID
GroupName
В таблице users меняем groupe на GroupID и значение должно быть не строкой, а того же типа что GroupID.
Вместо текстбокса ugroup используем комбобокс, наполненный данными из таблицы Groups. Соответственно переделать команду INSERT.
Тут еще можно было бы порассуждать, почему пользователь сам определяет, к какой группе он принадлежит(кто же не захочет быть админом ). А если это админ регистрирует пользователя, то как тот узнает свой пароль?)
При проверке логина не нужно возвращать всю запись из базы, достаточно знать, есть такой логин или нет
C#
1
2
3
4
5
6
7
8
9
10
string SQLcom = "SELECT count(*) FROM users WHERE username = @uL";
con.Open();
cmd.Parameters.AddWithValue("@uL", un);//откуда этот cmd взялся? Все переменные для подключения к БД создаются в этом методе, а этот пришел откуда-то со стороны. Это плохая практика.
cmd.Connection = con;
cmd.CommandText = SQLcom;
int count= (int)cmd.ExecuteScalar();
if(count>0)
{
MessageBox.Show("Пользователь с указанным логином уже существует!", "Ошибка");
}
Цитата Сообщение от Не-шарю Посмотреть сообщение
а после нажатия ОК и изменения логина на новый, уникальный, выдает ошибку от предыдущей проверки.
Предыдущая-это проверка на идентичность паролей? Нужно проверить в отладчике, что туда попадает.
Чтобы не запутаться в if-ах, проверка на заполнение всех полей должны быть в самом начале
C#
1
2
3
4
5
6
7
8
9
10
if ((n == "") || (un == "") || (p == "") || (rp == ""))
{
MessageBox.Show("Не все поля заполнены", "Ошибка");
return;
}
else if(p != rp)
{
MessageBox.Show("Пароли не совпадают", "Ошибка");
return;
}
0
1 / 1 / 1
Регистрация: 07.11.2017
Сообщений: 52
14.12.2019, 10:45  [ТС]
Usaga, а Вы можете на моем конкретном примере код переписать так, как должно быть правильно?
0
Эксперт .NET
 Аватар для Usaga
14321 / 9411 / 1356
Регистрация: 21.01.2016
Сообщений: 35,474
14.12.2019, 10:48
Не-шарю, выше же хороший пример.
0
1 / 1 / 1
Регистрация: 07.11.2017
Сообщений: 52
14.12.2019, 11:14  [ТС]
Igr_ok, пользователь выбирает из комбобокса с DropDownList значение на русском, после создания оно переводится в английский, и мне не нужна для этого отдельная таблица, так что тут все нормуль). И управление пользователями ведется только через админскую форму - все ок. Админ - единственный, кто уже существует в базе, логин-пароль передаются вместе с документацией к программе.

Цитата Сообщение от Igr_ok Посмотреть сообщение
Предыдущая-это проверка на идентичность паролей? Нужно проверить в отладчике, что туда попадает.
Чтобы не запутаться в if-ах, проверка на заполнение всех полей должны быть в самом начале
Нет, предыдущая проверка - проверка логина. Допустим введу уже существующий логин "Admin" - выдаст ошибку, что такое уже есть, после закрытия мессбокса и изменении "Admin" на все, что угодно - выдаст ошибку, что такой логин уже существует (сохранилась проверка по логину "Admin", и не хочет перезаписываться для следующих запросов)

Добавлено через 13 минут
Igr_ok

int count= (int)cmd.ExecuteScalar() - invalidcastexception, заданное приведение является недопустимым.
0
Эксперт .NET
 Аватар для Usaga
14321 / 9411 / 1356
Регистрация: 21.01.2016
Сообщений: 35,474
14.12.2019, 11:28
Цитата Сообщение от Не-шарю Посмотреть сообщение
int count= (int)cmd.ExecuteScalar() - invalidcastexception, заданное приведение является недопустимым.
Значит надо привести к long.
0
1 / 1 / 1
Регистрация: 07.11.2017
Сообщений: 52
14.12.2019, 12:41  [ТС]
Usaga, код упростили, а к решению так и не пришли

из.1 - ввод уже существующего логина, результат - ошибка, ок || сount = 1
из.2 - ввод не существующего логина, результат - ошибка || сount = 1

Решил убрать параметр и проверить прямой передачей значения из из.2. В итоге сount = 0 и, о чудо, все работает. Только как вернуться к передаче через параметр? Его реально как-то очистить от данных прошлой итерации?

Так работает правильно:
C#
1
2
3
4
5
6
7
8
9
10
                    string SQLcom = string.Format("SELECT count(*) FROM users WHERE username = '{0}'",ul);
                    con.Open();
                    cmd.Connection = con;
                    cmd.CommandText = SQLcom;
                    long count = (long) cmd.ExecuteScalar();
                    if (count > 0)
                    {
                        MessageBox.Show("Пользователь с указанным логином уже существует!", "Ошибка");
                        con.Close();
                    }
Так работает неправильно:
C#
1
2
3
4
5
6
7
8
9
10
11
                    string SQLcom = "SELECT count(*) FROM users WHERE username = @uL";
                    con.Open();
                    cmd.Parameters.AddWithValue("@uL", un);
                    cmd.Connection = con;
                    cmd.CommandText = SQLcom;
                    long count = (long) cmd.ExecuteScalar();
                    if (count > 0)
                    {
                        MessageBox.Show("Пользователь с указанным логином уже существует!", "Ошибка");
                        con.Close();
                    }
Миниатюры
Очистка полученной таблицы   Очистка полученной таблицы  
0
1 / 1 / 1
Регистрация: 07.11.2017
Сообщений: 52
14.12.2019, 17:04  [ТС]
Usaga, Igr_ok, ну что, как быть, чтобы правильно сделать?
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
14.12.2019, 19:33
Цитата Сообщение от Не-шарю Посмотреть сообщение
ну что, как быть, чтобы правильно сделать?
Исправлять ошибки сразу, а не надеяться, что "всё нормуль".
Цитата Сообщение от Igr_ok Посмотреть сообщение
cmd.Parameters.AddWithValue("@uL", un);//откуда этот cmd взялся? Все переменные для подключения к БД создаются в этом методе, а этот пришел откуда-то со стороны. Это плохая практика.
Метод AddWithValue добавляет параметр к коллекции, вот они и хранятся там с разными значениями. Вангую, что берется всегда первый по индексу.
0
1 / 1 / 1
Регистрация: 07.11.2017
Сообщений: 52
14.12.2019, 19:42  [ТС]
Цитата Сообщение от Igr_ok Посмотреть сообщение
cmd.Parameters.AddWithValue("@uL", un);//откуда этот cmd взялся? Все переменные для подключения к БД создаются в этом методе, а этот пришел откуда-то со стороны. Это плохая практика.
MySqlCommand cmd = new MySqlCommand(), обитает в public partial class AddUs : Form.

А как почистить коллекцию параметров?
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
14.12.2019, 20:20
Лучший ответ Сообщение было отмечено Не-шарю как решение

Решение

Цитата Сообщение от Не-шарю Посмотреть сообщение
А как почистить коллекцию параметров?
Заменять баг костылем-это тоже плохая практика. Но если нравится часами искать ошибку, то так
C#
1
cmd.Parameters.Clear();
0
1 / 1 / 1
Регистрация: 07.11.2017
Сообщений: 52
15.12.2019, 15:23  [ТС]
Цитата Сообщение от Igr_ok Посмотреть сообщение
cmd.Parameters.Clear();
Браво! Вот и все решение проблемы, спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.12.2019, 15:23
Помогаю со студенческими работами здесь

Ввод полученной информации, распечатка ее в виде таблицы
Пусть дан массив, содержащий сведения об игрушках: указывается название игрушки (например, кукла, кубики, мяч, конструктор и т.д.), ее...

Заполнение таблицы с динамическим размером html значениями матрицы, полученной через Javascript
Проблема такая: нужно как-то создать таблицу, которая будет заполняться значениями элементов матрицы. Матрица динамична, ее размеры...

Очистка таблицы
Есть AdoQuery и очистить таблицу от записей(оставить только структуру). А так же есть вопрос: КАК ЭТО СДЕЛАТЬ? ...

Очистка таблицы
У меня на хостинге уже готовый движок, там есть чат, он никогда неочищается сам по себе. Что тут можно придумать? Я так полагаю нужна...

Очистка таблицы БД
Нужна ваша помощь Нужно сделать PHP файл для автоочистки таблицы MySQL В базе есть строка с началом времени и продолжительностю, когда...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru