Avatar billede thomaxz Nybegynder
30. januar 2008 - 10:19 Der er 6 kommentarer og
1 løsning

Gemme ændrring i datagridview i forbindelse med sqllite

Jeg har en form, og på den form er der et dattagridview, jeg har hentet data fra sqllite, og det virke fint, men hvordan gememr jeg de ændre bruger ofrtager sig?

min kode

  Sql.sqlstr = "SELECT * FROM " + tablename;
           

            ds = new DataSet();
            da = new SQLiteDataAdapter();           

            con.Open();
            da.SelectCommand=new SQLiteCommand(Sql.sqlstr, con);
            da.Fill(ds, tablename);


            this.dataGridView1.DataSource = ds.Tables[0];

            con.Clone();
Avatar billede powerpunk Nybegynder
30. januar 2008 - 13:16 #1
DataSet klassen har en GetChanges() metode som giver dig et DataSet med de ændrede rækker siden load eller sidste kald til DataSet.AcceptChanges().

  DataSet src = this.dataGridView1.DataSource as DataTable;
 
  if (src != null)
  {
    DataTable changes = src.GetChanges();
    if (changes != null)
    {
      Console.WriteLine(changes.Rows.Count + " rows with changes");

      foreach (DataRow r in changes.Rows)
      {
        Console.WriteLine(r[0] + ", " + r[1]);
      }
    }
  }
Avatar billede powerpunk Nybegynder
30. januar 2008 - 13:20 #2
(med DataSet mente jeg naturligvis DataTable :-P )

Og så vil jeg tro du mener
  con.Close
i stedet for
  con.Clone

Det burde nok også sættes i en

  try
  {
    con.Open();
    da.SelectCommand=new SQLiteCommand(Sql.sqlstr, con);
    da.Fill(ds, tablename);

    this.dataGridView1.DataSource = ds.Tables[0];
  }
  finally
  {
    con.Close();
  }

så du var sikker på at få smidt forbindelsen...
Avatar billede powerpunk Nybegynder
30. januar 2008 - 13:25 #3
Du burde også kunne lave en

da.Update(this.dataGridView1.DataSource as DataTable)

via din SQLiteDataAdapter
Avatar billede thomaxz Nybegynder
31. januar 2008 - 08:32 #4
Kan ikke rigitig får det ti lat funger

Når jeg bruger

da.Update(this.dataGridView1.DataSource as DataTable);

får jeg flg. fejl "Update requires a valid InsertCommand when passed DataRow collection with new rows."

og når jeg prøver at bruge

  DataTable changes = ds.GetChanges();
            if (changes != null)
            {
                foreach (DataRow r in changes.Rows)
                {
                    MessageBox.Show(r[0] + ", " + r[1]);
                }
            }

får jeg flg. fejl

Cannot implicitly convert type 'System.Data.DataSet' to 'System.Data.DataTable'   
på flg. linie

DataTable changes = ds.GetChanges();
Avatar billede powerpunk Nybegynder
31. januar 2008 - 09:06 #5
åh ja... det havde jeg da glemt alt om...
Din dataAdapter skal have genereret nogle InsertCommand, UpdateCommand og DeleteCommands som den kan bruge når den opdaterer

Jeg vil tro du kan gøre noget i denne retning:

  // CommandBuilder baseret på DataAdapter'en.
  // Kræver nok at 'da' som minimum har en gyldig SelectCommand.
  SQLiteCommandBuilder cb = new SQLiteCommandBuilder(da);
  cb.GetInsertCommand();
  cb.GetUpdateCommand();
  cb.GetDeleteCommand();

  da.Update(this.dataGridView1.DataSource as DataTable);

Den anden fejl får du fordi du kalder GetChanges på et DataSet og forventer et DataTable. (Undskyld forvirringen - jeg kan se at jeg selv har klumret lidt i det i den første kode jeg postede...)

DataSet.GetChanges returnerer et DataSet, DataTable.GetChanges returnerer et DataTable.
Avatar billede thomaxz Nybegynder
31. januar 2008 - 09:34 #6
Det hjalp tak, læg et svar hvis du ivl have points.
Avatar billede powerpunk Nybegynder
31. januar 2008 - 09:51 #7
svar!
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