[ADO.NET] Informatie op maat, webservice

Pagina: 1
Acties:

  • Zyphrax
  • Registratie: September 2001
  • Laatst online: 04-04-2023
Het bedrijf waar ik werk is zich wat meer aan het verdiepen in ADO.NET DataSets.
Nu heb ik daar zelf al wat ervaring mee en het een en ander uitgezocht.

Ik vraag mij alleen af hoe je fatsoenlijk de functionaliteit in een WebService vorm aanbied.

Laten we zeggen je hebt een WebService die CRM informatie aanbiedt. Je hebt WebService methoden als:
- GetCompanyByID
- GetCompanies

Iedere afnemer van de WebService heeft zijn eigen behoefte aan informatie. De een wil van een Company alleen de bedrijfsnaam weten, de ander wil de bedrijfsnaam en volledige adresgegevens. Een ander wil misschien alle bedrijfsnamen die met een E beginnen (en wellicht alleen de 1e 100). Nu kan je daarvoor wel allemaal aparte webservice methoden aan gaan maken, maar dat schiet niet echt op. Hoe geef je de afnemer van de WebService op een nette manier de mogelijkheid "een WHERE statement te vormen"?

[ Voor 3% gewijzigd door Zyphrax op 23-08-2005 11:03 ]

Any sufficiently advanced technology is equivalent to magic.


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 22:17

TeeDee

CQB 241

Wat is het kennis niveau van de afnemers?
Want je kan in een DataSet gewoon een dt.Select("where ...") doen.

Of het handig is (ivm evt. injections etc.) is een andere vraag.

Je kan het ook omgooien: Laat de afnemer lekker zelf regelen wat hij/zij nodig heeft.

[ Voor 74% gewijzigd door TeeDee op 23-08-2005 11:07 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • whoami
  • Registratie: December 2000
  • Laatst online: 14:39
Wat je kan doen, is een soort 'Criteria' object meegeven aan je web-method.

Je webservice ontleedt dat criteria object dan, en dan ga je binnen die webservice jouw SQL query gaan opstellen waarmee je de informatie ophaalt.

https://fgheysels.github.io/


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 22:17

TeeDee

CQB 241

whoami schreef op dinsdag 23 augustus 2005 @ 11:08:
Wat je kan doen, is een soort 'Criteria' object meegeven aan je web-method.

Je webservice ontleedt dat criteria object dan, en dan ga je binnen die webservice jouw SQL query gaan opstellen waarmee je de informatie ophaalt.
Mjah, en dat is denk precies het "probleem" van zijn vraag.
Wat zijn die criteria? Als ik het zo lees zijn er veel mogelijkheden.

- select 10 companys die met een E beginnen.
- select 2367 companys die in het buitenland zitten

Dan zal je dus die Criteria moeten definieren a la Parameters en die direct in je SQL (incl. gechecked en wel) pompen?

Heart..pumps blood.Has nothing to do with emotion! Bored


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

TeeDee schreef op dinsdag 23 augustus 2005 @ 11:06:
Wat is het kennis niveau van de afnemers?
Want je kan in een DataSet gewoon een dt.Select("where ...") doen.

Of het handig is (ivm evt. injections etc.) is een andere vraag.

Je kan het ook omgooien: Laat de afnemer lekker zelf regelen wat hij/zij nodig heeft.
Het is zonde om 10.000 klanten (dan mag het bedrijf wel blij zijn met zoveel klanten) op te halen, terwijl je er maar 1 of een ander klein aantal nodig hebt.

  • Zyphrax
  • Registratie: September 2001
  • Laatst online: 04-04-2023
We moeten heel erg rekening houden met performance. Het gaat om zeker 8000 bedrijven in de database. Als ik daar * van selecteer krijg ik een gruwelijke bak aan informatie (die ook nog eens allemaal geserializeerd word). Daarom wil ik graag de database het filter werk laten doen.

Een Criteria object... Ik zou daar een lege Company entiteit kunnen vullen met dingen waar ik op wil selecteren, maar dat werkt ook niet echt lekker in alle gevallen. Zeker als je van een datum bijvoorbeeld alle data in een bepaalde range wil hebben. En je kan dan ook geen dingen kwijt als alle bedrijven die beginnen met ...

Is daar een best practice voor?

edit:

Lol, jullie zagen dezelfde problemen als ik :), alleen 5 minuten eerder

[ Voor 7% gewijzigd door Zyphrax op 23-08-2005 11:14 ]

Any sufficiently advanced technology is equivalent to magic.


  • whoami
  • Registratie: December 2000
  • Laatst online: 14:39
Mja, die criteria zou je enkel maar moeten hebben voor het 'filteren'. (hetgeen dus in je where clausule komt).
Die query kan je gewoon opbouwen, en mbhv parameters vermijdt je injection.

Als de consumer van die webservice dan enkel de eerste 10 records wil ofzo, tja, dan moet die consumer er maar voor zorgen dat hij enkel die eerste 10 gebruikt.
De consumer moet zelf maar de informatie uit die dataset (of custom object) halen wat hij zelf nodig heeft.

https://fgheysels.github.io/


  • Zyphrax
  • Registratie: September 2001
  • Laatst online: 04-04-2023
Ik vind hier op internet ook niet echt hele goede informatie over (misschien zoek ik niet op de juiste keywords). Dit moet toch iets zijn wat veel mensen tegenkomen? Ik zie alleen maar situaties waar met een DataSet rustig alles overgehaald wordt.

Any sufficiently advanced technology is equivalent to magic.


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 22:17

TeeDee

CQB 241

Zyphrax schreef op dinsdag 23 augustus 2005 @ 11:13:
We moeten heel erg rekening houden met performance. Het gaat om zeker 8000 bedrijven in de database. Als ik daar * van selecteer krijg ik een gruwelijke bak aan informatie (die ook nog eens allemaal geserializeerd word). Daarom wil ik graag de database het filter werk laten doen.

Een Criteria object... Ik zou daar een lege Company entiteit kunnen vullen met dingen waar ik op wil selecteren, maar dat werkt ook niet echt lekker in alle gevallen. Zeker als je van een datum bijvoorbeeld alle data in een bepaalde range wil hebben. En je kan dan ook geen dingen kwijt als alle bedrijven die beginnen met ...

Is daar een best practice voor?

edit:

Lol, jullie zagen dezelfde problemen als ik :), alleen 5 minuten eerder
Een aantal criteria die wel zouden kunnen werken met het oog op performantie.
• max records returned
• company starts with

Maar dat is meteen heel specifiek.
Als enige filter wat dus impact zal hebben is je max records returned.
questa schreef op dinsdag 23 augustus 2005 @ 11:13:
[...]
Het is zonde om 10.000 klanten (dan mag het bedrijf wel blij zijn met zoveel klanten) op te halen, terwijl je er maar 1 of een ander klein aantal nodig hebt.
Eens, maar ik heb liever niet dat klanten een complete SQL query in mijn webservice kwakken.
Dus het is of/of.
Je geeft een complete dataset aan je afnemer. Laat hem/haar het uitzoeken.

Ik weet niet wat de "poll" interval is, maar het lijkt me dat een dataset van 8000 records (en bijbehorende gegevens) niet echt heeeeeel erg spannend is.

Edit:
Je komt toch op dit soort spul uit: http://msdn.microsoft.com...ingparameterizedquery.asp
Nadeel is wel dat het erg op je Datamodel leunt.

[ Voor 8% gewijzigd door TeeDee op 23-08-2005 11:23 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Zyphrax
  • Registratie: September 2001
  • Laatst online: 04-04-2023
Wij gebruiken ook zo'n intelligente dropdownlist, waar we meteen alle 8000 records in kwakken.
De intelligente dropdownlist biedt ook de mogelijkheid om slimmere queries te doen. Hiervoor wil ik dus technieken gebruiken als, pak alle bedrijven die beginnen met ... (als de gebruiker bijvoorbeeld in de dropdown al de letter ... ingetikt heeft).

Any sufficiently advanced technology is equivalent to magic.


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 22:17

TeeDee

CQB 241

max rows returned
starts with
ends with
between
is

en dan voor elk hierboven staand criterium een veld uit een dropdown hier aan hangen?

Heart..pumps blood.Has nothing to do with emotion! Bored


Verwijderd

Ik heb zoiets ongeveer ooit gemaakt. De oplossing was bij mij inderdaad om een 'criteria' klasse te schrijven. in die klasse zat voor zogoed als elk veld in de database een array waarin de gebruiker van de klasse de waarden die hij zocht kon inschrijven (via properties uiteraard)

stel je hebt een tabel
tblBedrijf
-id
-naam

dan had ik in mijn klasse
[code]
public void addId(int id){
idArray.add(id)
}

public function addNaam(string naam){
naamArray.naam
}
[code]

Daarmee kun je dus al al de waarden ophalen die je wilt. Ik maakte ook gebruik van wildcards (Standaard SQL wildcards * en ? werken heel goed met like)

Van al die gegevens die de gebruiker invoerde moet je dus nog een query bouwen. Dat is ook niet altijd even simpel, maar wel te doen. Het bouwen van die query gebeurde bij mij in een superklasse die onzichtbaar was voor de buitenwereld. Voor elke array riep ik een functie op met als parameter de tabelnaam en de waarden.

Zaken zoals de top 100 had ik niet, maar valt volgens mij goed te doen. Een functie in uw superklasse die aan het einde nog al de zaken toevoegt die op het einde van een sql-statement moeten gebeuren.

Code van dit alles mag ik niet geven, maar als je nog vragen hebt wil ik graag antwoorden.

  • Zyphrax
  • Registratie: September 2001
  • Laatst online: 04-04-2023
Thnx voor de hulp allen.

Ik zou natuurlijk ook een DataSet aan kunnen leveren om aan te geven welke kolommen ik wil...

Any sufficiently advanced technology is equivalent to magic.


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 22:17

TeeDee

CQB 241

Zyphrax schreef op dinsdag 23 augustus 2005 @ 12:03:
Thnx voor de hulp allen.

Ik zou natuurlijk ook een DataSet aan kunnen leveren om aan te geven welke kolommen ik wil...
Een klein beetje opvoeding van de afnemers zou uiteraard geen kwaad kunnen.
Denk dat je op die manier de grootste problemen kan ontlopen.

Heart..pumps blood.Has nothing to do with emotion! Bored

Pagina: 1