Member 9983063 Ответов: 2

Я хочу знать, в чем разница между i++ и ++i в цикле


Привет, ребята, я хочу знать разницу между i++ и ++i в цикле bcz я использую i++ в своем проекте, и это добавляет дополнительное значение в базу данных, поэтому мне нужно знать разницу между ними.

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

for (int j = 0; j < dataGridView1.Rows.Count; j++)
                    {
                        connection.Open();
                        OleDbCommand command = new OleDbCommand();
                        command.Connection = connection;
                        command.CommandText = "insert into Total ([Column1],[Column2],[Column3],[Date],[Receipt No],[Delivery Person],[Report],[Flavours],[Return])values('" + dataGridView1.Rows[j].Cells[0].Value.ToString() + "','" + dataGridView1.Rows[j].Cells[1].Value.ToString() + "','" + dataGridView1.Rows[j].Cells[2].Value.ToString() + "','" + dataGridView1.Rows[j].Cells[4].Value.ToString() + "','" + label2.Text + "','" + "---" + "'," + dataGridView1.Rows[j].Cells[0].Value.ToString() + ",'" + dataGridView1.Rows[j].Cells[3].Value.ToString() + "','" + textBox66.Text + "');";
                        command.ExecuteNonQuery();
                        connection.Close();
                    }

                    MessageBox.Show("Inserted Sucessfully", "Database", MessageBoxButtons.OK, MessageBoxIcon.Information);

Richard Deeming

У тебя проблемы посерьезнее!

Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов / OWASP[^]

Member 9983063

Сэр, пожалуйста, объясните мне, что я делаю неправильно в своем коде, пожалуйста, скажите мне, что мне нужно использовать i++ или ++i

2 Ответов

Рейтинг:
1

Richard Deeming

У вас, вероятно, есть AllowUserToAddRows[^] свойство установлено в true, и вы вставляете значения из пустой строки "вставить". Регистрация IsNewRow[^] свойство перед попыткой вставить значения.

Вы также захотите исправить SQL-инъекция[^] уязвимость в вашем коде.

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

const string Query = @"INSERT INTO Total ([Column1], [Column2], [Column3], [Date], [Receipt No], [Delivery Person], [Report], [Flavours], [Return])
VALUES (@Column1, @Column2, @Column3, @Date, @ReceiptNo, @DeliveryPerson, @Report, @Flavours, @Return)";

using (var connection = new OleDbConnection("..."))
using (var command = new OleDbCommand(connection, Query))
{
    connection.Open();
    
    for (int j = 0; j < dataGridView1.Rows.Count; j++)
    {
        var row = dataGridView1.Rows[j];
        if (row.IsNewRow) continue;
        
        command.Parameters.Clear();
        command.Parameters.AddWithValue("@Column1", row.Cells[0].Value);
        command.Parameters.AddWithValue("@Column2", row.Cells[1].Value)
        command.Parameters.AddWithValue("@Column3", row.Cells[2].Value);
        command.Parameters.AddWithValue("@Date", row.Cells[4].Value);
        command.Parameters.AddWithValue("@ReceiptNo", label2.Text);
        command.Parameters.AddWithValue("@DeliveryPerson", "---");
        command.Parameters.AddWithValue("@Report", row.Cells[0].Value);
        command.Parameters.AddWithValue("@Flavours", row.Cells[3].Value);
        command.Parameters.AddWithValue("@Return", textBox66.Text);
        
        command.ExecuteNonQuery();
    }
}


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


Member 9983063

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

Richard Deeming

Возможно. Как я уже сказал, Я подозреваю, что вы вставляете дополнительную строку для пустой строки "вставить" в нижней части сетки. Проверка IsNewRow собственность должна решить эту проблему.

Member 9983063

for (int j = 0; j < dataGridView1.Rows.Count; j++)
{
ВАР подряд = dataGridView1.Строк[Дж];
если (строка.IsNewRow)
{
соединение.Открыть();
Команда oledbcommand объект = новый объект oledbcommand();
команда.Соединение = соединение;
команда.Свойства commandtext = "вставить в общую ([Столбец1],[Столбец2],[Столбец3],[дата],[квитанция нет],[курьер],[отчет],[кухни],[вернуть])значения('" + dataGridView1.Строк[Дж].Ячейки[0].Значение.ToString ()+"', '" + dataGridView1.Rows[j].Клетки[1].Значение.ToString ()+"', '" + dataGridView1.Rows[j].Клеток[2].Значение.ToString ()+"', '" + dataGridView1.Rows[j].Клеток[4].Значение.Метод toString() + "','" + метка2.Текст + "','" + "---" + "'," + dataGridView1.Строк[Дж].Ячейки[0].Значение.ToString ()+", '" + dataGridView1.Rows[j].Клеток[3].Значение.Метод toString() + "','" + textBox66.Текст + "');";
команда.Метод executenonquery();
соединение.Закрывать();
}
ещё
{
Ящик для сообщений.Шоу ("abc");
}
сэр, это правда?

Richard Deeming

Нет, это не так.

Помимо того, что вы вставляете только строку для пустой строки "вставить", а не исключаете эту строку, вы также игнорируете все другие предложения. Ваш код таков ВСЕ ЕЩЕ уязвим для SQL-инъекций. Вы ВСЕ ЕЩЕ Открытие и закрытие соединения для каждой строки.

Я уже дал вам правильный код в своем ответе. Использовать это.

Member 9983063

хммм thnx снова сэр, теперь я исправил свой запрос, я просто хочу показать вам, пожалуйста, скажите мне, что теперь все в порядке

Команда oledbcommand объект = новый объект oledbcommand();
команда.Соединение = соединение;
команда.Свойства commandtext = @"вставить в общую ([Столбец1], [Столбец2], [Столбец3], [дата], [квитанция нет], [курьер], [отчет], [кухни], [вернуться])
Значения (@Столбец1, @Столбец2, @Столбец3, @дата, @ReceiptNo, @DeliveryPerson, @отчет, @ароматизаторы, @вернуться)";
соединение.Открыть();
for (int j = 0; j < dataGridView1.Rows.Count; j++)
{
ВАР подряд = dataGridView1.Строк[Дж];
если (строка.IsNewRow) продолжить;

команда.Параметры.Четкий();
команда.Параметры.AddWithValue ("@Column1", строка.Ячейки[0]. Значение);
команда.Параметры.AddWithValue ("@Column2", строка.Ячейки[1]. Значение);
команда.Параметры.AddWithValue ("@Column3", строка.Ячейки[2]. Значение);
команда.Параметры.AddWithValue ("@Date", строка.Ячейки[4]. Значение);
команда.Параметры.AddWithValue ("@ReceiptNo", label2. Text);
команда.Параметры.AddWithValue ("@DeliveryPerson", "---");
команда.Параметры.AddWithValue ("@Report", строка.Ячейки[0]. Значение);
команда.Параметры.AddWithValue ("@Flavours", строка.Ячейки[3]. Значение);
команда.Параметры.AddWithValue ("@Return", textBox66. Text);

команда.Метод executenonquery();
} соединение.Закрывать();
Ящик для сообщений.Show ("Вставлено Успешно", "База Данных", MessageBoxButtons.Хорошо, MessageBoxIcon.Информация);

Richard Deeming

Да, так-то лучше. Но вы должны завернуть OleDbCommand в using блок. И вы действительно должны создавать OleDbConnection когда это необходимо, и завернуть это в using блокируйте, а не храните его в поле.

Wendelius

Хороший пример-5.

Рейтинг:
0

Wendelius

Разница заключается в порядке операций:


  • i++, возвращает значение i, а затем увеличивает его
  • ++i, сначала увеличивается, а затем возвращает значение i


Однако, как уже указывалось, вы должны исправить запрос для использования Класса Oledbparameter (Системы.Данных.Для oledb)[^ В настоящее время наиболее вероятным источником ошибок является конкатенация значений непосредственно в инструкцию SQL, которая позволяет выполнять SQL-инъекции, создает проблемы преобразования и т. д.

После этого следующие шаги должны быть:
- утилизировать оператор using (Справочник по c# )[^] чтобы правильно распорядиться предметами
- Сначала откройте соединение, выполните все операции, а затем закройте соединение. В настоящее время вы делаете наоборот
- Используйте транзакции для обеспечения того, чтобы все прошло успешно или было откатано назад


Member 9983063

Сэр, пожалуйста, объясните мне, что я делаю неправильно в своем коде, пожалуйста, скажите мне, что мне нужно использовать i++ или ++i

Wendelius

Взгляните на пример, написанный @RichardDeeming. Это хороший пример того, как вы должны писать код. Насколько я вижу, использование i++ или ++i не является проблемой, так почему бы не позволить ему быть таким, как есть.