Toon posts:

[SQL] SQLServer 2000 en dot notation *

Pagina: 1
Acties:

Verwijderd

Topicstarter
.. dot notation? (titel afgekapt)

Hierbij een probleem wat me ondertussen al een paar dagen lang bezighoudt; enkele maanden geleden heb ik een 'digitaal archief'-applicatie opgezet in Classic ASP op IIS (5.0). Deze applicatie maakt gebruik van een relatief simpele Access 2000 database als backend.

Toen de applicatie klaar was is er echter besloten om de database alsnog naar SQL Server 2000 te migreren. De database dus -succesvol- door de upsize-wizard van Access gehaald en de database connection string in de ASP code aangepast. Zodra de applicatie echter gestart werd, stond er een ASP/SQL error in de pagina: de opgegeven velden konden niet in de recordset teruggevonden worden; een bekende error die meestal op een typo duidt. Deze SQL queries bevatten echter geen typ-fouten, aangezien ze bij de Access database nog foutloos werkten (en ik heb ze daarnet nog eens dubbelgecheckt).

Al snel kwam ik erachter dat het probleem lag bij SQL Server, dat weigerde de dot notation te slikken die ik gebruikte in mijn code:

code:
1
2
3
Set Conn.Execute("SELECT tblTabel.ID, tblNogEenTabel.ID FROM tblTabel INNER JOIN tblNogEenTabel ON [i]... etc ...[/i] ")

strVariabele = RS("tblTabel.ID")


Bij bovenstaande query genereert SQL Server een error wanneer ik tblTabel.ID gebruik om te refereren aan dat veld in de recordset, wat bij de Access database wel goed ging (en wat me ook gewoon correcte SQL lijkt). Wanneer ik echter het 'tblTabel.' gedeelte weglaat, dus:

code:
1
strVariable = RS("ID")


krijg ik wel een resultaat! Dit zou helemaal niet mogen volgens de achterliggende theorie omdat ik met die verwijzing zowel tblTabel.ID als tblNogEenTabel.ID zou kunnen bedoelen (ik krijg overigens deze laatste dan terug)!

Maar even dit X-Files materiaal terzijde, waarschijnlijk gaat het wel goed, wanneer ik alle queries voorzie van aliases. Is dit inderdaad de enige uitweg (veeeeel werk :'( ), of weet iemand hier wat er aan het handje is?

PS: Sorry voor de eventueel gepercipieerde Extreme Warrigheid™ van dit relaas

[ Voor 8% gewijzigd door Verwijderd op 18-12-2003 23:11 . Reden: titel afgekapt ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

Upsize wizard vindt het sowieso leuk om je datatypes compleet en volledig te vernaggelen; autonumber columns te slopen en van number velden varchar velden te maken.

Ergo; hierdoor worden dus complete queries compleet onbruikbaar gemaakt.

En je zegt dat SQL Server een foutmelding geeft..... * gorgi_19 is graag nieuwsgierig en zou hem ook wel willen weten.. :P En ik denk dat er wel meer nieuwsgierige aagjes rondlopen in PW. :+

[ Voor 29% gewijzigd door gorgi_19 op 18-12-2003 22:20 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
gorgi_19 schreef op 18 december 2003 @ 22:19:
Upsize wizard vindt het sowieso leuk om je datatypes compleet en volledig te vernaggelen; autonumber columns te slopen en van number velden varchar velden te maken.

Ergo; hierdoor worden dus complete queries compleet onbruikbaar gemaakt.

En je zegt dat SQL Server een foutmelding geeft..... * gorgi_19 is graag nieuwsgierig en zou hem ook wel willen weten.. :P En ik denk dat er wel meer nieuwsgierige aagjes rondlopen in PW. :+
De velden zijn na de upsize gecontroleerd en de doorgevoerde veranderingen leken me niet meer dan logisch (string -> varchar, PK -> non-clustered PK etc)
Voor de rest werken de queries waarin de dot notation om velden te identificeren in recordsets niet wordt gebruikt nog prima.

Nou ben ik alleen een behoorlijke SQL Server 2000 beginner als het op al te fijne details aankomt en ik heb dus ook geen idee of ik SQL processing opties ergens kan aanpassen, waardoor die deze notatie (tabel.veld) wel slikt?

edit: De exacte foutmelding heb ik niet bij de hand (was op webserver van bedrijf), maar het betreft de bekende: "Item cannot be found in the collection corresponding to the requested name or ordinal."

edit 2: Op deze website wordt een vergelijkbaar scenario geschetst: http://www.adopenstatic.com/faq/800a0cc1.asp

Volgens hen komen mijn keuzes neer op:

- De velden in de database hernoemen
- Aliases overal gebruiken
- Ordinals (numerieke verwijzingen) gebruiken

Dus SQL Server is op dit gebied echt minder capabel dan Access??? :'( Wie had dat ooit durven dromen ..

[ Voor 28% gewijzigd door Verwijderd op 18-12-2003 23:08 . Reden: foutmelding ]


Verwijderd

MSSQL ondersteunt wel de . syntax, wat hij niet ondersteunt is twee velden met dezelfde kolomnaam. Access blijkbaar wel dmv de "tabel.naam" constructie, wist ik niet.

Enige quick and dirty oplossing die wellicht werkt in MSSQL is de kolommen een alias geven middels "table1.id AS [table1.id]", dan hoef je in ieder geval de bovenliggende (of zo te zien in jouw geval meer omliggende) code niet aan te passen, maar ik kan me goed voorstellen dat MSSQL dat niet pikt. Kwestie van even proberen in de Query Analyzer.

  • Bud_s
  • Registratie: Maart 2002
  • Laatst online: 25-05 18:29
Om dit soort ergernissen te voorkomen nummer ik altijd mijn bestanden, en neem die nummering weer op in de veldnamen :) je kan zo altijd achterhalen uit welke tabel een veld komt.

Voorbeeld :
code:
1
2
3
4
5
6
7
8
9
tbl01
'velden 
ID01
whatever01

tbl02
'velden
ID02
whatever02

etc

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
gorgi_19 schreef op 18 december 2003 @ 22:19:
autonumber columns te slopen en van number velden varchar velden te maken.
Ik meen mij te herinneren dat 'ie triggers gebruikt om een autonummer te simuleren.

@TS: Ik zou zeker weten de velden aliassen, het is (even) veel werk waar wel de netste oplossing, zeker als je later onderhoud aan de code moet doen.

Ik zou niet gaan werken met een nummering van tabellen in plaats van een zinvolle naamgeving. Over een half jaar weet je al niet meer welk nummer wat betekent.


[miereneuk]
Bij bovenstaande query genereert SQL Server een error wanneer ik tblTabel.ID gebruik om te refereren aan dat veld in de recordset
In dit geval is het niet SQL Server dat een error genereert, maar ADO
[/]

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

Topicstarter
P_de_B schreef op 19 december 2003 @ 08:13:
[...]


Ik meen mij te herinneren dat 'ie triggers gebruikt om een autonummer te simuleren.

@TS: Ik zou zeker weten de velden aliassen, het is (even) veel werk waar wel de netste oplossing, zeker als je later onderhoud aan de code moet doen.

Ik zou niet gaan werken met een nummering van tabellen in plaats van een zinvolle naamgeving. Over een half jaar weet je al niet meer welk nummer wat betekent.
Tja, dan zal ik inderdaad maar aliases overal in gaan voegen. Ik blijf het op z'n minst curieus vinden dat met Access de notatie wel herkend wordt, als dat bij SQL Server niet meer mogelijk is. :/
[miereneuk]

[...]

In dit geval is het niet SQL Server dat een error genereert, maar ADO
ok.

Verwijderd

Topicstarter
Verwijderd schreef op 19 december 2003 @ 00:09:
MSSQL ondersteunt wel de . syntax, wat hij niet ondersteunt is twee velden met dezelfde kolomnaam. Access blijkbaar wel dmv de "tabel.naam" constructie, wist ik niet.

Enige quick and dirty oplossing die wellicht werkt in MSSQL is de kolommen een alias geven middels "table1.id AS [table1.id]", dan hoef je in ieder geval de bovenliggende (of zo te zien in jouw geval meer omliggende) code niet aan te passen, maar ik kan me goed voorstellen dat MSSQL dat niet pikt. Kwestie van even proberen in de Query Analyzer.
Dit ga ik zeker proberen, zou al een hoop werk schelen. :)

Verwijderd

Topicstarter
Verdorie t werkt nog steeds niet daarom een plezante kick :'(

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:31
Gebruik gewoon aliasses in je SQL:

code:
1
SELECT tabel1.ID AS myId ...


code:
1
var = RS("myId")

https://fgheysels.github.io/


Verwijderd

code:
1
Set Conn.Execute("SELECT dbo.tblTabel.ID, dbo.tblNogEenTabel.ID FROM tblTabel INNER JOIN tblNogEenTabel ON [i]... etc ...[/i] ")


Bij mij werkt het wel als ik dbo. voor de kolomnaam zet

[ Voor 5% gewijzigd door Verwijderd op 02-01-2004 22:41 ]


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Wat voor error krijg je? "Het werkt niet" is zo vaag. Krijg je geen data terwijl je dat wel verwacht, krijg je een ranzige error over de syntax of wat anders?

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

Topicstarter
EfBe schreef op 02 januari 2004 @ 23:28:
Wat voor error krijg je? "Het werkt niet" is zo vaag. Krijg je geen data terwijl je dat wel verwacht, krijg je een ranzige error over de syntax of wat anders?
"Item cannot be found in the collection corresponding to the requested name or ordinal."

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Verwijderd schreef op 03 januari 2004 @ 10:21:
"Item cannot be found in the collection corresponding to the requested name or ordinal."
Klinkt mij als een ADO error in de oren, niet als een SqlServer error. M.a.w.: je recordset bevat niet de column "Foo" als jij doet: a = rs("Foo").Value

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com

Pagina: 1