pinGOL2305 Ответов: 2

Как мгновенно обновить таблицу базы данных с помощью C# ?


Я написал следующий код, чтобы обновить таблицу "курсы" моего проекта. Но это не работает. Пожалуйста, подскажите мне, что я делаю не так..

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

обновление частной пустоты()
{
пробовать
{
строка ConnectionString = @ " источник данных= D3ll\SQLEXPRESS; начальный каталог=GMS; Интегрированная безопасность=True";
Sqlconnection Connection = new SqlConnection(ConnectionString);
Соединение.Открыть();
string Query = " UPDATE Courses SET Title=' " + TitleTextBox.Текст + "', Плата=' " + FeeTextBox.Text + "', Description='" + DescriptionTextBox.Текст + "' WHERE CourseID=' " + CourseIDTextBox.Текст + "'";
Команда SqlCommand = новая команда SqlCommand(запрос, соединение);
Команда.Метод executenonquery();
Соединение.Закрывать();
}
поймать (исключение бывший)
{
Ящик для сообщений.Шоу ("Ой!! Что-то не так!!");
}
}

Beginner Luck

Я люблю sql-инъекцию вашего sql-запроса. пожалуйста, сначала исправьте это

pinGOL2305

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

vatsa_gaurav

Использование параметров и лучше писать это в хранимой процедуре

2 Ответов

Рейтинг:
1

pinGOL2305

Я успешно решил эту проблему следующим кодом;

private void Updating()
        {
            try
            {
                string connectionString = @"Data Source= D3ll\SQLEXPRESS; Initial Catalog=GMS; Integrated Security=True";
                SqlConnection Connection = new SqlConnection(connectionString);
                SqlCommand Command = new SqlCommand();
                Command.Connection = Connection;
                Connection.Open();
                Command.CommandText = "UPDATE Courses SET Title = @ttl, Fee = @fe, Description= @dscptn WHERE CourseID = @id";

                Command.Parameters.AddWithValue("@ttl", TitleTextBox.Text);
                Command.Parameters.AddWithValue("@fe", FeeTextBox.Text);
                Command.Parameters.AddWithValue("@dscptn", DescriptionTextBox.Text);
                Command.Parameters.AddWithValue("@id", CourseIDTextBox.Text);
                int NEW = Command.ExecuteNonQuery();
                Connection.Close();

                MessageBox.Show("!! (" + NEW + ") new Course Information has been UPDATED successfully!!");

                if (NEW > 0)
                    ClearText();

            }
            catch (Exception ex)
            {
                MessageBox.Show("Oops!! Something is wrong!!");
            }
        }


Рейтинг:
0

OriginalGriff

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

Второе: мы не знаем-у нас нет доступа к вашим данным, поэтому мы не можем сказать.
Но вы это делаете, и у вас есть инструменты, которые помогут вам решить, в чем проблема.
Начните с установки точки останова на линии:

MessageBox.Show("Oops!! Something is wrong!!");

И сменить линию:
Command.ExecuteNonQuery();
К:
int count = Command.ExecuteNonQuery();
И поставьте точку останова на этой линии:
Connection.Close();

Теперь запустите приложение в отладчике и посмотрите, какой точки останова оно достигнет.
Если он получает в сообщение, то смотрите на ex и это сообщение, InnerException и посмотреть, что именно они говорят.
Если он доберется до соединения.Закройте, а затем посмотрите на то, что находится внутри. count. Это 1? Или это 0? Возвращаемое значение - это количество строк, на которые повлияла команда, так что если это одна строка, то она сработала, и вам нужно искать ее в другом месте. Если он равен нулю, то это, вероятно, означает, что ваше предложение WHERE не соответствовало ни одной строке - так что начните смотреть на значения, которые вы передаете в SQL.

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