[Delphi6] Invalid Variant Type Conversion

Pagina: 1
Acties:
  • 178 views sinds 30-01-2008
  • Reageer

  • André
  • Registratie: Maart 2002
  • Laatst online: 19-08 12:30

André

Analytics dude

Topicstarter
Ik ben op dit moment bezig met een bedrijfsadministratiesysteem en loop tegen het volgende probleem aan:

Als ik met TADOQuery een Recordset uit een Access db haal en de inhoud in een TEdit pleur geeft hij een foutmelding als de betreffende cel in de db leeg is. Dus ik doe:
Delphi:
1
Naam.Text := DatabaseQuery.Recordset.Fields.Item['Naam'].Value;

En krijg de volgende melding:
EVariantError: Invalid Variant Type Conversion
Hoe los ik dit op, waarom krijg ik deze fout? Ik wil het veld in de db gewoon leeg houden.

offtopic:
Ik hoef hier geen discussie waarom ik Access met Delphi gebruik. Dat is niet mijn keuze geweest.

  • Feyd-Rautha
  • Registratie: November 2001
  • Laatst online: 02-08-2025
Van welk type is het veld naam ? Is dit een string/varchar ?

Kan het niet zijn dat er een variabele van het type Variant of dergelijke weergegeven wordt en een variant in een tekstvak steken zal waarschijnlijk niet goed lukken.
Hoe los ik dit op, waarom krijg ik deze fout?
Daarvoor dienen de manuals en boeken enzo, maar niet GoT ;)

GoT is er ook om mee te helpen zoeken naar oplossingen hoor...

[ Voor 12% gewijzigd door whoami op 25-06-2003 14:51 ]

I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.


  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
offtopic:
Niemand begint toch over het waarom je Access gebruikt?


Kan je niet AsString gebruiken ipv 'Value'?

Anders zal je moeten checken of die Value NULL is of niet.

https://fgheysels.github.io/


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Zoals whoami al aangeeft dien je .AsString te gebruiken in plaats van een cast van de value. Nu probeert Delphi een value die Null is te casten naar een string, wat de door jou gegeven melding teruggeeft. Als je .AsString gebruikt, wordt dit intern geregeld. Dan wordt de value die Null was gewoon een lege string en ben je van die melding af.

PS ... waarom gebruik je eigenlijk Access in combinatie met Delphi? :+

Gebruik ik zelf ook regelmatig en daar is niks mis mee! Dus daar hoeven we het inderdaad niet over te hebben ;)

My personal website


  • André
  • Registratie: Maart 2002
  • Laatst online: 19-08 12:30

André

Analytics dude

Topicstarter
Feyd-Rautha schreef op 25 June 2003 @ 14:49:
Van welk type is het veld naam ? Is dit een string/varchar ?

Kan het niet zijn dat er een variabele van het type Variant of dergelijke weergegeven wordt en een variant in een tekstvak steken zal waarschijnlijk niet goed lukken.
In Access is het gewoon een type 'Tekst' van 50 karakters.
whoami schreef op 25 June 2003 @ 14:49:
offtopic:
Niemand begint toch over het waarom je Access gebruikt?
Ik zei het omdat ik wel verwacht had dat er toch iemand over zou beginnen ;)
Kan je niet AsString gebruiken ipv 'Value'?

Anders zal je moeten checken of die Value NULL is of niet.
Die NULL check gaat ik even proberen.
OZ-Gump schreef op 25 June 2003 @ 14:55:
Zoals whoami al aangeeft dien je .AsString te gebruiken in plaats van een cast van de value. Nu probeert Delphi een value die Null is te casten naar een string, wat de door jou gegeven melding teruggeeft. Als je .AsString gebruikt, wordt dit intern geregeld. Dan wordt de value die Null was gewoon een lege string en ben je van die melding af.
Oke AsString ga ik ook proberen. En inderdaad nu moet een NULL gecast worden naar een string, dat klinkt idd wel zo dat Delphi daar over gaat vallen 8)7
PS ... waarom gebruik je eigenlijk Access in combinatie met Delphi? :+

Gebruik ik zelf ook regelmatig en daar is niks mis mee! Dus daar hoeven we het inderdaad niet over te hebben ;)
:+ 8)7

[ Voor 35% gewijzigd door André op 25-06-2003 14:59 ]


  • pagani
  • Registratie: Januari 2002
  • Niet online
code:
1
2
3
4
5
if not DatabaseQuery.Recordset.Fields.Item['Naam'].Value = '' then  
{Kan zijn dat hier null moet staan, hangt af wat je definitie van leeg is (null of lege string)}
begin
       Naam.Text := DatabaseQuery.Recordset.Fields.Item['Naam'].Value;
end;

[ Voor 44% gewijzigd door pagani op 25-06-2003 14:59 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
Zoals OZ-Gump al zegt, zou je best eerst eens die AsString proberen. ;)

https://fgheysels.github.io/


  • André
  • Registratie: Maart 2002
  • Laatst online: 19-08 12:30

André

Analytics dude

Topicstarter
whoami schreef op 25 juni 2003 @ 14:58:
Zoals OZ-Gump al zegt, zou je best eerst eens die AsString proberen. ;)
En zoals jij ook al verteld had, _/-\o_ ;)

Goed ik heb een paar dingen geprobeerd. Die AsString oplossing werkt/lukt niet, hoe zou ik die moeten toepassen?

De if statement van johhnyv.nl werkt wel:
Delphi:
1
if not DatabaseQuery.Recordset.Fields.Item['Naam'].Value = '' then  

Deze werkt trouwens niet (dit had ik gisteren al geprobeerd want ik ben niet zo'n fan van not in if statements, dus had ik ook nog niet aan not gedacht).:
Delphi:
1
if DatabaseQuery.Recordset.Fields.Item['Naam'].Value <> '' then  

Zo werkt het wel altijd in VB.

[ Voor 57% gewijzigd door André op 25-06-2003 15:10 ]


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

De AsString gebruik je als volgt:
 
Delphi:
1
Naam.Text := DatabaseQuery.FieldByName('Naam').asString;


Dit moet eigenlijk werken, want hiermee heb ik dit probleem al vaak opgelost bij collega's.... O-)

[ Voor 15% gewijzigd door OZ-Gump op 25-06-2003 16:06 . Reden: domme copy-paste fout ]

My personal website


  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
Nouja, aangezien je gebruik maakt van ADO componenten, weet ik ook niet zo zeker of die AsString wel werkt. Bij de BDE components werkt het echter wel.

Waarom ben je geen fan van de not operator? Soms kan je niet anders dan hem gebruiken.

https://fgheysels.github.io/


  • André
  • Registratie: Maart 2002
  • Laatst online: 19-08 12:30

André

Analytics dude

Topicstarter
OZ-Gump schreef op 25 juni 2003 @ 15:43:
De AsString gebruik je als volgt:
 
Delphi:
1
Naam.Text := DatabaseQuery.Recordset.Fields.Item['Naam'].asString;


Dit moet eigenlijk werken, want hiermee heb ik dit probleem al vaak opgelost bij collega's.... O-)
Sorry, maar de foutmelding die ik dan krijg is:

Undeclared identifier: 'asString'

Dus dat werkt ook niet, ik heb de help functie er even op nageslagen en kan weinig vinden over asString.

Maar de oplossing had ik inmiddels al in de vorm van de if-statement van johhnyv.
whoami schreef op 25 June 2003 @ 15:49:
Nouja, aangezien je gebruik maakt van ADO componenten, weet ik ook niet zo zeker of die AsString wel werkt. Bij de BDE components werkt het echter wel.

Waarom ben je geen fan van de not operator? Soms kan je niet anders dan hem gebruiken.
Het blijkt dus dat het niet werkt met ADO.

En ik heb ergens een heel artikel gelezen over het gebruik van not in if statements, dat artikel ging trouwens over VB. En daar werd het heel duidelijk uitgelegd dat je in VB beter geen not kon gebruiken. Ik ben in VB ook al tegen een aantal 'dingen' aangelopen wat ik niet kon verklaren. En achteraf lag het aan de not in de if-statement. Die heb ik toen weggehaald en de = in <> veranderd. Deze oplossing werkt wel in VB maar niet in Delphi, dus het kan zijn dat not icm Delphi wel goed werkt. (vaag stuk maar ik hoop dat de bedoeling duidelijk is :) )

En waarom kun je soms niet anders dan hem te gebruiken?

PS. Dat artikel kan ik niet zo 123 terugvinden.

[ Voor 51% gewijzigd door André op 25-06-2003 15:57 ]


  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 22:10
Waarom gebruik je niet gewoon DatabaseQuery.FieldByName( 'Naam' ).AsString?? :?

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Eerlijk gezegd heb ik gewoon zijn code overgenomen en van .value .asString gemaakt.
|:(

just_a_gamer heeft helemaal gelijk!
Enne... het werkt OP ZEKER bij ADO componenten, als je de juiste manier van aanspreken gebruikt, en dat is die van just_a_gamer...

[ Voor 35% gewijzigd door OZ-Gump op 25-06-2003 16:04 ]

My personal website


  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
Delphi is dan ook VB niet.
Als je een goede compiler hebt, moet
code:
1
if not a = b then

toch naar dezelfde machinecode compilen als:
code:
1
if a <> b then

https://fgheysels.github.io/


  • André
  • Registratie: Maart 2002
  • Laatst online: 19-08 12:30

André

Analytics dude

Topicstarter
OZ-Gump schreef op 25 June 2003 @ 16:03:
Eerlijk gezegd heb ik gewoon zijn code overgenomen en van .value .asString gemaakt.
|:(

just_a_gamer heeft helemaal gelijk!
Enne... het werkt OP ZEKER bij ADO componenten, als je de juiste manier van aanspreken gebruikt, en dat is die van just_a_gamer...
just_a_gamer heeft idd gelijk, het werkt _/-\o_
Ik vind het alleen raar dat ik DatabaseQuery.Recordset.bla gebruik en just_a_gamer gewoon DatabaseQuery.bla
whoami schreef op 25 juni 2003 @ 16:07:
Delphi is dan ook VB niet.
Als je een goede compiler hebt, moet
code:
1
if not a = b then

toch naar dezelfde machinecode compilen als:
code:
1
if a <> b then
En toch heb ik eens gehad dat dat niet goed werkte. Dus dan had VB geen goede compiler in die tijd. Weet zo niet eens meer welke versie dat was.

Verwijderd

Moet het geen NILL zijn ipv NULL?

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
VB had slechts vanaf versie 6 geloof ik een compiler. In voorgaande versies werd de code ge-interpreteerd.

In Delphi moet je idd nil gebruiken als je op NULL wilt checken, maar dat doet hier niet echt terzake. :P

https://fgheysels.github.io/


  • André
  • Registratie: Maart 2002
  • Laatst online: 19-08 12:30

André

Analytics dude

Topicstarter
Verwijderd schreef op 25 juni 2003 @ 16:18:
Moet het geen NILL zijn ipv NULL?
NIL ;)

Verwijderd

THNX :X

  • André
  • Registratie: Maart 2002
  • Laatst online: 19-08 12:30

André

Analytics dude

Topicstarter
whoami schreef op 25 June 2003 @ 16:21:
VB had slechts vanaf versie 6 geloof ik een compiler. In voorgaande versies werd de code ge-interpreteerd.
In QuickBasic had je zelfs al een compiler? verklaar u nader...

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 07-07 11:51
whoami schreef op 25 June 2003 @ 16:21:
VB had slechts vanaf versie 6 geloof ik een compiler. In voorgaande versies werd de code ge-interpreteerd.

In Delphi moet je idd nil gebruiken als je op NULL wilt checken, maar dat doet hier niet echt terzake. :P
Wat te denken van de functie VarIsNull()?

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Of DatabaseQuery.FieldByName('Naam').IsNull

We adore chaos because we like to restore order - M.C. Escher


  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 22:10
of gewoon DatabaseQuery.FieldByName( 'Naam' ).IsNull Dan geeft ie True als het null is of anders False

[edit]LordLarry beats me ;)

[ Voor 19% gewijzigd door Just_a_Gamer op 25-06-2003 16:48 ]


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

André schreef op 25 June 2003 @ 16:17:
Ik vind het alleen raar dat ik DatabaseQuery.Recordset.bla gebruik en just_a_gamer gewoon DatabaseQuery.bla
Recordset is de echte ADO Recordset die je terugkrijgt. Je omzeilt daarmee Borland's TDataSet schil.

We adore chaos because we like to restore order - M.C. Escher


  • André
  • Registratie: Maart 2002
  • Laatst online: 19-08 12:30

André

Analytics dude

Topicstarter
LordLarry schreef op 25 June 2003 @ 16:49:
[...]


Recordset is de echte ADO Recordset die je terugkrijgt. Je omzeilt daarmee Borland's TDataSet schil.
Op die manier, dus geen van beide methodes is onjuist.

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 01:25

Tomatoman

Fulltime prutser

whoami schreef op 25 June 2003 @ 16:07:
Delphi is dan ook VB niet.
Als je een goede compiler hebt, moet
code:
1
if not a = b then

toch naar dezelfde machinecode compilen als:
code:
1
if a <> b then
Pas op:
Delphi:
1
if not a = b then
is hetzelfde als
Delphi:
1
if (not a) = b then
terwijl je waarschijnlijk
Delphi:
1
if not (a = b) then
bedoelt! not wordt altijd geëvalueerd vóór het =-teken.

Een goede grap mag vrienden kosten.


  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
Quickbasic is dan ook geen Visual Basic.

Ivm die Null en nil. Ik had het over het keyword nil.

https://fgheysels.github.io/

Pagina: 1