Problem z Update

0

Witam serdecznie

Na początku pragnę zaznaczyć, że jestem początkującym.

Napisałem prostą aplikację, która łączy się ze wcześniej utworzoną bazą danych. Do wyświetlania wyników oraz łączenia się baza użyłem obiektu DataGrifView. Program umożliwia dodawanie nowych rekordów. Problem pojawia się w momencie usuwania wierszy z bazy danych. Do tego celu utworzyłem przycisk btnUsun:

private void btnUsun_Click(object sender, EventArgs e)
        {
            foreach(DataGridViewRow dgvw in dataGridView1.SelectedRows)   
            {

               dataGridView1.Rows.Remove(dgvw);
              
               //this.rachunkiTableAdapter.Update(this.naszeWydatkiDataSet1.Rachunki);
            }
      
        }

Problem polega na tym, że wiersz(e) usuwane są tylko z kolekcji (widoku). Program nie aktualizuje bieżącego wyniku.
Po ponownym skompilowaniu, usunięte wcześniej wiersze, znowu są widoczne (nie zostają usunięte z bazy danych).
Na sieci znalazłem kilka rozwiązań, sugerujących użycie metody Update, jednakże przy próbie usunięcia wiersza kompilator zwraca błąd w postaci: Update requires a valid DeleteCommand when passed DataRow collection with deleted rows.

Poniżej zamieszczam listing programu:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Data.Sql;
using System.Text;
using System.Windows.Forms;

namespace Wydatki
{
    public struct Kolumny
    {
        private int nr_rachunku;
        private string miesiac;
        private string kto_kupil;
        private string gdzie_kupiono;
        private int suma;

        public int _nr_rachunku
        {
            get
            {
                return nr_rachunku;
            }
        
            set
            {
                nr_rachunku = value;
            }
        }

        public string _miesiac
        {
            get
            {
                return miesiac;
            }

            set
            {
                miesiac = value;
            }
        }

        public string _kto_kupil
        {
            get
            {
                return kto_kupil;
            }

            set
            {
                kto_kupil = value;
            }
        }

        public string _gdzie_kupiono
        {
            get
            {
                return gdzie_kupiono;
            }

            set
            {
                gdzie_kupiono = value;
            }
        }

        public int _suma
        {
            get
            {
                return suma;
            }

            set
            {
                suma = value;
            }
        }
       
    }

    public partial class MainWindow : Form
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
           loadData();
        } 
         
         void loadData()
         {
            this.rachunkiTableAdapter.Fill(this.naszeWydatkiDataSet1.Rachunki);
         }   

        private void btnWyjscie_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void btnDodaj_Click(object sender, EventArgs e)
        {
            Kolumny kolumna = new Kolumny();
         

            kolumna._nr_rachunku = Convert.ToInt32(tbNrRachunku.Text);
            kolumna._miesiac = tbMiesiac.Text;
            kolumna._kto_kupil = tbKtoKupil.Text;
            kolumna._gdzie_kupiono = tbGdzieKupiono.Text;
            kolumna._suma = Convert.ToInt32(tbSumaZL.Text);

            
            this.rachunkiTableAdapter.Insert(kolumna._nr_rachunku, kolumna._miesiac, kolumna._kto_kupil, kolumna._gdzie_kupiono, kolumna._suma);
            this.rachunkiTableAdapter.Fill(this.naszeWydatkiDataSet1.Rachunki);
            //dataGridView1.DataSource = naszeWydatkiDataSet1;
        }

        private void btnUsun_Click(object sender, EventArgs e)
        {
            foreach(DataGridViewRow dgvw in dataGridView1.SelectedRows)   
            {

               dataGridView1.Rows.Remove(dgvw);
              
               this.rachunkiTableAdapter.Update(this.naszeWydatkiDataSet1.Rachunki);
            }
      
        }

        private void btnZapisz_Click(object sender, EventArgs e)
        {
        
            //dataGridView1.DataSource = naszeWydatkiDataSet1;
            rachunkiTableAdapter.Update(naszeWydatkiDataSet1);
            /*DataGridView dgvw = new DataGridView();
             BindingSource bSource = new BindingSource();
              bSource.DataSource = rachunkiTableAdapter;
              dgvw.DataSource = bSource;
            this.rachunkiTableAdapter.Update(naszeWydatkiDataSet1.Rachunki);*/
            //this.rachunkiTableAdapter.Fill(this.naszeWydatkiDataSet1.Rachunki);               
        }

        private void rachunkiBindingSource_CurrentChanged(object sender, EventArgs e)
        {

        }

       
    }
}

PS. Proszę o wyrozumiałość, to na razie szkielet programu, daleko odbiegający od zasad programistycznych :)

0

Czy w tym: this.naszeWydatkiDataSet masz zdefiniowane 4 Commandy (SELECT, DELETE, INSERT, UPDATE), czy też tylko 1 (SELECT)?

0

witam

mam zdefiniowane tylko SELECT

SELECT Numer_rachunku, Miesiąc, Kto_płacił, Gdzie_płacono, Suma_ZŁ FROM dbo.Rachunki

Chyba wiem o co Ci chodzi. Pewnie trzeba będzie zdefiniować dodatkowo UPDATE, DELETE itp??

Jeśli się mylę, popraw mnie

0

Tak - trzeba zdefiniować. Czasem VS robi to sam - gdy jest jakieś w miarę proste zapytanie i gdy jest kolumna klucza. U ciebie chyba tego drugiego brakuje. Aha i wywal PLiterki z obiektów, jeśli nie chcesz mieć problemów...

1

<poza_tematem>

        public int _nr_rachunku
        {
            get
            {
                return nr_rachunku;
            }
 
            set
            {
                nr_rachunku = value;
            }
        }

<=>

public int NrRachunku
{ get; set; }

</poza_tematem>

1 użytkowników online, w tym zalogowanych: 0, gości: 1