04. februar 2005 - 14:22Der er
30 kommentarer og 1 løsning
Lave relation med type stærkt dataset
Hej
Jeg har lavet en type stærkt dataset, det indeholder 2 Data tabeller. Hhv. "bruger" og "login" tabel. Jeg kan sagtens indsætte data i tabellerne, således:
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
hej ihtezaz :o) hvis du arbejder med dine typestærke datasets i vs-designeren, kan du bare oprette en relation mellem tabellerne der - så er den altid til rådighed - og du vil også kunne udnytte det i koden så du f.eks. kan hente alle logins for en given bruger. mvh
det er rart at have det som en dekrementering... det er på den måde tydeligt at der er tale om rækker oprettet i memmory, og der er ingen risiko for at du inkrementerer dig frem til et id som allerede eksisterer i databasen. mvh
Det skulle gerne ske for dig hvis du laver relationen i datasættet - når du indsætter en ny childrow sætter du id udfra det id du har fra parentrow, og efter opdatering mod basen, vil du have basens id'er i datasættet. mvh
Det virker ikke helt, når jeg kalder update, så opdateres kun den ene af tabellerne.
Jeg gennemgår lige, hvad jeg har lavet :
I DB'en har to tomme tabeller "bruger" og "login", de er forbundet ved, at logind har en primærnøgle som bliver overført som fremmede nøgle i "bruger" tabellen. BrugerID er autonumeret i login tabellen.
I min dataset-designer henter jeg disse to tabeller ind og forbinder dem på samme måde, som de er i Db'en. I begge tabeller sætter jeg brugerID som ID felter og giver dem starts værdien 0 med step som -1.
Min DataAdapter er lavet ved at trække login tabellen ind, hvorved den kun skaber bro til login tabellen.
Når jeg så fylder data ind i mine dataTables, og kalder update på dataAdapter'en, får jeg kun fyldt data i min login tabel, hvis jeg derimod bruger en adapter som jeg selv definere i koden, kan den ikke finde ud af hvilken tabel der menes, når update kaldes.
Nu er mine tabeller tomme i Db'en og jeg får følgende fejl:
Cannot insert the value NULL into column 'BrugerID', table 'DotSoft.dbo.BrugerOplys'; column does not allow nulls. INSERT fails. The statement has been terminated. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Data.SqlClient.SqlException: Cannot insert the value NULL into column 'BrugerID', table 'DotSoft.dbo.BrugerOplys'; column does not allow nulls. INSERT fails. The statement has been terminated.
Source Error:
Line 231: Line 232: //da.Fill(brugerDs); Line 233: BrugerOplys.Update(brugerDs); Line 234: Bruger.Update(brugerDs); Line 235:
har du sørget for at dine adaptere sikrer at dit dataset indeholder det opdaterede efter en update ? (hvis du har genereret dine statements vha. vs - er det i praksis et lille flueben du skal hakke af)
ForeignKeyConstraint BrugerBrugerOplys requires the child key values (0) to exist in the parent table. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Data.InvalidConstraintException: ForeignKeyConstraint BrugerBrugerOplys requires the child key values (0) to exist in the parent table.
Source Error:
Line 523: Line 524: public void AddBrugerOplysRow(BrugerOplysRow row) { Line 525: this.Rows.Add(row); Line 526: } Line 527:
nej det er ikke den ... har du fået ide'et til at generere procedurer for dig ?
en typisk vs-procedure for en opdatering kunne se sådan her ud : (nedenstående er lavet ved markering i den checkbox der hedder noget med "refresh dataset" ... mener du kan finde den under advanced properties, hvis du laver din adapter i vs).
SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO
CREATE PROCEDURE dbo.UserUpdate ( @FullName nvarchar(128), @Info1 nvarchar(255), @Info2 nvarchar(255), @Info3 nvarchar(255), @Active bit, @Original_UserId int, @UserId int ) AS SET NOCOUNT OFF; UPDATE [User] SET FullName = @FullName, Info1 = @Info1, Info2 = @Info2, Info3 = @Info3, Active = @Active WHERE (UserId = @Original_UserId); SELECT UserId, FullName, Info1, Info2, Info3, Active FROM [User] WHERE (UserId = @UserId) GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO
læg mærke til at proceduren både opdaterer, og efterfølgende laver en select.
Exception Details: System.Data.InvalidConstraintException: ForeignKeyConstraint BrugerBrugerOplys requires the child key values (0) to exist in the parent table.
Det 0 er, den id felt mine tabeller har i datasettet.
der skal du sørge for at sætte det id du har fra din parent table (det som efter Bruger.Update(brugerDs) så vil være et "rigtigt" dbid - eller som et alternativ så mener jeg der plejer at være et overload på constructoren der tager et parentrow som første parameter.... (og så de andre parametre efterfølgende).
Det var godt du fik det til at rulle :o) god fornøjelse - og held og lykke med dit program. mvh
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.