Avatar billede dbmanager Nybegynder
22. september 2005 - 22:09 Der er 28 kommentarer og
1 løsning

Type mismatch på MySQL 4.1.1 men ikke på 4.1.0

Hej

Jeg har været ved at flytte en database fra en MySQL-server ver. 4.1.o til en ver.4.1.1.

Databasen er eksporteret fra den ene server til den anden, så de burde være identiske, man når jeg kører asp-siderne på den nye database får jeg flg. fejl:

Microsoft VBScript runtime error '800a000d'

Type mismatch

/visartikel.asp, line 140


  <% 
   
    sql = "select count(*) as records from artikler where LCID='" & LCID &"'"
    set rs = conn.execute(sql)
    antalrecords = rs("records")
    rs.close
    set rs = nothing

>>>>>     if antalrecords <= 0 then 


Linien med >>>> er linie 140
Avatar billede kjulius Novice
22. september 2005 - 22:18 #1
Mærkeligt! Men måske returnerer MySQL ODBC driveren nu en null værdi, hvis der ingen rows er? I så fald kunne du jo prøve at teste med If IsNull(rs("records")) Then
Avatar billede dbmanager Nybegynder
22. september 2005 - 22:23 #2
Nu blev fejlen ændret til: Type mismatch: 'rs'
Avatar billede kjulius Novice
22. september 2005 - 22:50 #3
Min fejl! Hvis du har lagt testen i linie 140 (altså efter, rs.close) vil det give fejl. Prøv i stedet at teste med:

If IsNull(antalrecord) Or antalrecords <= 0 Then
Avatar billede kjulius Novice
22. september 2005 - 22:51 #4
Der manglede vist et s:

If IsNull(antalrecords) Or antalrecords <= 0 Then
Avatar billede dbmanager Nybegynder
23. september 2005 - 12:15 #5
Desværre, samme fejlmeddelelse

Kan det være noget med, at count(*) er ændret i 4.1.1?
Avatar billede kjulius Novice
23. september 2005 - 22:58 #6
Jeg er ikke ekspert i MySQL. Men jeg er kommet til at tænke på, at feltnavnet records måske kan give anledning til problemer (det er jo også en property på recordsættets fields collection). Prøv at navngive det lidt anderledes.
Avatar billede kjulius Novice
23. september 2005 - 23:00 #7
Eller er det? Jeg kommer i tvivl. Men prøv alligevel...
Avatar billede dbmanager Nybegynder
24. september 2005 - 10:32 #8
Jeg har nu ændret records til poster, men det giver desværre sammme fejlmeddelelse
Avatar billede kjulius Novice
24. september 2005 - 13:48 #9
Kører du med den nyeste ODBC driver til MySQL (version 3.51.10)?

Ellers hent den evt. hos MySQL http://dev.mysql.com/downloads/connector/

Tjek evt. også at du har den nyeste MDAC installeret:

http://www.microsoft.com/data/mdac
Avatar billede dbmanager Nybegynder
24. september 2005 - 16:22 #10
Ja, der er Windows 2003 MDAC 2.8 SP1

Jegf har også for en sikkertheds skyld, kørt denne for at checke: http://www.microsoft.com/downloads/details.aspx?FamilyId=8F0A8DF6-4A21-4B43-BF53-14332EF092C9&displaylang=en
Avatar billede kjulius Novice
24. september 2005 - 16:31 #11
Du har ikke ændret i din ASP side OVERHOVEDET mellem de to databaseversioner? Dette bare for at pinpointe problemet til datasen...
Avatar billede dbmanager Nybegynder
24. september 2005 - 16:40 #12
Ikke spor, og hvis jeg ændret connection fra den server der kører MySQL 4.1.1 til MySQL 4.1.0, så er problemet væk
Avatar billede kjulius Novice
24. september 2005 - 16:59 #13
Jeg fandt denne reference til en anden som brokker sig over, at count opfører sig anderledes i forskellige versioner af MySQL.
http://www.issociate.de/board/post/26233/return_typ_of_count(*)_in_V4.0.18/V4.1_is_different.html

Du kunne prøve at installere ODBC driveren der er under udvikling (5.0 alpha)
http://dev.mysql.com/downloads/connector/odbc/5.0.html

En anden mulighed var, at teste for variabeltypen med funktionen VarTyp (dokumenteret i http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/vsfctvartype.asp):

If VarTyp(antalrecords) = vbString and antalrecords = "0" or antalrecords <= 0 then
Avatar billede kjulius Novice
24. september 2005 - 17:01 #14
VarTyp skulle være VarType. Sorry.
Avatar billede dbmanager Nybegynder
24. september 2005 - 17:21 #15
Det giver desværre samme nedslående resultat.

Jeg prøvede lige at indsætte en response.write antalrecords, men den siger 0 selvom den burde sige 2
Avatar billede kjulius Novice
24. september 2005 - 17:31 #16
Hmm. Prøv at indsætte

Response.Write VarType(rs("poster")), rs("poster")
Response.Write VarType(antalrecords), antalrecords

lige før rs.close

Hvad giver det som resultat?
Avatar billede dbmanager Nybegynder
24. september 2005 - 17:47 #17
Det giver:
Wrong number of arguments or invalid property assignment: 'write'
Avatar billede kjulius Novice
24. september 2005 - 17:56 #18
Sorry, glemte en begrænsning i VBScript...

Response.Write VarType(rs("poster"))
Response Write rs("poster")
Response.Write VarType(antalrecords)
Response.Write antalrecords
Avatar billede dbmanager Nybegynder
24. september 2005 - 18:30 #19
Den skriver 14-0-14-0

- har jeg indsat
Avatar billede dbmanager Nybegynder
24. september 2005 - 19:03 #20
Tallene ændrer sig ikke, hvis jeg indsætter en ekstra post, så der er 3 poster i tabellen
Avatar billede kjulius Novice
24. september 2005 - 19:29 #21
Det var pokkers!
VarType 14 eksisterer ikke iflg. dokumentationen af VarType
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/vsfctvartype.asp

Men jeg har fundet en side, som beskriver nogle flere variabeltyper.
http://www.devguru.com/Technologies/vbscript/quickref/vartype.html

Iflg. denne side er det en vbDecimal type. Decimal burde jo også være numerisk, så hvor pokker er problemet.
Hvad sker der hvis du skriver

Response.Write CLng(antalrecords)

stadig 0? Eller en fejl?
Avatar billede dbmanager Nybegynder
24. september 2005 - 21:32 #22
Underligt, det kan jeg heller ikke gennemskue.


Resultatet er stadig 0
Avatar billede kjulius Novice
24. september 2005 - 22:13 #23
Hvad hvis du nu caster count til signed

select cast(count(*) as signed) from ...
Avatar billede kjulius Novice
24. september 2005 - 22:41 #24
Jeg fandt denne artikel på mySQL.com (hvorfor kigger man altid på producentens side sidst?):

http://dev.mysql.com/doc/mysql/en/count-error.html

"It's because the COUNT(*) expression is returning a BIGINT, and ADO can't make sense of a number this big. Select the Change BIGINT columns to INT option (option value 16384)."

På siden http://dev.mysql.com/doc/mysql/en/configure-options.html står der desuden:

"It is now possible to build MySQL with big table support using the --with-big-tables option, beginning with the following MySQL versions:

4.0 series: 4.0.25

4.1 series: 4.1.11

5.0 series: 5.0.4

This option causes the variables used to keep table row counts to be stored using unsigned long long rather than unsigned long. What this does is to allow tables to hold up to approximately 1.844E+19 ((232)2) rows rather than 232 (~4.295E+09) rows. Previously it was necessary to pass -DBIG_TABLES to the compiler manually in order to enable this feature."

Det kunne se ud som om, at en installation med Big Table Support er inkompatibel med ADO/ODBC support.
Avatar billede dbmanager Nybegynder
25. september 2005 - 00:55 #25
Den har jeg heller ikke opdaget, men betyder det så i praksis, at man ikke kan bruge count(*) til at returnere antallet af poster i en tabel?
Avatar billede kjulius Novice
25. september 2005 - 02:43 #26
Tja, du kunne jo installere databasen uden --with-big-tables option, hvis du ikke forventer at bruge MEGET store tabeller. Det skulle klare problemet, tror jeg.

Hvis du har installeret MAX versionen af MySQL binary er BIG TABLES aktiveret, mens standard versionen ikke har det aktiveret, så vidt jeg kan læse på download-siden
http://dev.mysql.com/downloads/mysql/4.1.html

Men det nemmeste er nok at tilføje + 16384 til OPTION parameteren på din connection string. Det vil gøre, at din COUNT værdi vil blive overleveret til ADO som en INT værdi, hvilket den vil kunne håndtere.
Ref.: http://dev.mysql.com/doc/mysql/en/connection-parameters.html
Avatar billede kjulius Novice
25. september 2005 - 14:32 #27
Som opfølgning på det med OPTION på connection string, så kan man også sætte denne option permanent på MyODBC driveren under Advanced tab, Flags1 tab, hvor der er et punkt, der hedder "Change BIGINT Columns to Int". At sætte et flag her skulle løse dit problem (sådan som jeg læser dokumentationen).
Desuden anbefaler siden http://mysqld.active-venture.com/MyODBC_clients.html, at man sætter et flag ud for "Return matching rows".
Avatar billede dbmanager Nybegynder
15. marts 2006 - 11:37 #28
Svar
Avatar billede kjulius Novice
16. marts 2006 - 00:37 #29
Mener du mig? :-)
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
Computerworld tilbyder specialiserede kurser i database-management

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