Maverick Aguilar Ответов: 3

Можно ли обновить datagridview в другой пользовательский элемент управления каждый раз, когда запрос выполняется


можно ли обновлять datagridview в другом usercontrol каждый раз, когда выполняется запрос'
у меня есть кнопка , которая вставляет, обновляет и удаляет одновременно

я очень смущен, потому что иногда он обновлял себя в другом пользовательском элементе управления
иногда нет


прямо сейчас я просто помещаю кнопку обновления в каждый пользовательский элемент управления, это хорошая идея??

я так растерялась
у меня есть 6 пользовательских элементов управления кстати

Что я уже пробовал:

DialogResult dial = MessageBox.Show("Confirm Returned Book '" + txtTitle.Text + "' BorrowedID by '" + txtBorrowID.Text +"?","Confirmation",MessageBoxButtons.YesNo,MessageBoxIcon.Question);
                if (dial == DialogResult.No)
                {
                    MessageBox.Show("Return cancel", "Confirm", MessageBoxButtons.OK);
                }
                else
                {
                    string query2;
                    query2 = "UPDATE book SET Copies = (Copies +  '" + comboCopies.Text + "') WHERE BookCodeID = '" + textBookCode.Text + "'";
                    con.Open();
                    MySqlCommand comm2 = new MySqlCommand(query2, con);

                    if (comm2.ExecuteNonQuery() == 1)
                    {

                        refresherBook();
                        refresherHistory();
                        refresherHistoryReturned();
                    }

                    

                    string query;
                    query = "INSERT INTO Returned(UserStatus,BookStatus,ReturnerID,BookCodeID,Title,Author,CallNo,AccessionNo,Edition,Copies,DateBorrowed,DateReturned)VALUES('" + comboUser.Text + "', '" + lblBorrowed.Text + "', '" + txtBorrowID.Text + "', '" + textBookCode.Text + "', '" + txtTitle.Text + "','" + txtAuthor.Text + "', '"+ txtCallNo.Text +"' ,'" + txtAccessionNo.Text + "', '" + txtEdition.Text + "', '" + comboCopies.Text + "', '" + dateBorrowed.Text + "', '" + dateTimePicker2.Text +"')";
                    
                    MySqlCommand comm = new MySqlCommand(query,con);

                    try
                    { 
                        if(comm.ExecuteNonQuery() == 1)
                        {
                            refresherBook();
                            refresherHistory();
                            refresherHistoryReturned();
                            string delete;
                            delete = "DELETE FROM Borrowed WHERE BorrowerID = '" + txtBorrowID.Text + "' AND BookCodeID = '" + textBookCode.Text + "'  AND Title = '"+ txtTitle.Text +"' AND CallNo = '"+ txtCallNo.Text +"'";
                            MySqlCommand commD = new MySqlCommand(delete, con);
                            if(commD.ExecuteNonQuery() >= 1)
                            {

                                MessageBox.Show("Return Successfull", "Congratulations", MessageBoxButtons.OK);
                                
                                clear();
                                
                                
                            }
                                                           
                                                                                                  
                        }
                        else
                        {
                            MessageBox.Show("Returning Failed","Try Again",MessageBoxButtons.OK);
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }

                    refresherBook();
                    refresherHistory();
                    refresherHistoryReturned();
                    con.Close();
                    
                }

3 Ответов

Рейтинг:
22

OriginalGriff

Не делай этого так! Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?


Maciej Los

Разумные 5! ;)

Member 14731572

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

Richard Deeming

Параметризованные запросы просты - например:

con.Open();

using (MySqlCommand comm2 = new MySqlCommand("UPDATE book SET Copies = (Copies + @Copies) WHERE BookCodeID = @BookCodeID", con))
{
    comm2.Parameters.AddWithValue("@Copies", comboCopies.Text);
    comm2.Parameters.AddWithValue("@BookCodeID", textBookCode.Text);
    
    if (comm2.ExecuteNonQuery() == 1)
    {
        refresherBook();
        refresherHistory();
        refresherHistoryReturned();
    }
}

MySQL :: MySQL Connector/NET руководство разработчика :: 5.6.1 подготовка инструкций в Connector/NET[^]

Member 14731572

ее мне, кстати, хе-хе спасибо за комментарий слишком болен самостоятельного изучения как
сделать это

CHill60

Вот некоторые отправные точки для вашего самостоятельного изучения - я нашел их очень полезными
Шпаргалка по параметризации запросов | OWASP[^]
Шпаргалка по предотвращению инъекций SQL | OWASP[^]

Member 14731572

wowowow спасибо спасибо!!!

Рейтинг:
2

Maciej Los

Функциональность поддержания данных в актуальном состоянии доступна через Класс SqlDependency[^] - для MS SQL Server.
К сожалению, .net provider for MySQL не содержит соответствующего класса... Вам нужно будет установить dbExpress driver for MySQL (несвободно) как я уже упоминал свой прошлый ответ: Sqldependency в mysql[^]

Пожалуйста, прислушайтесь к намекам OriginalGriff. Решение Chill60 выглядит очень интересным.

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


CHill60

Хорошие моменты о том, когда нужно освежиться!

Maciej Los

Спасибо, Кэролайн.

Рейтинг:
0

CHill60

Взгляните на реализацию шаблона "наблюдатель" в вашем коде, чтобы другие элементы управления могли подписаться на уведомления, которые им необходимо обновить.

Подробности здесь: Шаблон Проектирования Наблюдателя | Microsoft Docs[^]
или, возможно, лучше написать здесь: Шаблон проектирования Observer .NET в C# и VB - dofactory.com[^]


Maciej Los

Хорошая идея!