[c#] table adapter.update() doet niets

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Mythix
  • Registratie: Oktober 2004
  • Laatst online: 13:41

Mythix

www.ctrl-f5.net

Topicstarter
Ik ben net overgestapt op .NET en ben begonnen aan een klein projectje om in te prutsen. Nu zit ik vast bij het opslaan van data in mijn locale database file.

na 7uren opzoeken en uitproberen denk ik alle logische + onlogische dingen geprobeerd te hebben, dit is de code waarbij ik me uiteindelijk heb neergelegd:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//tableadapter
taMovies ta = new taMovies();
//datatable
dsMedia.tblMoviesDataTable dt = new dsMedia.tblMoviesDataTable();

ta.Fill(dt);

//new row
dsMedia.tblMoviesRow dr = dt.NewtblMoviesRow();
dr.title = "A clockwork Orange";
dr.duration = 126;

//add it to the datatable
dt.AddtblMoviesRow(dr);

//save the datatable
ta.Update(dt);
foreach (dsMedia.tblMoviesRow r in dt)
{
    lblResult.Text += r.title;
}

//dit doet ook niets
ta.Insert(1, "test", 154);


in de tabel zelf heb ik 1 rij gestoken, met de film.title "kill bill", maar na ta.update() komt er in lblResult gewoon 2 x na elkaar "Kill billA clockwork orange" te staan, maar in de db wordt het niet opgeslagen.
ook ta.Insert() lijkt niets op te slaan in de db. Wat volgens MSDN toch wel zou moeten gebeuren.

Ik heb me echt gek gezocht en verschillende dingen geprobeerd, maar dit is het beste dat ik er uit kan krijgen... iemand een idee wat er fout gaat?

Whenever you find yourself on the side of the majority, it is time to pause and reflect


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 12:52
Je DataAdapter moet natuurlijk wel een UpdateCommand / InsertCommand / DeleteCommand bevatten, anders kan hij nooit de juiste actie gaan uitvoeren natuurlijk.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 11:39

Haan

dotnetter

Met iets als onderstaande implementeren moet je een eind kunnen komen: (dit voorbeeld gaat uit van een OleDB verbinding, maar moet ook voor andere verbindingen werken)

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
OleDbConnection connection = new OleDbConnection(); //aanvullen met credentials e.d.
OleDbDataAdapter adapter = CreateDataAdapter("SELECT * FROM " + tableName, connection);
DataSet dataSet = new DataSet();                
adapter.Fill(dataSet, tableName);

public OleDbDataAdapter CreateDataAdapter(string selectCommand, OleDbConnection connection)
{
     OleDbDataAdapter adapter = new OleDbDataAdapter(selectCommand, connection);
     adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
     OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);
     adapter.InsertCommand = builder.GetInsertCommand();
     adapter.UpdateCommand = builder.GetUpdateCommand();

     return adapter;
}

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Mythix
  • Registratie: Oktober 2004
  • Laatst online: 13:41

Mythix

www.ctrl-f5.net

Topicstarter
De query voor toevoegen bestaat, en update() is een methode van de tableadapter voor zover ik het begrepen heb, of moet deze overschreven worden?

Whenever you find yourself on the side of the majority, it is time to pause and reflect


Acties:
  • 0 Henk 'm!

Verwijderd

Mythix schreef op donderdag 06 november 2008 @ 23:57:
De query voor toevoegen bestaat, en update() is een methode van de tableadapter voor zover ik het begrepen heb, of moet deze overschreven worden?
Probeer eens stap voor stap te debuggen. Zet een breakpoint door in de kantlijn te klikken bij een bepaalde regel code en stap er met F11 doorheen. Bekijk bij elke stap of deze correct is uitgevoerd: Is de row aan de datatable toegevoegd, wordt de entry opgeslagen in de database?

Acties:
  • 0 Henk 'm!

  • Mythix
  • Registratie: Oktober 2004
  • Laatst online: 13:41

Mythix

www.ctrl-f5.net

Topicstarter
Alles werkt behalve het opslaan in de database zelf.
Ik heb het even over een andere boeg gegooid, en het een en ander opgezocht over ADO, nu ben ik aan volgende code uitgekomen:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
IDbConnection conn = new SqlCeConnection(MediaCollector.Properties.Settings.Default.dbMediaConnStr);

IDbCommand cmd = new SqlCeCommand(@"INSERT INTO tblMovies (title, duration) VALUES (@title, @duration)");
cmd.Connection = conn;

cmd.Parameters.Add(new SqlCeParameter( "@title", "test"));
cmd.Parameters.Add(new SqlCeParameter("@duration", 156));

conn.Open();
int retval = cmd.ExecuteNonQuery();
lblResult.Text = retval.ToString();
conn.Close();


retval = 1, als ik het goed heb is er dus 1 rij aangepast, in dit geval teogevoegd. als ik dan naar de db ga kijken is er geen rij toegevoegd... 8)7

Whenever you find yourself on the side of the majority, it is time to pause and reflect


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 12:52
Dan denk ik dat je in de verkeerde DB kijkt. :P

(Of je gebruikt wellicht een DB file die je aan je project zelf hebt toegevoegd; bij het debuggen zal VS.NET waarschijnlijk een copie maken van die file, deze gebruiken, en als je je programma afsluit die file weer verwijderen ofzo).

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Mythix
  • Registratie: Oktober 2004
  • Laatst online: 13:41

Mythix

www.ctrl-f5.net

Topicstarter
Ja ik heb idd een local db file toegevoegd... moet ik dit dan oplossen door een db aan te maken in de SQLce Management studio en deze aan te spreken of iets dergelijks?

Prachtig, ik heb een db toegevoegd die op de SQLsrvExpress draait en nu werkt het perfect met volgende code, first try!

C#:
1
2
3
4
5
6
7
8
9
10
11
12
dbMediaDataSet.tblMoviesDataTable dt = new dbMediaDataSet.tblMoviesDataTable();
dbMediaDataSetTableAdapters.tblMoviesTableAdapter ta = new MediaCollector.dbMediaDataSetTableAdapters.tblMoviesTableAdapter();

ta.Fill(dt);

dbMediaDataSet.tblMoviesRow row = dt.NewtblMoviesRow();
row.title = "test";
row.duration = 146;

dt.AddtblMoviesRow(row);

ta.Update(dt);

[ Voor 60% gewijzigd door Mythix op 07-11-2008 11:40 ]

Whenever you find yourself on the side of the majority, it is time to pause and reflect


Acties:
  • 0 Henk 'm!

Verwijderd

Mythix schreef op vrijdag 07 november 2008 @ 11:09:
Ja ik heb idd een local db file toegevoegd... moet ik dit dan oplossen door een db aan te maken in de SQLce Management studio en deze aan te spreken of iets dergelijks?

Prachtig, ik heb een db toegevoegd die op de SQLsrvExpress draait en nu werkt het perfect met volgende code, first try!

C#:
1
2
3
4
5
6
7
8
9
10
11
12
dbMediaDataSet.tblMoviesDataTable dt = new dbMediaDataSet.tblMoviesDataTable();
dbMediaDataSetTableAdapters.tblMoviesTableAdapter ta = new MediaCollector.dbMediaDataSetTableAdapters.tblMoviesTableAdapter();

ta.Fill(dt);

dbMediaDataSet.tblMoviesRow row = dt.NewtblMoviesRow();
row.title = "test";
row.duration = 146;

dt.AddtblMoviesRow(row);

ta.Update(dt);
Als je in Visual Studio een programma runt, dan compileert Visual Studio de applicatie naar de <parent>/bin/debug directory and maakt het ook een kopie van bijvoorbeeld de local database (Sql Server Compact Edition als ik het goed heb). Je code voert dan acties uit op de database in de /bin/debug directory. De server explorer in Visual Studio manipuleert echter de database in de project directory <parent>. Je moet zorgen dat je de goede db target met je connection string.

edit: Je moet je wel realiseren dat een local database (Sql Server Compact Edition) heel wat anders is dan Sql Server (Express). Zoek de verschillen maar op.

[ Voor 5% gewijzigd door Verwijderd op 07-11-2008 17:57 ]

Pagina: 1