Avatar billede sortsnak.dk Nybegynder
03. september 2008 - 11:45 Der 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


På forhånd mange tak for jeres hjælp. :)
Avatar billede fennec Nybegynder
03. september 2008 - 11:51 #1
Hvilken datatype er de omtalte felter i databsen??
Avatar billede sortsnak.dk Nybegynder
03. september 2008 - 11:53 #2
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.
Avatar billede sortsnak.dk Nybegynder
03. september 2008 - 12:02 #3
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. :(
Avatar billede softspot Forsker
03. september 2008 - 12:06 #4
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
Avatar billede erikjacobsen Ekspert
03. september 2008 - 12:09 #5
"...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.
Avatar billede fennec Nybegynder
03. september 2008 - 12:11 #6
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...
Avatar billede erikjacobsen Ekspert
03. september 2008 - 12:37 #7
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.

Og det er ikke kun i mssql, dette sker.
Avatar billede sortsnak.dk Nybegynder
03. september 2008 - 12:38 #8
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
Avatar billede softspot Forsker
03. september 2008 - 12:39 #9
Ja, det kan det godt. Du skal bare markere alle tre brugere i listen når du accepterer svarene... :-)
Avatar billede fennec Nybegynder
03. september 2008 - 12:40 #10
Det kan det sagtens. Vi skal bare alle smide et svar.
.o) <-- One Eyed Jack
Avatar billede fennec Nybegynder
03. september 2008 - 12:44 #11
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.
Avatar billede erikjacobsen Ekspert
03. september 2008 - 12:49 #12
Ingen point til mig, tak.
Avatar billede softspot Forsker
03. september 2008 - 13:05 #13
Tak for point :)
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
Kurser inden for grundlæggende programmering

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