I recently upgrading a Win32/Activestate system to ActiveState
build 806 with DBD::ODBC 1.05 and DBI 1.37. I find that I now get
errors of the following type when I try to create a view over
DBD::Proxy from my Linux box.
DBD::Proxy::db do failed: Server returned error: Failed to execute method CallMethod:
Describe failed during DBI::ProxyServer::st=HASH(0x1f00888)->FETCH(NUM_OF_FIELDS)
at R:/Perl/site/lib/DBI/ProxyServer.pm line 287.
It would appear that NUM_OF_FIELDS fetched after the execute() for a
CREATE VIEW statement crashes out. I am able to reproduce this with a
simple script running on the Win32 box...
use strict;
use warnings;
use DBI;
DBI->trace(11);
my $db = DBI->connect;
$db->{RaiseError} = 1;
my $sth = $db->prepare('CREATE VIEW WIBBLE AS SELECT 1 AS WUBBLE');
$sth->execute();
print $sth->{NUM_OF_FIELDS};
__END__
Looking at the relevant part of the trace output...
>> FETCH DISPATCH (DBI::st=HASH(0x1bd9138) rc2/1 @2 g0 ima404 pid#1412) at
L:\home\bam\tmp\foo.pl line 10
-> FETCH for DBD::ODBC::st (DBI::st=HASH(0x1bd9138)~INNER 'NUM_OF_FIELDS')
thr#15d44d4
Describe failed during DBI::st=HASH(0x1bd9138)->FETCH(NUM_OF_FIELDS) at
L:\home\bam\tmp\foo.pl line 10.
>> DESTROY DISPATCH (DBI::st=HASH(0x1bd918c) rc1/1 @1 g0 ima4 pid#1412)
<> DESTROY ignored for outer handle DBI::st=HASH(0x1bd918c) (inner
DBI::st=HASH(0x1bd9138))
>> DESTROY DISPATCH (DBI::db=HASH(0x1bd7278) rc1/1 @1 g0 ima4 pid#1412)
<> DESTROY ignored for outer handle DBI::db=HASH(0x1bd7278) (inner
DBI::db=HASH(0x1bd9108))
>> DESTROY DISPATCH (DBI::st=HASH(0x1bd9138) rc1/1 @1 g0 ima4 pid#1412)
-> DESTROY for DBD::ODBC::st (DBI::st=HASH(0x1bd9138)~INNER) thr#15d44d4
error: -1 '[Microsoft][ODBC SQL Server Driver][SQL Server]'CREATE VIEW' must be
the first statement in a query batch. (SQL-42000)(DBD: dbd_describe/SQLNumResultCols
err=-1)'
<- DESTROY= undef
So it would appear that the mechanism used to calculate NUM_OF_FIELDS
in DBD::ODBC is flawed.
Actually, it looks like this could be a problem with the
inplementation of SQLNumResultCols is the ODBC driver for MSSQL rather
than DBD::ODBC.
Looking at the MSSQL profiler trace I see that the ODBC driver appears
to be doing..
SET FMTONLY ON CREATE VIEW WIBBLE AS SELECT 1 AS WUBBLE SET FMTONLY OFF
Sure enough, if I try to issue this command via the MSSQL query
analyser I get the error..
'CREATE VIEW' must be the first statement in a query batch.
I first observed this versions 2000.80.528.00 and 2000.80.194.00 of the driver.
I've now downloaded MSSSQL 2K SP3 and that's upgraded the MSSQL ODBC
driver to version 2000.81.9031.38 but that's not made any difference.
Help! Is this a problem in DBI, DBD::ODBC, ODBC, or the MSSQL ODBC
driver? Anyone got a work-round other than simply ignoring the error?
--
\\ ( )
. _\\__[oo
.__/ \\ /\@
. l___\\
# ll l\\
###LL LL\\