[VB6] ADOBD - Code doet het maar 1 keer *

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Chip.
  • Registratie: Mei 2006
  • Niet online
Ik zit hier met een probleem waar ikzelf helaas niet uitkom. Het betreft zich hier over het volgende stukje code vb code...
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
    With Cmd
        .CommandText = "SELECT `t`.*, DATE_FORMAT(`t`.`tra_editdate`, '%Y.%m.%d') AS `tra_editdate` " & _
                       "FROM `translation` AS `t` " & _
                       "WHERE `t`.`tra_id` = ? " & _
                       "LIMIT 1;"
                      
        .Parameters.Append Cmd.CreateParameter("tra_id", adBigInt, adParamInput, 20)
        .Parameters("tra_id").Value = iTraId
    End With

    Set fetchTraById = Cmd.Execute


Deze code doet het inprincipe prima echter hij doet het maar 1 keer. Als de code voor een tweede keer wordt uitgevoerd krijg ik de volgende error:
PRB: "Multiple-step OLE DB operation generated errors" when opening ADO connection
Run-time error '-2147217887 (80040e21):'
Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done.
Ik heb vervolgens gedaan wat als oplossing stond op de msdn website. Echter beide oplossingen waren niet voor mij van toepassing.
Nu had ik dus gelezen dat je bij ADODB moet oppassen met de parameters van prepared statements als ze langer zijn dan dat je opgeeft of wanneer ze null zijn. Echter zijn beide van deze twee dingen waar ik denk dat het fout kan gaan niet van toepassing hier lijkt mij als ik naar de error kijk.

Iemand een idee?

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 09:53
Probeer je een connectie te openen, die al open is ofzo ?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Nu had ik dus gelezen dat je bij ADODB moet oppassen met de parameters van prepared statements als ze langer zijn dan dat je opgeeft of wanneer ze null zijn. Echter zijn beide van deze twee dingen waar ik denk dat het fout kan gaan niet van toepassing hier lijkt mij
Gooi ze eens in een messagebox dan, of zet er een watch op, of gebruik Debug.Print. Assumption...

En op welke regel krijg je de fout? En sluit je je resultset wel af voor je 'm opnieuw probeert te vullen?

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
.

[onzin]

[ Voor 182% gewijzigd door P_de_B op 06-01-2009 11:28 ]

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


Acties:
  • 0 Henk 'm!

  • Chip.
  • Registratie: Mei 2006
  • Niet online
whoami schreef op dinsdag 06 januari 2009 @ 11:14:
Probeer je een connectie te openen, die al open is ofzo ?
Connectie is al open ;) want daarna kan ik gewoon wel nog andere queries uitvoeren alleen deze niet :?
Verder gebeurt de fout in de laatste regel. Ik heb ook al watch erop gezet, inmiddels ook maar Msgbox, en alle invoer klopt gewoon...

Acties:
  • 0 Henk 'm!

  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 24-09 19:29

hamsteg

Species 5618

Wat gebeurt er als je de connectie expliciet opent en sluit ?

... gecensureerd ...


Acties:
  • 0 Henk 'm!

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 24-09 16:52
Ik heb gemerkt dat multi step oledb errors meestal voorkomen als de types niet overeen komen. Je zou het beste even kunnen controleren of je tra_id veld wel echt een bigint is en geen normale integer.

Verder geef je volgens mij de parameter voor tra_id niet goed op. Je heb nu dit:

Visual Basic:
1
2
.Parameters.Append Cmd.CreateParameter("tra_id", adBigInt, adParamInput, 20)
.Parameters("tra_id").Value = iTraId 


Met die 20 geef je volgens mij de lengte op. De lengte is vziw alleen van belang bij strings ed. Bij een integer zou je daar niets op hoeven geven. Probeer deze code eens:

Visual Basic:
1
.Parameters.Append Cmd.CreateParameter("tra_id", adBigInt, adParamInput, , 20) 


Hmm, is dit trouwens VB6/VBA code of is dit voor VB.net??

[ Voor 7% gewijzigd door urk_forever op 06-01-2009 11:45 ]

Hail to the king baby!


Acties:
  • 0 Henk 'm!

  • Chip.
  • Registratie: Mei 2006
  • Niet online
hamsteg schreef op dinsdag 06 januari 2009 @ 11:32:
Wat gebeurt er als je de connectie expliciet opent en sluit ?
Visueel niets. Maar de error is dan wel weg ja. Totdat ik de code weer voor de tweede keer uitvoer.
urk_forever schreef op dinsdag 06 januari 2009 @ 11:43:
Ik heb gemerkt dat multi step oledb errors meestal voorkomen als de types niet overeen komen. Je zou het beste even kunnen controleren of je tra_id veld wel echt een bigint is en geen normale integer.

Verder geef je volgens mij de parameter voor tra_id niet goed op. Je heb nu dit:

Visual Basic:
1
2
.Parameters.Append Cmd.CreateParameter("tra_id", adBigInt, adParamInput, 20)
.Parameters("tra_id").Value = iTraId 


Met die 20 geef je volgens mij de lengte op. De lengte is vziw alleen van belang bij strings ed. Bij een integer zou je daar niets op hoeven geven. Probeer deze code eens:

Visual Basic:
1
.Parameters.Append Cmd.CreateParameter("tra_id", adBigInt, adParamInput, , 20) 


Hmm, is dit trouwens VB6/VBA code of is dit voor VB.net??
Het is echt een biginteger ;) en de parameter die jij nu invult is de value (daarzou ik inprincipe dus ook iTraId kunnen invullen bij mijn weten) die daarvoor is de lengte.

Maar inmiddels heb ik wel de fout gevonden, weet niet of dit normaal is maar dit wist ikzelf niet. De fout is dat hij die parameter die ik toevoeg onthoud. Waarna ik vervolgens de code nog een keer uitvoer voegt hij nog een parameter toe en heb ik er dus twee. Terwijl ik natuurlijk maar plaats heb voor 1.

Ik ging er vanuit dat na het uitvoeren van Cmd.Execute dat hij die dan ' vergeet' maar dat doet hij dus niet :? ik zou die dus na iedere keer weer moeten delete? Dat moet toch eenvoudiger kunnen.

-edit- en het is VB6 code.

Acties:
  • 0 Henk 'm!

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 24-09 16:52
Als je het command object niet opruimt vergeet hij niets. Je zou Cmd.Close (oid) aan kunnen roepen en

Visual Basic:
1
2
Cmd.Close()
set Cmd = nothing
kunnen doen.

Hail to the king baby!

Pagina: 1