03. september 2008 - 11:45Der er
11 kommentarer og 2 løsninger
GetRows outputter ikke data fra alle celler med "select * from"
Det lyder meget mærkeligt og det er det også, for jeg har 3 ud af 13 felter i min MS SQL-database som ikke bliver outputted via GetRows og en "select *"-query. Disse felter kan jeg godt få outputted hvis jeg indtaster feltetsnavn i queryen; altså select invTitle, invBody, invAuthor istedet for select *.
Nogen der har et bud på hvad problemet kan være og hvordan jeg løser det? :)
Simplificeret kode:
set rs = conn.execute("select * from inv where id=3035") ds = rs.getRows() for a=0 to 13 response.write "<li>"&ds(a,0) next set rs = nothing
Okay, det er endnu mere mærkeligt det her. Hvis jeg outputter alle felter i queryen (istedet for *) så giver den samme fejl!
"select id,invoiceId,VatOn,CurrentLanguage,invoiceDate,invoiceTitle,invoiceAddress,invoiceJnr,invoiceFullShow,invoiceFlgBrev,invoiceFlgBrevTitle,invoiceFlgDato,invoiceBottomText,invoicePayment from inv where id=3035"
... det er text og varchar(255) datatyper det meste. Det er dog kun 3 af dem som ikke bliver outputted.
Jeg har fundet ud af at det er feltet invoiceBottomText som giver problemet. Hvis jeg udelader den fra den fulde query så outputter den al data. Hvis invoiceBottomText er med bliver de 3 tidligere felter blanke.
Datatype: invoiceBottomText (text,null)
Feltet indeholder sjældent data. I det her tilfælde (3035) er feltet blankt. Det hjælper ikke at udfylde feltet. :(
Jeg vil også tro det har noget med datatypen at gøre. Du kan evt. prøve at flytte de felter som er af type text hen i slutningen af din SQL-sætning, for at se om det kan bringe de øvrige felter frem. Prøv også at beskære feltværdierne til en kendt længde, det kunne jo godt være at ADO simpelthen bliver nød til at undlade at hente de lange text-typede felter pga. hukommelsesforbruget.
Prøv i øvrigt lige denne løkke i stedet for din egen (det bekymrer mig lidt at du siger du har 13 felter, men itererer 14 gange):
set rs = conn.execute("select * from inv where id=3035") ds = rs.getRows() for a=0 to ubound(ds,1) response.write "<li>"&ds(a,0) next set rs = nothing
"...flytte de felter som er af type text hen i slutningen af din SQL-sætning" - det vil formentlig virke, og skyldes den driver der ligger mellem din ASP-kode og databasen. Store felter til sidst, og alle felter aflæses i rækkefølge, og kun een gang.
Detaljen her er din text kolonne (og gælder desuden alle blob typerne). MS-SQL har en "bug" angående dem. De SKAL selectes til sidst i listen og de SKAL anvendes/udskrives tilsidst i koden. Jeg skriver "bug" for i følge MS så er det noget de har lavet by design. Altså et helt bevidst valg.
Jeg kan desværre ikke finde linket til msdn hvor det stod.
Din select skal altså være på denne måde: select talKol1, tekstKol1, talKol2,tekstKol2 , blobKol1, blobKol2 from DinTabel
ps. Kan se soft og erik har været med kommentar mens jeg skre dette, men jeg smider lige min aligevel...
Og "by design" betyder nemlig noget for hastigheden. Det betyder at de store felter, altså de potentielt store felter som text og blob, ikke skal caches af driveren. De hentes når der bliver spurgt efter dem, med den sideeffekt at indholdet af alle andre felter ryddes.
Sådan set ok - men det ville være rart at få en sql-exception når man tilgår et slettet felt.
Jaaa, det virkede sørme at smide text-felterne ind til sidst!! Dejligt, nu er jeg blevet lidt klogere. :)
Mange tak for hjælpen til jer alle tre! Ja, eftersom I jo alle har besvaret mit spørgsmål må I vel hellere få point alle tre. Hvis det da kan lade sig gøre. :D
Detaljen er så at det faktisk virker nogen gange selv om Text feltet ikke bliver selected til sidst. Så nogen gange vil det virke fint med "select * ..", andre gange skal du nævne kolonnerne ved navn og have Text felterne tilsidst.
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.