Рейтинг:
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 не является проблемой, так почему бы не позволить ему быть таким, как есть.