Avatar billede ihtezaz Praktikant
04. februar 2005 - 14:22 Der 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: 

dsBruger.BrugerRow dr = brugerDs.Bruger.NewBrugerRow();
dr.Navn = txtNavn.Text;
dr.Adresse = txtAdr.Text;
dr.Postnr = txtPostnr.Text;

osv.
osv.
brugerDs.Bruger.AddBrugerRow(dr);
daBruger.Update(brugerDs,"Bruger");

det samme gøre jeg med min login tabel.

Problemmet består nu i, at jeg skal relatere disse to tabeller ved at føre primærnøglen "brugerID" fra "Bruger" til "Logind" tabellen.

Er det meningen, at jeg i min dataset skal relatere disse to tabeller og derefter kalde update ?

Hvordan gøre jeg dette ?

på forhånd tak.
Avatar billede ihtezaz Praktikant
04. februar 2005 - 14:32 #1
Det skal lige siges, at "brugerID" i tabellen "Bruger" er sat som autonummering i Sql server DB'en.
Avatar billede snepnet Nybegynder
04. februar 2005 - 14:32 #2
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
Avatar billede snepnet Nybegynder
04. februar 2005 - 14:34 #3
du bør sætte også sætte id-kolonner på tabellerne i dit dataset så de starter på 0, og dekrementere med 1.
mvh
Avatar billede ihtezaz Praktikant
04. februar 2005 - 14:41 #4
Hey snepnet

dvs. sætte Autoincrement property til -1 ?
Hvorfor dekrementer ?
Avatar billede snepnet Nybegynder
04. februar 2005 - 14:43 #5
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
Avatar billede ihtezaz Praktikant
04. februar 2005 - 14:50 #6
mm.. ok, er ikke helt med på det. Jeg vil dog kun have "brugerID" som ID i "Bruger" tabellen, som skal føres til "Login" tabellen for bind dem.
Avatar billede snepnet Nybegynder
04. februar 2005 - 14:53 #7
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
Avatar billede ihtezaz Praktikant
04. februar 2005 - 14:57 #8
Ok, men skal jeg så lave en DataAdapter i kode, for den skal have både tilsluttning til "Bruger" tabellen og "Logind" tabellen ?
Avatar billede snepnet Nybegynder
04. februar 2005 - 15:08 #9
prøv at se om det ikke holder med det du har i forvejen.
mvh
Avatar billede ihtezaz Praktikant
05. februar 2005 - 17:10 #10
Hej igen snepnet.

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.

Håber det giver lidt mening
Avatar billede snepnet Nybegynder
05. februar 2005 - 17:21 #11
halløjsa :o)

du skal kalde opdate på begge din adaptere, hvis du vil have opdateret begge tabeller.

mvh
Avatar billede ihtezaz Praktikant
05. februar 2005 - 17:24 #12
nå ok selfølgelig, troede bare at man kunne gøre det en adapter. Prøver lige og vender tilbage.
Avatar billede snepnet Nybegynder
05. februar 2005 - 17:26 #13
oki :o)
Avatar billede ihtezaz Praktikant
05. februar 2005 - 17:34 #14
Hej igen,
Når jeg prøver med to forskellige dataAdapter, får jeg følgende fejl: BrugerID is readonly.
Avatar billede snepnet Nybegynder
05. februar 2005 - 17:53 #15
i hvilken forbindelse får du den fejl ?
(smid gerne et par kodelinier)

kalder du update på adapteren der gemmer tabellen med primærnøglen først ?

mvh
Avatar billede ihtezaz Praktikant
05. februar 2005 - 17:57 #16
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:
Avatar billede snepnet Nybegynder
05. februar 2005 - 18:02 #17
hvordan tilføjer du childrows i din kode ?

har du ikke noget i denne stil (sådan lidt pseudo-kodeagtigt) :

someNewChildRow = dataSet.Child.AddChildRow(dataSet.Parent[someIndex], <parametre>);

mvh
Avatar billede snepnet Nybegynder
05. februar 2005 - 18:03 #18
ovenstående ville så give dig en update-metode et sted på formen :

parentAdapter.Update(dataSet);
childAdapter.Update(dataSet);

mvh
Avatar billede ihtezaz Praktikant
05. februar 2005 - 18:03 #19
Koden, hvor jeg indsætter rækker i dataset:

    BrugerBrugerOplysDS.BrugerRow dr1 = brugerDs.Bruger.NewBrugerRow();
           
            dr1.Mail = txtMail.Text;
            dr1.Kode = txtKode.Text;

            brugerDs.Bruger.AddBrugerRow(dr1);



            BrugerBrugerOplysDS.BrugerOplysRow dr = brugerDs.BrugerOplys.NewBrugerOplysRow();
            dr.Navn = txtNavn.Text;
            dr.Adresse = txtAdr.Text;
            dr.Postnr = Convert.ToInt32(txtPostnr.Text);
            dr.By = txtBy.Text;

        brugerDs.BrugerOplys.AddBrugerOplysRow(dr);

           
        Bruger.Update(brugerDs);
        BrugerOplys.Update(brugerDs);
Avatar billede snepnet Nybegynder
05. februar 2005 - 18:03 #20
lolz - post i samme sekund :o)
Avatar billede snepnet Nybegynder
05. februar 2005 - 18:05 #21
Kan du prøve nedenstående en gang :

    BrugerBrugerOplysDS.BrugerRow dr1 = brugerDs.Bruger.NewBrugerRow();
           
            dr1.Mail = txtMail.Text;
            dr1.Kode = txtKode.Text;

            brugerDs.Bruger.AddBrugerRow(dr1);
           
            Bruger.Update(brugerDs);


            BrugerBrugerOplysDS.BrugerOplysRow dr = brugerDs.BrugerOplys.NewBrugerOplysRow();
            dr.Navn = txtNavn.Text;
            dr.Adresse = txtAdr.Text;
            dr.Postnr = Convert.ToInt32(txtPostnr.Text);
            dr.By = txtBy.Text;

        brugerDs.BrugerOplys.AddBrugerOplysRow(dr);

           
        BrugerOplys.Update(brugerDs);
Avatar billede ihtezaz Praktikant
05. februar 2005 - 18:08 #22
ok prøver lige..he he..i samme sekund, det god timing.
Avatar billede snepnet Nybegynder
05. februar 2005 - 18:09 #23
hov ... lige en ting :

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)

mvh
Avatar billede snepnet Nybegynder
05. februar 2005 - 18:10 #24
(det er det der kan sikre dig at du har de rigtige database-id's i tabellen i datasættet efter update)
Avatar billede ihtezaz Praktikant
05. februar 2005 - 18:15 #25
Nu får jeg følgende fejl :

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:
Avatar billede ihtezaz Praktikant
05. februar 2005 - 18:19 #26
Er den property der hedder " AcceptchangesDuringFill" ? den er slået til true.
Avatar billede snepnet Nybegynder
05. februar 2005 - 18:46 #27
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.

mvh
Avatar billede ihtezaz Praktikant
07. februar 2005 - 11:18 #28
Den checkbox er valgt.

Den fejl, jeg nu hele tiden får er følgende:

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.
Avatar billede snepnet Nybegynder
07. februar 2005 - 17:33 #29
Denne kode her :

BrugerBrugerOplysDS.BrugerOplysRow dr = brugerDs.BrugerOplys.NewBrugerOplysRow();
dr.Navn = txtNavn.Text;
dr.Adresse = txtAdr.Text;
dr.Postnr = Convert.ToInt32(txtPostnr.Text);
dr.By = txtBy.Text;

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).

mvh
Avatar billede ihtezaz Praktikant
07. februar 2005 - 18:17 #30
Den gode snepnet, jamen det løst jo alle problemmerne.
Jeg skulle bare sætte:
dr.brugerID = dr1.brugerID; Som du sagde.

Smid et svar.
Avatar billede snepnet Nybegynder
07. februar 2005 - 19:03 #31
Det var godt du fik det til at rulle :o)
god fornøjelse - og held og lykke med dit program.
mvh
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