[PHP + ADO] AffectedRows?

Pagina: 1
Acties:

  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
Hoi,

Ik ben bezig om een soort van wrapper class te maken om via ADO een connectie te maken met een database (in dit geval Access). Nu werkt alles prima, maar ik wil ook een mogelijkheid bieden de Affected Rows weer te geven na een update, insert, delete (nog meer?) statement. Ik gebruik hiervoor de Execute functie van het ADO Connection object, deze heeft de volgende syntax:
code:
1
Set objrs=objconn.Execute(commandtext,ra,options)

Dat is in dit geval ASP, maar het idee blijft het zelfde. Nu heb ik dus in PHP het volgende:
code:
1
$this->QueryResult = $this->Link->Execute( $inQuery, &$this->AffectedRows);

Hier is QueryResult mijn resultset, Link het ADO Connection object, inQuery de query zelf en AffectedRows spreekt voor zich neem ik aan.
Maar na het uitvoeren van bijvoorbeeld een update of een insert statement, bevat AffectedRows niet de gewenste waarde maar de waarde die bij het maken van het object was gegeven (in mijn geval 0).
Ik heb het zonder reference geprobeerd, met reference, een lokale variabele... er gebeurd niks mee :( Ik hoopte dat iemand hier wellicht een idee had?

-Edit-
Ik heb nog verder gezocht op Google en op een of andere site werd gesteld dat ik een VARIANT object mee most geven. Dat heb ik nu dus:
code:
1
2
3
$Vrows = new VARIANT( 0, VT_I4|VT_BYREF);
$this->QueryResult = $this->Link->Execute( $inQuery, $Vrows);
$this->AffectedRows = $Vrows->value;

MAAR, daar krijg ik dus als AffectedRows de waarde 7779424 waar ik eigenlijk 2 verwachtte :'(
Kortom, dat werkt ook niet.. tenzij ik het weer fout doe

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


Verwijderd

Wellicht heeft het iets te maken met het feit dat je VT_BYREF hebt gekozen, waar dat volgens mij niet zo zou zijn. Je moet een variabele meegeven, die vervolgens door ADO wordt aangepast, en niet andersom.

Anders ligt het misschien aan je variant type, waar jij VT_I4 hebt gekozen, maar waarvan ik ook niet weet wat wel een toepasselijk type zou zijn, want dit is erg slecht gedocumenteerd.

De waarde '7779424' ziet er uit als een COM error, maar ik zou zo snel niet weten hoe je die waarde kunt converteren in een waarde waar je niets aan hebt. Eventueel kun je in de Errors collectie van je Connection object kijken of daar een Error object is, en wat de Description property daarvan zegt.

HTH :)

  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
Op dinsdag 09 juli 2002 04:02 schreef MrX het volgende:
Wellicht heeft het iets te maken met het feit dat je VT_BYREF hebt gekozen, waar dat volgens mij niet zo zou zijn. Je moet een variabele meegeven, die vervolgens door ADO wordt aangepast, en niet andersom.

Anders ligt het misschien aan je variant type, waar jij VT_I4 hebt gekozen, maar waarvan ik ook niet weet wat wel een toepasselijk type zou zijn, want dit is erg slecht gedocumenteerd.

De waarde '7779424' ziet er uit als een COM error, maar ik zou zo snel niet weten hoe je die waarde kunt converteren in een waarde waar je niets aan hebt. Eventueel kun je in de Errors collectie van je Connection object kijken of daar een Error object is, en wat de Description property daarvan zegt.

HTH :)
Dat VT_BYREF zou juist moeten aangeven dat het variant type aangepast kan worden by reference. Tenminste, dat had ik begrepen ;)
Ik ga inderdaad maar eens flink op errors checken, wel vreemd dat de queries verder goed worden uitgevoerd... daarom had ik niet direct op errors gerekent. Maar ik ga dat doen zodra ik thuis ben weer, alvast bedankt :)

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


Verwijderd

Op dinsdag 09 juli 2002 07:40 schreef _Mo_ het volgende:

[..]

Dat VT_BYREF zou juist moeten aangeven dat het variant type aangepast kan worden by reference. Tenminste, dat had ik begrepen ;)
Ja, ik zat later ook nog te twijfelen of ik het nou verkeerd begrepen had, en of je zonder VT_BYREF nou alleen een waarde krijgt, dus geen variabele. Het blijft vaag en slecht gedocumenteerd, vind ik.

  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
Als het een COM error is, dan kan ik 'm in ieder geval niet op Google vinden :(
Zou het wellicht aan de driver kunnen liggen? Ik gebruik de standaard "Microsoft Access Driver (*.mdb)", ik weet eigenlijk niet goed meer wat te proberen. Volgens mij is het ook de enige manier hoe ik de affected records kan verkrijgen...

-Edit-
Ik heb gekeken of er errors waren, maar die zijn er volgens het object niet. Die waarde '7779424' komt er trouwens standaard uit, ook bij select statements.

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


Verwijderd

Ja, ik had ook al gezocht. Ik denk dat het een probleem met de notatie is van het foutnummer. Wellicht is de Long representatie niet degene die ze op het MS platform voor fouten gebruiken, maar ook hier kon ik niets over vinden.

Het zou inderdaad aan de ODBC driver danwel OLEDB provider kunnen liggen, dat die niet de property RecordsAffected vult en een fout geeft, maar dat lijkt me sterk. Het lijkt mij waarschijnlijker dat er nog een probleem zit in het meegeven van de referentie naar de Variant variabele.

Het beste lijkt me dat je een post maakt op de PHP buglist, want als dit geen bug is, dan is het volgens mij iets zo obscuurs dat alleen de developers van de COM ondersteuning in PHP het zullen weten.

Succes, en sorry dat ik je niet verder kan helpen. Als je een oplossing hebt, laat het zeker weten, want ik ben benieuwd.

  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
Ieder geval bedankt voor je hulp :) Ik heb het bij de PHP buglist gesubmit, zal het hier wel even laten weten als daar nog wat nuttigs uit komt.

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
Op woensdag 10 juli 2002 00:35 schreef MrX het volgende:
Succes, en sorry dat ik je niet verder kan helpen. Als je een oplossing hebt, laat het zeker weten, want ik ben benieuwd.
Ik heb eindelijk een reactie gekregen van de makers van PHP (duurde even ;)).
Het bleek dat ik het als volgt moest doen:
code:
1
2
    $VRows = new VARIANT();
    $this->QueryResult = @$this->Link->Execute( $inQuery, &$Vrows);

In plaats van de eerder geposte code. Het vreemde is echter, dat ik nergens op het web deze oplossing heb kunnen vinden, alleen de manieren zoals ik het dus al eerder probeerde. Ik heb nog gevraagd of het misschien is vanwege nieuwere versie, maar het werkt nu prima :)

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs

Pagina: 1