On 15/08/2012 18:41, Tim Bunce wrote:
On Wed, Aug 15, 2012 at 06:02:35PM +0100, Charles Jardine wrote:
$obj is not a string. It is an object of a class which has a
stringify operator. "$obj" is a string, because "..." stringifies.
It is not at all clear how the DBI should take a copy of an object.
Without any method attributes in the bind_param call the driver is free
to 'do something reasonable' which typically means treat the value as a
string (or a number if it knows the field is numric).
I think this is a case of user error.
It would be reasonable for a driver to complain if passed an object that
doesn't have string/numeric overloading, but this one does.
All points taken so thanks for that but in this case although the object
does have a stringification overload as far as I can see it was not used
i.e., it was bind_param(1, $obj) not bind_param(1, "$obj") as I received
the code. If you use the latter, DBD::ODBC works but the point I'm still
uncertain about is that IF DBD::ODBC has not made a copy of the the
scalar passed to bind_param then how is it working. I will look further
but as far as I can see DBD::ODBC is simply looking at the pv on the
passed scalar and passing that pointer to SQLBindParameter and by the
time SQLExecute is called Perl may have removed the now unreferenced
scalar passed to bind_param. Having said that, I must surely be wrong on
how DBD::ODBC does this or my other example which deliberately passes a
scalar which a) is changed after the bind_param call and b) goes out of
scope before the execute call and yet inserts the value in the scalar
passed to bind_param at the time bind_param is called (that is why I
added that example).
Hopefully, this explains why this confused me a little. I did not write
the original bind_param code and need to work my way through it.
Martin