Vra

Ek gebruik VS2008 C# Express en die Northwind-databasis op 'n Windows Form-toepassing.

Ek het sleep-en-los gebruik om die hoofbesonderhedebinding op te stel (ek het die bestellings en bestellingbesonderhede gebruik) vir die twee datagridviews.Op hierdie stadium werk alles soos verwag.Om nie elke ry in die tabel terug te gee nie, wil ek die Bestellingstabel filter op grond van 'n filter vir die Bestellingstabel EN ook op 'n veld in die Bestellingsbesonderhede-tabel.In die TableAdapter Configuration Wizard het ek die navraagbouer gebruik om 'n nuwe FillByMyFilter by te voeg wat die volgende navraag geskep het:

KIES Bestellings. [Bestel ID], Bestellings. [Kliënt-ID], bestellings. [Werknemer-ID], bestellings. [Skeepsnaam], bestellings. [Skeepsadres], bestellings. [Skeepsstad], bestellings. [Skeepsstreek], Bestellings. [Stuur poskode], bestellings. [Skeepsland], bestellings. [Stuur via], bestellings. [Besteldatum], Bestellings. [vereiste datum], bestellings. [Versend datum], Bestellings.Vrag VAN Bestellings INNERLIKE AANSLUITING [Bestel besonderhede] OP Bestellings. [Bestel ID] = [Bestel besonderhede]. [Bestel ID] WAAR (Bestellings.[ Skeepsnaam] SOOS N'A%') EN ([Bestel besonderhede]. Hoeveelheid < 20)

Ek het dit gekry deur albei tabelle by te voeg, maar het nie enige van die veldblokkies in die Order Details-tabel gemerk nie, sodat dit slegs die kolomme sou terugstuur wat in die oorspronklike Vul-navraag gebruik is.Ek probeer op hierdie stadium net die DataSet in die meestertabel filter en nie 'n ander aantal kolomme terugstuur nie.Kinderrye van die bestellingbesonderhede moet steeds werk soos die verstek ongefiltreerde resultaatstel.

Nou die probleem:As ek op die Voer navraag knoppie klik, werk dit goed.Ek kry 53 rye uit die bogenoemde navraag eerder as die 1078 met behulp van die verstekvul wat deur die ontwerper geskep is.Dit gee dieselfde kolomme as die oorspronklike invulnavraag terug.Wanneer ek egter probeer om die toepassing te laat loop, kry ek die volgende beperkingsfout:

"Kon nie beperkings aktiveer nie.Een of meer rye bevat waardes wat nie-nul, unieke of vreemde sleutelbeperkings oortree."

Wat doen ek verkeerd?

OPDATEER:Ek dink ek kry die beperkingsfout as gevolg van die INNER JOIN wat deur die Wizard geskep is.As ek die navraag wysig om LEFT JOIN te gebruik, dan verander die Wizard dit terug na INNER JOIN.

My vraag staan ​​steeds oor hoe om rekords in die ouertabel (bestellings) te filter op grond van kriteria van beide die ouer- en kindtabel.My volgende toets is om 'n gestoorde proc te probeer gebruik, maar wil graag weet deur net die TableAdapter-pasgemaakte FillBy-metode te gebruik.

Groete,

Ontfout

Was dit nuttig?

Oplossing 3

Dankie aan almal wat 'n antwoord geplaas het.Hier is hoe ek dit gedoen het met behulp van die TableAdapter Wizard en die Northwind-getikte datastel.

1) Regskliek op die ouertabel in die xsd-ontwerper om die navraag by te voeg of op te stel.2) Klik op die "Volgende"-knoppie in die Wizard totdat jy die "Navraagbouer"-knoppie sien.Klik op die Query Builder-knoppie om jouself in die navraagbouer-modus te kry.3) Regskliek en voeg die kindtabel in die ontwerppaneel by.Jy moet beide tabelle en die verstekbeperking hê wat hulle verbind.4) Klik op die kolom op die kindtabel wat jy wil filtreer (hierdie regmerk sal later verwyder word) om dit by die kriteriapaneel te voeg sodat jy dit kan filtreer.5) Voeg die filter vir die Ouer- en Kind-kolomme by.In hierdie voorbeeld het ek die skipnaam SOOS 'A%' en die bestelhoeveelheid < 20 gefiltreer.

Let daarop dat u op hierdie stadium u navraag kan toets deur op die Voer navraag-knoppie te klik.Deur die Northwind DB vir SQL 2008 kompakte uitgawe te gebruik, kry ek 53 rye terug.As jy dit op hierdie stadium sou stoor, sou dit tydens looptyd misluk as gevolg van die duplikaat primêre sleutels in die resultaatstel.So die volgende paar stappe sal van hulle ontslae raak.

6) Ontmerk die kindtabelkolom wat u voorheen bygevoeg het in die kriteria-paneel.Die filter sal bly en dieselfde kolom sal nou ook in die ontwerppaneel ontmerk word.As jy die navraag uitvoer, sal jy steeds 53 rye hê, maar sonder die kindtabelkolom.7) Regskliek op die ontwerppaneel en voeg die "Groep volgens" by.Op hierdie stadium, wanneer jy hierdie navraag uitvoer, behoort jy geen duplikate in die Bestel-ID te hê nie.Ek het presies 29 rye teruggekry.8) Klik OK en dan die "Volgende"-knoppie totdat jy jou nuwe FillBy-navraag stoor.9) Verander jou bronkode om jou nuwe FillBy te gebruik.

Toe ek die toepassing hardloop, het ek die gefiltreerde ouertabel gekry met dieselfde 29 rye wat die Voer navraag-knoppie teruggestuur het.Die kindtabel het gewerk soos verwag en het ten minste een kinderry bevat wat 'n hoeveelheid van < 20 bevat het.

Vir 'n regte wêreldtoepassing dink ek dit sal beter wees om 'n gestoorde proc of LINQ te gebruik.Maar hierdie probleem het my laat kopkrap en daarom het ek dit “pas gemaak” net omdat dit 'n uitdaging was (ten minste vir my).

Ander wenke

Hierdie artikel bevat 'n paar foutsporingsvoorstelle om die presiese ry vas te stel wat die probleem veroorsaak:

DataSet hel - "Kon nie beperkings aktiveer nie.Een of meer rye bevat waardes...."

As jy in die Orders.Designer.cs kyk (raai, aangesien ek in VB werk), sal jy waarskynlik 'n unieke beperking op bestellings sien (vir die primêre sleutel).

Ek vermoed die probleem is, wanneer jy jou navraag uitvoer, kry jy een of meer individuele bestellings wat > 1 OrderDetails.Quanity > 20 het....dus, daardie bestelling sal twee keer in jou resultate teruggestuur word, wat die primêre sleutel oortree.

Probeer:KIES * van bestellings waar [Skeepsnaam] SOOS '%whatever% EN OrderID in (kies OrderID van OrderDetails waar Hoeveelheid < 20)

Dit is waarskynlik 'n baie ondoeltreffende manier om dit te doen, in Oracle sal jy EXISTS() gebruik in plaas van IN() maar ek ken nie die sql-bedienerekwivalent nie.

Hoop jy het dit beantwoord, maar indien nie, dink daaraan.

In jou datastel as die Order- en OrderDetail-datatabelle 'n verwantskap tussen hulle het, werk dit ietwat soos 'n FK-beperking.Dus, daar kan geen rekords in die kindtabel (OrderDetail) wees wat nie 'n mede-antwoord ouer (Order) rekord het nie.Wat dus kan gebeur, is wanneer jy die Besteldatatabel verfris, met die navraag wat jy hierbo noem, is daar steeds kinderrye in die OrderDetail-tabel wat verwysings sal hê na Ouer (Bestelling) rekords wat nie meer daar sal wees na die herlaai nie.Dit gesê, as jy die Order DataTable verfris, moet jy ook die OrderDetail data tabel verfris, of die verhouding tussen die twee DataTables verwyder.

Hoop dit help...

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top