The PIT
Röster från ITM-koncernen.

Dataset som inte vill skapa updatecommand

December 18, 2008 23:56 by Stefan Karlsson

 

Själv så arbetar jag numera ständigt med datasets och tableadapters. Fler och fler går över till detta överlägset enkla och lättarbetade sätt att kommunicera med databasen så jag tänkte bara tipsa om en grej som jag lite då och då stöter på. Första gången jag stötte på det så vart jag väldigt konfunderad.

När man skapar en tableadapter så pekar man ju ut en tabell och talar om vilka fält som adaptern ska använda. Wizarden skapar då all nödvändig kod för att göra update, delete, insert och genererar en massa partialklasser som gör att du kan arbeta med tabellen som ett objekt (utan risk för sql-injections).

image

Klickar man på tabelladapterns titel så får man upp egenskaperna för den:

 image

Ovan så ser vi att den skapat update, delete, select och insert-command. Allt är frid och fröjd.

Helt plötsligt så stötte jag på att insert och update-command inte skapades. Lägligt nog hade jag en silent (illa) try/catch runt CustomerTA.update(mycustomers) när jag körde update så det tog även en stund att komma på varför datat inte sparades. När jag väl upptäckte att det smällde i updaten och såg att det berodde på att det inte fanns någon updatecommand att anropa.

Så jag öppnade upp datasetet, körde configure på tabelladaptern och gick igenom wizarden, den avslutades snällt med detta meddelande:

image

Lägg märke till att den påstår att den skapat alla insert, update statements och metoder. Det gör att man tror att allt är frid och fröjd. Men det är bara ett spel för gallerian. Det den inte säger är att den inte klarade av att skapa updatecommand och insertcommand.

Tittar man nu på egenskaperna för tabelladaptern så ser det ut så här:

image

Eftersom den skapar metoderna så kommer man att kunna anropa tabeladapter.update() men tabelladaptern har inget updatecommand kopplat till sig så den kommer att smälla när man kör det.

Och så till slutklämmen, varför blir det då på det här viset?

Jo, tabellen hade ingen primary key. Utan Primary Key så skapar den inte dessa kommandon då den inte kan säkerställa att det är rätt rad man uppdaterar eller raderar. Det räcker inte med att bara sätta identity på kolumnen och tro att allt är bra.

Nu stöter jag inte på detta så ofta då jag har för vana att alltid ha ett id-fält som är primary key men ibland har man nån skräptabell som bara innehåller nån setting eller liknande och tänker inte på att sätta detta.

Nu slipper ni ialla fall stöta på det problemet för nu vet ni. ;)


Tags:
Categories: Programmering | SQL | dataset
Actions: E-mail | Permalink | Comments (0) | Comment RSSRSS comment feed