Thread: Strange Update query ...

Strange Update query ...

From
Thomas Chabaud
Date:
Hello,
I have a problem with update on recordset with Visual Basic 6.

I'm using the recordset as following :

   Set rs = New ADODB.Recordset
   rs.Open "SELECT id,myfield1,myfield2,myfield3 from mytable where
id=6",dbConn, adOpenKeyset, adLockOptimistic, adCmdText

   rs("myfield1").value = myvalue1
   rs("myfield2").value = myvalue2
   rs("myfield3").value = myvalue3
   rs.Update
   rs.close
   set rs=Nothing

But the line is not updated, so I checked the log, and I saw that the query
which was generated by odbc driver is :

UPDATE mytable SET myfield1=myvalue1,myfield2=myvalue2,myfield3=myvalue3
WHERE (id=6 AND myfield1=myvalue1 AND myfield2=myvalue2 AND myfield3=myvalue3 )'

I wonder why the odbc driver add those "AND ..." statement, because I think
they are useless, and they fail my rs.update

I use the following connection parameters :

DRIVER={PostgreSQL
ANSI};DATABASE=mydb;SERVER=localhost;PORT=5432;SSLMODE=prefer;UID=postgres;PWD=XXXXXXXXX;
ReadOnly=0;FakeOidIndex=0;ShowOidColumn=1;RowVersioning=1;ShowSystemTables=0;ConnSettings=;
Fetch=10000;Socket=4096;UnknownSizes=0;MaxVarcharSize=254;MaxLongVarcharSize=32767;
Debug=0;CommLog=1;Optimizer=1;Ksqo=0;UseDeclareFetch=0;TextAsLongVarchar=1;
UnknownsAsLongVarchar=1;BoolsAsChar=0;Parse=0;CancelAsFreeStmt=0;ExtraSysTablePrefixes=dd_;
LFConversion=1;UpdatableCursors=0;DisallowPremature=0;TrueIsMinus1=1;BI=0;ByteaAsLongVarBinary=0;
UseServerSidePrepare=0;LowerCaseIdentifier=0


Thanks in advance for your answers.

Regards,

Thomas

Re: Strange Update query ...

From
Hiroshi Inoue
Date:
Thomas Chabaud wrote:
> Hello,
> I have a problem with update on recordset with Visual Basic 6.
>
> I'm using the recordset as following :
>
>   Set rs = New ADODB.Recordset
>   rs.Open "SELECT id,myfield1,myfield2,myfield3 from mytable where
> id=6",dbConn, adOpenKeyset, adLockOptimistic, adCmdText
>
>   rs("myfield1").value = myvalue1
>   rs("myfield2").value = myvalue2
>   rs("myfield3").value = myvalue3
>   rs.Update
>   rs.close
>   set rs=Nothing
>
> But the line is not updated, so I checked the log, and I saw that the
> query which was generated by odbc driver is :
>
> UPDATE mytable SET myfield1=myvalue1,myfield2=myvalue2,myfield3=myvalue3
> WHERE (id=6 AND myfield1=myvalue1 AND myfield2=myvalue2 AND
> myfield3=myvalue3 )'

Are they really myvalue..s not oldvalue..s after the "AND .." ?

> I wonder why the odbc driver add those "AND ..." statement, because I
> think they are useless, and they fail my rs.update

AFAIK the ODBC driver doesn't add them. Maybe ado does it.

regards,
Hiroshi Inoue

Re: Strange Update query ...

From
Hélder M. Vieira
Date:
I tried to replicate the situation you describe, without success.
I guess ADO for some reason is trying to build an SQL statement
corresponding to a parameter query.
I'd bet on a ADO misinterpretation of your intention caused by the myvalue1,
myvalue2 and myvalue3 data types.
Could you post the DIM statements of those variables ?


Helder M. Vieira




>   Set rs = New ADODB.Recordset
>   rs.Open "SELECT id,myfield1,myfield2,myfield3 from mytable where
> id=6",dbConn, adOpenKeyset, adLockOptimistic, adCmdText
>
>   rs("myfield1").value = myvalue1
>   rs("myfield2").value = myvalue2
>   rs("myfield3").value = myvalue3
>   rs.Update
>   rs.close
>   set rs=Nothing
>
...
>
> UPDATE mytable SET myfield1=myvalue1,myfield2=myvalue2,myfield3=myvalue3
> WHERE (id=6 AND myfield1=myvalue1 AND myfield2=myvalue2 AND
> myfield3=myvalue3 )'



Re: Strange Update query ...

From
Hiroshi Inoue
Date:
Hélder M. Vieira wrote:

> I tried to replicate the situation you describe, without success.
> I guess ADO for some reason is trying to build an SQL statement
> corresponding to a parameter query.
> I'd bet on a ADO misinterpretation of your intention caused by the
> myvalue1, myvalue2 and myvalue3 data types.
> Could you post the DIM statements of those variables ?


Isn't myfieldx timestamp or float type ?
If I remember correctly, ADO builds the SQL statement
  UPDATE mytable SET
myfield1=myvalue1,myfield2=myvalue2,myfield3=myvalue3 WHERE (id=6 AND
     myfield1=current_value1 AND myfield2=current_value2 AND
myfield3=current_value3 )'

The clauses after the "AND" are for optimistic concurrency control by
vaues but
the clause could be false if it contains timestamp or float field,

regards,
Hiroshi Inoue

Re: Strange Update query ...

From
Hélder M. Vieira
Date:
Hiroshi, I made several tests, and the log always shows an UPDATE statement
filled with constant values, such as:

'UPDATE mytable SET myfield1=4,myfield2=5,myfield3=6
WHERE (id=6 AND myfield1=1 AND myfield2=2 AND myfield3=3 )'

I tried with several data types, with and without explicit declaration of
the 'myvaluex' variables, and never saw variable names in the generated
UPDATE statement.

Thomas Chabaud's log shows:

'UPDATE mytable SET myfield1=myvalue1,myfield2=myvalue2,myfield3=myvalue3
WHERE (id=6 AND myfield1=myvalue1 AND myfield2=myvalue2 AND
myfield3=myvalue3 )'

I can't figure out how variable names could appear in the UPDATE statement,
so I think Thomas Chabaud should provide some information about the nature
of those variables.


Hélder M. Vieira



Re: Strange Update query ...

From
Thomas Chabaud
Date:
Hélder M. Vieira a écrit :
> I tried to replicate the situation you describe, without success.
> I guess ADO for some reason is trying to build an SQL statement
> corresponding to a parameter query.
> I'd bet on a ADO misinterpretation of your intention caused by the
> myvalue1, myvalue2 and myvalue3 data types.
> Could you post the DIM statements of those variables ?
>
>
> Helder M. Vieira
>
>
>
>

I have find the bug, it was an error in the code, there was a
function before my code which changed the values, and the values I supposed
to be new values in the update statement were in fact the old values ...

Sorry for the waste of time, and thanks a lot for your explanations.

Regards,

Thomas