Member 13055644 Ответов: 1

Как избежать дублирования при вставке обеих строк сразу


привет друзья сначала я объясню состояние после того как я дам вам мою потребность
У меня есть datagridview с флажком я проверяю строки после того, как нажимаю на кнопку "Сохранить", и обычно строки, которые я проверяю, они должны быть вставлены как в другую таблицу, но я нахожу, что только одна строка была вставлена дважды
Вторая проблема заключается в том, что я хочу, чтобы строки, которые я вставил, я больше всего хочу видеть, когда нажимаю на кнопку поиска, потому что они уже назначены в таблице
Вы найдете два интерфейса, которые обрабатывают состояние
Надеюсь, я хорошо описал свое состояние и заранее благодарю вас

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

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace gestion_attachements_decomptes
{
    public partial class ajouter_attachement : Form
    {

        public ajouter_attachement(string num_marche,string libelle_fournisseur)
        {
            InitializeComponent();
            textBox1.Text = num_marche;
            textBox2.Text = libelle_fournisseur;
        }


        private void ajouter_attachement_Load(object sender, EventArgs e)
        {
            //désactiver button enregistrer 
            button1.Enabled = false;

            //ajouter checkbox dans datagrid view 
            DataGridViewCheckBoxColumn chk = new DataGridViewCheckBoxColumn();
            chk.HeaderText = "";
            chk.Name = "CheckBox";
            dataGridView2.Columns.Add(chk);

            dataGridView2.AllowUserToAddRows = false;
            dataGridView2.AllowUserToDeleteRows = false;


        }

        


        private void search_Click(object sender, EventArgs e)
        {
            dataGridView2.Rows.Clear(); 
            Program.cmd.CommandText = "select * from bon_reception_marche where  Date_reception between '" + dateTimePicker1.Value.Date + "' and '" + dateTimePicker2.Value.Date + "' and Id_marche in (select TOP 1 Id_marche from marche where Num_marche = '"+textBox1.Text+"')";
            Program.dr = Program.cmd.ExecuteReader();
            while (Program.dr.Read())
            {
                dataGridView2.Rows.Add(Program.dr[0],Program.dr[2], Program.dr[3], Program.dr[5], Program.dr[6], Program.dr[7], Program.dr[8], Program.dr[9], Program.dr[10], Program.dr[11], Program.dr[12]);
            }
            Program.dr.Close();
            

        }



        private void dataGridView2_CellClick(object sender, DataGridViewCellEventArgs e)
        {
//check the lines in datagridview
            if (e.ColumnIndex == 11/*myColumn*/ && e.RowIndex >= 0 /*myRow*/)
            {
                button1.Enabled = true;
            } 
        }

        

        private void save_Click(object sender, EventArgs e)
        {
            int colIndex = dataGridView2.Columns["CheckBox"].Index;
            try
            {
                var rows = dataGridView2.Rows
                    .Cast<DataGridViewRow>()
                    .Where(row => row.Cells[colIndex].Value != null)
                    .Where(row => (bool)row.Cells[colIndex].Value)
                    .ToList();

                foreach (DataGridViewRow row in rows)
                    insertRowData(row);

                MessageBox.Show("c'est ajouté avec succés");
            }
            catch (FormatException)
            {
                MessageBox.Show("Only input numbers into the table!",
                                "Only Numbers", MessageBoxButtons.OK);
            }

            catch (Exception)
            {
                MessageBox.Show("There was an error while saving!",
                                "Error", MessageBoxButtons.OK);
            }
        }

        private void insertRowData(DataGridViewRow row)
        {
            double montantValue = Convert.ToDouble(row.Cells["Column7"].Value);

            int id_br_value = Convert.ToInt32(row.Cells["Column11"].Value);

            string check;
            if (checkBox1.Checked == true)
            {
                check = "O";
            }
            else
            {
                check = "N";
            }
            Program.cmd.Parameters.Clear();
            Program.cmd.CommandText = "insert into attachement_marche (Id_bon_reception_marche,Id_marche,Num_attachement,Date_debut,Date_fin,Flag_dernier,Montant,User_create,Date_create) values ( " + id_br_value + ",(select TOP 1 Id_marche from marche where Num_marche = '" + textBox1.Text + "'),'" + textBox3.Text + "','" + dateTimePicker1.Value.Date + "','" + dateTimePicker1.Value.Date + "','" + check + "'," + montantValue + ",'" + values.username + "','" + DateTime.Now.Date + "')";
            Program.cmd.ExecuteNonQuery();
        }

        
    }
}

1 Ответов

Рейтинг:
0

Patrice T

Никогда не создавайте sql-запрос путем конкатенации с пользовательскими входными данными, это опасно для вашей базы данных и подвержено ошибкам.
SQL-инъекция-Википедия[^]
SQL-инъекция[^]
-----
Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволяет вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения, это невероятный инструмент обучения.

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Member 13055644

БОЛЬШОЕ СПАСИБО!