10. oktober 2007 - 19:26Der er
6 kommentarer og 1 løsning
GridView og DetailsView - Update virker ikke ved Null i DB
Jeg har en SQL database med 5 tabeller. 4 tabeller er blevet joinet til den 5. med deres ID. Vha. en skema putter jeg data i 5. database og dette kører fint. Bortset fra ID har alle felter sat til 'Allow Null'.
På en anden side har jeg en GridView, der viser oversigt på rækkerne. Også her har jeg en DetailsView, der skal vise og opdatere den række, som man har Selected på GridViewet. Det gør det også (opdaterer fint) bortset fra, at hvis jeg sletter indholdet af et felt (3 felter skulle gerne opdateres), så feltet i DetailsView vises tømt, og det er også OK, men når jeg igen udfylder et tømt felt med data, accepteres de ikke og der står stadigvæk Null i databasen. Noget forslag?
Her er UpdateCommand, som VS genererer selv:
UpdateCommand="UPDATE [Resultat] SET [Initialer] = @Initialer, [Oplysning_sendt] = @Oplysning_sendt, [BesvarelseID] = @BesvarelseID WHERE [ResultatID] = @original_ResultatID AND [Initialer] = @original_Initialer AND [Oplysning_sendt] = @original_Oplysning_sendt AND [BesvarelseID] = @original_BesvarelseID">
Det går galt i WHERE betingelsen. Hvis der er et null i et af felterne i forvejen, så fejler din Update, da udsagnet hvad_som_helst=original_værdi(og denne er Null) altid er falskt.
Så har jeg fjernet andre hvad_som_helst=original_værdi bortset fra ResultatID=@original_ResultatID og det virker fint. Hvis dette har været problemet, så er det nu løst. Send venligst et svar:-)
Både og. Du har tydeligvis klikket på Optimistic Concurrency da du lavede din DataSource. VS er ikke smart nok til at lave sql'en rigtigt, når du har felter som tillader NULLS.
Meningen var at hindre at data blev gemt, hvis en anden bruger modificerede data i den tid der var gået mellem læsning af data i din session, og gemning af dem. Det gør den ved at kigge på om alle felterne i en række stadig har den samme værdi [Værdi] inden gemning, som de havde da felterne blev læst (@original_Værdi). Men hvis du tillader NULLs så skal man også teste på om der har været et NULL : (værdi=@original_Værdi) OR (værdi IS NULL AND @original_Værdi IS NULL)
Hvis du ønsker have Optimistic Concurrency, så skal du ikke bare smide de ting ud men sørge for at sql'en er rigtig. Hvis du ike ønsker Optimistic Concurrency, så er det jo nemmest ikke at afklikke det felt, når du laver data sourcen.
det ser rigtigt ud - og nu burde det virke også med NULL.
Synes godt om
Ny brugerNybegynder
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.