Avatar billede _et Praktikant
10. oktober 2007 - 16:58 Der er 18 kommentarer og
1 løsning

Problem med at slette Row i database

Jeg har denne kode som fylder en tabel i et listview og sletter de rækker jeg vælger - Men det virker ikke - databasen bliver ikke påvirket.

class db
{
    string conString;
    public DataSet _ds;
    SqlConnection conn;
    SqlDataAdapter adapter;

    public db()
    {
        conString = ("iorden");

        conn = new SqlConnection(conString);
        adapter = new SqlDataAdapter("select * from Log", conn);

        _ds = new DataSet("Test");

        conn.Open();
    }


    public void get()
    {
        adapter.Fill(_ds, "Test");
    }
    public void update()
    {
        adapter.Update (_ds, "Test");
    }
}

"class form"
{
public db _data = new db();

//Fyld listview
private void button1_Click(object sender, EventArgs e)
{
    listView1.Items.Clear();
    _data._ds.Clear();
    _data.get();
    DataTable dt = _data._ds.Tables[0];
    ListViewItem lvi;

    foreach (DataRow dr in dt.Rows)
    {
        lvi = new ListViewItem(dr[0].ToString());
        lvi.SubItems.Add(dr[1].ToString());
        lvi.SubItems.Add(dr[2].ToString());
        listView1.Items.Add(lvi);
    }
}

//Slet valgte
private void button2_Click(object sender, EventArgs e)
{
    foreach (ListViewItem lvi in listView1.Items)
        if (lvi.Selected)
            _data._ds.Tables[0].Rows[lvi.Index].Delete();
    _data._ds.AcceptChanges();
    _data.update();
    _data._ds.Clear();
}
}

Hvad kan der være galt??
mvh Teddy
Avatar billede _et Praktikant
10. oktober 2007 - 16:59 #1
Den fylder listview og kører koden for at slette uden problemer men det viser sig ikke i databasen
Avatar billede nielle Nybegynder
10. oktober 2007 - 18:01 #2
Hvordan har du initialiseret dit LV?
Avatar billede sherlock Nybegynder
10. oktober 2007 - 18:01 #3
Nu bruger jeg normalt ikke DataAdapter, men skal man ikke definere sql for Delete, Update og Insert. Select er defineret gennem constructoren.
Avatar billede _et Praktikant
10. oktober 2007 - 19:15 #4
nielle -> Jeg er ikke sikker på hvad du mener med initaliseret? men LV er bare trukket ind fra toolbox og fyldt via ovenstående click event.

sherlock -> jeg vil give dig ret, men jeg har en bog der gør det uden at definere en delete. Jeg har leget lidt men kan ikke helt gennemskue hvordan den skulle se ud.
Avatar billede nielle Nybegynder
10. oktober 2007 - 20:02 #5
Hvis jeg bare trækker en gridview ind og binder den til indholdet af en tabel får jeg en version hvor hver række i tabellen vises som en stor ikon i gridviewet. Jeg får ikke en række pr række så at sige.
Avatar billede nielle Nybegynder
10. oktober 2007 - 20:05 #6
"Listview" selvfølgelig.

Der skal som minimum være gjort5 noget i stil med:

this.listView1.View = View.Details;
Avatar billede _et Praktikant
10. oktober 2007 - 20:53 #7
Den er sat til detail - Der er intet problem med listview'et. Jeg henter og viser data fint. Det er i linket mellem DataSet og databasen når rettelser i datasettet skal skrives i databasen der er problemer med.
Avatar billede nielle Nybegynder
10. oktober 2007 - 21:43 #8
So sherlock er inde på så kalder din adapter.Update() den indbyggede DELETE kommando i adapteren. Men da du ikke har sat adapter.DeleteCommand til noget, så er der slet ikke nogen DELETE at kalde. Derfor bliver der heller ikke slettet noget.

En hurtig måde at danne alle CRUD kommandoerne på er ved at anvende SqlCommandBuilder klassen - så tag et kig på den.

PS: Du har også et problem i vieweren: prøv at markere noget og slet det, prøv så at gøre dette en gang mere.
Avatar billede _et Praktikant
10. oktober 2007 - 22:26 #9
Takker - Jeg kigger på det. vender tilbage imorgen
Avatar billede nielle Nybegynder
16. oktober 2007 - 08:42 #10
Er du kommet vidre med denne her?
Avatar billede _et Praktikant
19. oktober 2007 - 09:36 #11
Nej. Efter alt hvad jeg kan læse mig til på MSDN så skal dataadapteren selv kunne generer en delete kommando. Det kan jeg på ingen måde få den til, så nu gør jeg det manuelt istedet.
Avatar billede nielle Nybegynder
19. oktober 2007 - 09:47 #12
Hvor har du læst det? For, umiddelbart mener jeg altså ikke at det er korrekt.

Fik du kigget på SqlCommandBuilderen?
Avatar billede _et Praktikant
21. oktober 2007 - 22:20 #13
På MSDN - Der er et eksempel et sted, hvor der slettes en Row uden der defineres en delete. Jeg kan desværre ikke finde det igen :-) Heldigt ikke!

Nå men det virker under alle omstændigheder ikke.

Ja jeg har kigget på klassen og vil bruge den på et tidspunkt, men ikke nu.

Jeg lukker og giver dig point for løsningen.
Avatar billede nielle Nybegynder
22. oktober 2007 - 11:31 #14
Hej, jeg kan godt få det til at fungere med en Builder, men ikke uden:

    class db
    {
        private const string connString = "Data Source=dataexpe-dfocde;Initial Catalog=Eksperten;Integrated Security=SSPI;";
        public DataSet _ds;
        SqlConnection conn;
        SqlDataAdapter adapter;

        public db()
        {
            conn = new SqlConnection(connString);

            adapter = new SqlDataAdapter();
            adapter.SelectCommand = new SqlCommand("SELECT * FROM e800412", conn);
            SqlCommandBuilder builder = new SqlCommandBuilder(adapter);

            conn.Open();

            _ds = new DataSet("Test");
            adapter.Fill(_ds, "Test");

            adapter.InsertCommand = builder.GetInsertCommand();
            adapter.DeleteCommand = builder.GetDeleteCommand();
            adapter.UpdateCommand = builder.GetUpdateCommand();
        }

        public void get()
        {
            adapter.Fill(_ds, "Test");
        }

        public void update()
        {
            adapter.Update(_ds, "Test");
        }
    }

Derudover bestod fejlen primært i at du kaldte AcceptChanges() *før* at du kaldte Update(). Rækkefølgen skal lige byttes om:

        //Slet valgte
        private void button2_Click(object sender, EventArgs e)
        {
            foreach (ListViewItem lvi in listView1.Items)
            {
                if (lvi.Selected)
                {
                    _data._ds.Tables[0].Rows[lvi.Index].Delete();
                    this.listView1.Items.Remove(lvi);
                }
            }
           
            _data.update();
            _data._ds.AcceptChanges();
            _data._ds.Clear();
        }
    }

1) Måden Delete() sletter i et DataSet er ved ar sette RowState for den slettede række til at være lig med DataRowState.Deleted. Rækken bliver faktisk ikke slettet med det samme.
2) Det som DataSet'tes Update() er at slette alle de rækker i databasen som har denne status.
3) AcceptChanges() nulstiller så at sige DataSet'tet - alle rækkerne med RowState == DataRowState.Deleted bliver f.eks. fjernet.

Ved at klade AcceptChanges() før Update() fjernede du effektivt oplysningerne om hvilke rækker der skulle slettes. Derfor blev det heller ikke slettet noget.
Avatar billede nielle Nybegynder
29. oktober 2007 - 18:34 #15
Har du fået kigget på mit eksempel?
Avatar billede nielle Nybegynder
06. november 2007 - 17:22 #16
Hvad med noget respons?
Avatar billede nielle Nybegynder
12. november 2007 - 18:50 #17
Svar
Avatar billede _et Praktikant
17. december 2007 - 14:18 #18
Ja jeg har fået det til at virke.

Sorry jeg er længe om at svare, men det er til et semester projekt, så jeg ryger vidre i projektet med det samme det virker og glemte desværre dig.

Men MANGE tak for hjælpen og beklager det tog tid med svaret
Avatar billede nielle Nybegynder
17. december 2007 - 18:06 #19
Tak for point :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester