"Jeff Urlwin" <[EMAIL PROTECTED]> writes:

> > 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...

> > 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?
> 
> Try using $dbh->do() and see if that works, rather than prepare() and
> execute() separately.

Since the error occurs in the FETCH('NUM_OF_FIELDS') and I can't do a
FETCH('NUM_OF_FIELDS') if I don't have a statement handle. I don't
really understand what you are asking.

Over DBD::Proxy do() still fails.  But that's not news since the
DBD::Proxy do() is built out of prepare()/execute() and
DBI::ProxyServer still calls FETCH('NUM_OF_FIELDS') on the underlying
statement handle.

Anyhow as requested...

Running directly 

 DBI->trace(9);
 my $db = DBI->connect;
 $db->{RaiseError} = 1;
 $db->do('CREATE VIEW WIBBLE AS SELECT 1 AS WUBBLE');


    DBI 1.37-ithread dispatch trace level set to 9
    -> DBI->connect(, , ****)
    -> DBI->install_driver(ODBC) for MSWin32 perl=5.008 pid=1432 ruid=0 euid=0
       install_driver: DBD::ODBC version 1.05 loaded from C:/perl/site/lib/DBD/ODBC.pm
    New DBI::dr (for DBD::ODBC::dr, parent=, id=)
    dbih_setup_handle(DBI::dr=HASH(0x1edd170)=>DBI::dr=HASH(0x1f64db0), DBD::ODBC::dr, 
0, Null!)
    dbih_make_com(Null!, 0, DBD::ODBC::dr, 92, 0) thr#15d44d4
    dbih_setup_attrib(DBI::dr=HASH(0x1f64db0), Err, Null!) SCALAR(0x1e987c0) (already 
defined)
    dbih_setup_attrib(DBI::dr=HASH(0x1f64db0), State, Null!) SCALAR(0x1e98808) 
(already defined)
    dbih_setup_attrib(DBI::dr=HASH(0x1f64db0), Errstr, Null!) SCALAR(0x1e987e4) 
(already defined)
    dbih_setup_attrib(DBI::dr=HASH(0x1f64db0), TraceLevel, Null!) 0 (already defined)
    dbih_setup_attrib(DBI::dr=HASH(0x1f64db0), FetchHashKeyName, Null!) 'NAME' 
(already defined)
    <- install_driver= DBI::dr=HASH(0x1edd170)
    >> default_user DISPATCH (DBI::dr=HASH(0x1edd170) rc1/3 @4 g1 ima1 pid#1432) at 
C:/perl/site/lib/DBI.pm line 564 via L:\home\bam\tmp\foo.pl line 8
    -> default_user in DBD::_::dr for DBD::ODBC::dr (DBI::dr=HASH(0x1edd170)~0x1f64db0 
undef undef HASH(0x1ea9e48)) thr#15d44d4
    <- default_user= ( 'xxx' 'xxx' ) [2 items] at C:/perl/site/lib/DBI.pm line 564 via 
L:\home\bam\tmp\foo.pl line 8
    >> connect     DISPATCH (DBI::dr=HASH(0x1edd170) rc2/3 @5 g0 ima1 pid#1432) at 
C:/perl/site/lib/DBI.pm line 582
    -> connect for DBD::ODBC::dr (DBI::dr=HASH(0x1edd170)~0x1f64db0 'EQA' 'xxx' **** 
HASH(0x1f65104)) thr#15d44d4
    New DBI::db (for DBD::ODBC::db, parent=DBI::dr=HASH(0x1f64db0), id=)
    dbih_setup_handle(DBI::db=HASH(0x1f4fbf0)=>DBI::db=HASH(0x1f65158), DBD::ODBC::db, 
1ed9578, Null!)
    dbih_make_com(DBI::dr=HASH(0x1f64db0), 1f65ed4, DBD::ODBC::db, 220, 0) thr#15d44d4
    dbih_setup_attrib(DBI::db=HASH(0x1f65158), Err, DBI::dr=HASH(0x1f64db0)) 
SCALAR(0x1ee0a58) (already defined)
    dbih_setup_attrib(DBI::db=HASH(0x1f65158), State, DBI::dr=HASH(0x1f64db0)) 
SCALAR(0x1ee0ab8) (already defined)
    dbih_setup_attrib(DBI::db=HASH(0x1f65158), Errstr, DBI::dr=HASH(0x1f64db0)) 
SCALAR(0x1ee0a88) (already defined)
    dbih_setup_attrib(DBI::db=HASH(0x1f65158), TraceLevel, DBI::dr=HASH(0x1f64db0)) 0 
(already defined)
    dbih_setup_attrib(DBI::db=HASH(0x1f65158), FetchHashKeyName, 
DBI::dr=HASH(0x1f64db0)) 'NAME' (already defined)
    dbih_setup_attrib(DBI::db=HASH(0x1f65158), HandleError, DBI::dr=HASH(0x1f64db0)) 
undef (not defined)
    <- connect= DBI::db=HASH(0x1f4fbf0) at C:/perl/site/lib/DBI.pm line 582
    >> STORE       DISPATCH (DBI::db=HASH(0x1f65158) rc2/1 @3 g0 ima418 pid#1432) at 
C:/perl/site/lib/DBI.pm line 622
    -> STORE for DBD::ODBC::db (DBI::db=HASH(0x1f65158)~INNER 'PrintError' 1) 
thr#15d44d4
    STORE DBI::db=HASH(0x1f65158) 'PrintError' => 1
    <- STORE= 1 at C:/perl/site/lib/DBI.pm line 622
    >> STORE       DISPATCH (DBI::db=HASH(0x1f65158) rc2/1 @3 g0 ima418 pid#1432) at 
C:/perl/site/lib/DBI.pm line 622
    -> STORE for DBD::ODBC::db (DBI::db=HASH(0x1f65158)~INNER 'AutoCommit' 1) 
thr#15d44d4
    <- STORE= 1 at C:/perl/site/lib/DBI.pm line 622
    >> STORE       DISPATCH (DBI::db=HASH(0x1f65158) rc2/1 @3 g0 ima418 pid#1432) at 
C:/perl/site/lib/DBI.pm line 625
    -> STORE for DBD::ODBC::db (DBI::db=HASH(0x1f65158)~INNER 'Username' 'xxx') 
thr#15d44d4
    STORE DBI::db=HASH(0x1f65158) 'Username' => 'xxx'
    <- STORE= 1 at C:/perl/site/lib/DBI.pm line 625
    <- connect= DBI::db=HASH(0x1f4fbf0)
    >> STORE       DISPATCH (DBI::db=HASH(0x1f65158) rc2/1 @3 g0 ima418 pid#1432) at 
C:/perl/site/lib/DBI.pm line 639 via L:\home\bam\tmp\foo.pl line 8
    -> STORE for DBD::ODBC::db (DBI::db=HASH(0x1f65158)~INNER 'dbi_connect_closure' 
CODE(0x1f4fb3c)) thr#15d44d4
    STORE DBI::db=HASH(0x1f65158) 'dbi_connect_closure' => CODE(0x1f4fb3c)
    <- STORE= 1 at C:/perl/site/lib/DBI.pm line 639 via L:\home\bam\tmp\foo.pl line 8
    >> STORE       DISPATCH (DBI::db=HASH(0x1f65158) rc2/1 @3 g0 ima418 pid#1432) at 
L:\home\bam\tmp\foo.pl line 9
    -> STORE for DBD::ODBC::db (DBI::db=HASH(0x1f65158)~INNER 'RaiseError' 1) 
thr#15d44d4
    STORE DBI::db=HASH(0x1f65158) 'RaiseError' => 1
    <- STORE= 1 at L:\home\bam\tmp\foo.pl line 9
    >> do          DISPATCH (DBI::db=HASH(0x1f4fbf0) rc1/1 @2 g0 ima201 pid#1432) at 
L:\home\bam\tmp\foo.pl line 10
    -> do for DBD::ODBC::db (DBI::db=HASH(0x1f4fbf0)~0x1f65158 'CREATE VIEW WIBBLE AS 
SELECT 1 AS WUBBLE') thr#15d44d4
    <- do= -1 at L:\home\bam\tmp\foo.pl line 10
    >> DESTROY     DISPATCH (DBI::db=HASH(0x1f4fbf0) rc1/1 @1 g0 ima4 pid#1432)
    <> DESTROY ignored for outer handle DBI::db=HASH(0x1f4fbf0) (inner 
DBI::db=HASH(0x1f65158))
    >> DESTROY     DISPATCH (DBI::db=HASH(0x1f65158) rc1/1 @1 g0 ima4 pid#1432)
    -> DESTROY for DBD::ODBC::db (DBI::db=HASH(0x1f65158)~INNER) thr#15d44d4
    <- DESTROY= undef
    DESTROY (dbih_clearcom) (dbh 0x1f4fbf0 0x1f67604, com 0x1f67ad4, imp 
DBD::ODBC::db):
       FLAGS 0x391: COMSET Warn RaiseError PrintError AutoCommit 
       PARENT DBI::dr=HASH(0x1f64db0)
       KIDS 0 (0 Active)
       IMP_DATA undef
    dbih_clearcom 0x1f4fbf0 (com 0x1f67ad4, type 2) done.

    -- DBI::END
    >> disconnect_all DISPATCH (DBI::dr=HASH(0x1edd170) rc1/3 @1 g0 ima801 pid#1432) 
at C:/perl/site/lib/DBI.pm line 649 via L:\home\bam\tmp\foo.pl line 0
    -> disconnect_all for DBD::ODBC::dr (DBI::dr=HASH(0x1edd170)~0x1f64db0) thr#15d44d4
    <- disconnect_all= '' at C:/perl/site/lib/DBI.pm line 649 via 
L:\home\bam\tmp\foo.pl line 0
!   >> DESTROY     DISPATCH (DBI::dr=HASH(0x1f64db0) rc1/1 @1 g0 ima4 pid#1432) during 
global destruction
!   -> DESTROY for DBD::ODBC::dr (DBI::dr=HASH(0x1f64db0)~INNER) thr#15d44d4
!   <- DESTROY= (not implemented) during global destruction
    DESTROY (dbih_clearcom) (drh 0x1edd170 0x1f651ac, com 0x1f65ed4, imp 
DBD::ODBC::dr):
       FLAGS 0x215: COMSET Active Warn AutoCommit 
       PARENT undef
       KIDS 0 (0 Active)
       IMP_DATA undef
    dbih_clearcom 0x1edd170 (com 0x1f65ed4, type 1) done.

!   >> DESTROY     DISPATCH (DBI::dr=HASH(0x1edd170) rc1/1 @1 g0 ima4 pid#1432) during 
global destruction
!   <> DESTROY for DBI::dr=HASH(0x1edd170) ignored (inner handle gone)

------------------------------------------

So does this suggest that DBD::Proxy should implement do() directly
rather than build it out of prepare()/execute()?

Or should it make looking up NUM_OF_FIELDS a separate proxy
transaction as required rather than do it earlier?

I've got some changes to do in DBD::Proxy anyhow so perhaps I should
address this.

Reply via email to