Martin, et.al.,

Getting back to this and still having difficulties... always get the
'Invalid cursor state' error message with many of the DBCC commands
executed thru the DBD::ODBC.

Here is a bit of code anyone could execute ( change server name )...
it's a simple small test... below is the code and below that the
output... nothing I do seems to work here.  I am executing on a Windows
server, using the most up-to-date DBI, DBD::ODBC, and MDAC...

Any help is appreciated.

Thanks,
Louise Mitchell

*************
CODE
*************
#!d:\apps\perl\bin\perl.exe

use DBI;
#  using latest version of DBI and MDAC and DBD::ODBC....
#

$dbh =  DBI->connect("dbi:ODBC:Driver={SQL
Server};Server=irmdm2;Trusted_Connection=yes;",'','',
            { PrintError => 0,
              RaiseError => 0,
              LongReadLen => 65536,
              odbc_async_exec => 0,
              odbc_err_handler => sub {
                                        my ($state, $msg) = @_;
                                        # Strip out all of the driver ID
stuff
                                        $msg =~ s/^(\[[\w\s]*\])+//;
                                        $err_text .= $msg."\n";
                                        return 0;
                                       }
            }
           );
           
           
$command = qq%begin 
dbcc traceon(3604) 
DBCC INDEXDEFRAG(pps,cost_sheet,ix_cost_sheet_u1) 
end%;

print "** command: \n$command\n";

 $sth = $dbh->prepare($command);
    die $DBI::errstr unless $sth;

$rc = $sth->execute();  #  This is the 'do it'.....
$rows = $sth->dump_results();
print "** return code: $rc \n";
print "** rows: $rows\n";
print "\nCOMMAND OUTPUT (from odbc_err_handler):\n$err_text\n";

$dbh->disconnect;
*************
OUTPUT
*************
** command: 
begin 
dbcc traceon(3604) 
DBCC INDEXDEFRAG(pps,cost_sheet,ix_cost_sheet_u1) 
end

0 rows (-1: (DBD: no select statement currently executing err=-1))
** return code:  
** rows: 0

COMMAND OUTPUT (from odbc_err_handler):
DBCC execution completed. If DBCC printed error messages, contact your
system administrator. Invalid cursor state


Tool completed successfully

-----Original Message-----
From: Martin J. Evans [mailto:[EMAIL PROTECTED] 
Sent: Saturday, December 13, 2003 2:01 AM
To: Mitchell, Louise M
Subject: RE: succint view of problem - getting results from DBCC
INDEXDEFRAG - DBD::ODBC


Mitchell,

OK, I get different results here.

I am not running the perl on Windows but on Linux through our ODBC-ODBC
Bridge to the MS SQL Server ODBC driver on Windows. My SQLNumResults
call does not fail but it does return 0 columns which makes DBD::ODBC
think there is no result-set - hence the "no select statement currently
executing".

The difference between our results is probably a difference in the MS
SQL Server ODBC driver - I'd suggest getting the latest MDAC - see other
postings on the list from Jeff Urlwin. However, this is not going to
make any difference to the final result since DBREINDEX does not appear
to be returning a result-set.

>From my OOB log (my comments start #):

SQLExecute(0x8268f78)
^put_bound_parameters(0x8268f78,0x824a960,1)
        Driver supports SQLNumParams : 1
        remote sql_num_params()=0 (return parameters=0)
-^put_bound_parameters()=SQL_SUCCESS (nparams <= 0) -SQLExecute(...)=1 #
SQLExecute returns SQL_SUCCESS_WITH_INFO which means there is an ODBC #
diagnostic to pick up
SQLGetDiagRec(3,0x8268f78,1,0xbffff278,0xbffff274,0xbffff280,512,0xbffff
270)
        0 records on client according to header
        record 1 NOT found on client
        Now looking for error record 1 on server -SQLGetDiagRec()=0
SQLGetDiagRec(3,0x8268f78,2,0xbffff278,0xbffff274,0xbffff280,512,0xbffff
270)
        0 records on client according to header
        record 2 NOT found on client
        Now looking for error record 2 on server -SQLGetDiagRec()=100 #
these diags appear to be: # sqlstate=01000 native=2528 "[NetConn:
0627bd50][Microsoft][ODBC SQL Server # Driver][SQL Server]DBCC execution
completed. If DBCC printed error messages, # contact your system
administrator."
SQLRowCount(0x8268f78,0x824b01c)
-SQLRowCount(RowCount=-1)=0
SQLNumResultCols(0x8268f78,0xbffff6de)
-SQLNumResultCols()=0 (value=0)
# SQLNumResultCols returns 0 columns in result-set - hence no result-set
SQLMoreResults(0x8268f78)
^oob_new_result_set(0x8268f78,0,1)
^retrieve_server_diags(3,0x8268f78,3,0xaf1780)
        1 diags found in server
 
^post_error(0x82690c8,8,1,0,(nil),0x824adc0,2528,0,0x40274227,0xbffff544
,0xbffff144)
        -^post_error()
-^retrieve_server_diags()
-^oobc_new_result_set()=0 (f=0x21)
-SQLMoreResults()=1
# SQLMoreResults returns SQL_SUCCESS_WITH_INFO
# so more diags to pick up
SQLGetDiagRec(3,0x8268f78,1,0xbffff128,0xbffff124,0xbffff130,512,0xbffff
120)
        1 records on client according to header
        Found error record 1 on client
-SQLGetDiagRec()=0
SQLGetDiagRec(3,0x8268f78,2,0xbffff128,0xbffff124,0xbffff130,512,0xbffff
120)
        1 records on client according to header
        record 2 NOT found on client
        Now looking for error record 1 on server -SQLGetDiagRec()=100 #
these diags appear to be the same as above - again.
SQLNumResultCols(0x8268f78,0xbffff6de)
-SQLNumResultCols()=0 (value=0)
# Again, no resulting columsn hence no result-set
SQLMoreResults(0x8268f78)
-SQLMoreResults()=100
# no more result-sets

So no result-sets were created by the reindex. The example on MS site
suggests you should see something like:

Index (ID = 1) is being rebuilt.

Perhaps you don't get these if the index does not need rebuilding.

I don't mind being quoted on dbi-users.

Martin
-- 
Martin J. Evans
Easysoft Ltd, UK
Development

On 13-Dec-2003 Martin J. Evans wrote:
> Mitchell,
> 
> Forget that, I've reproduced here.
> 
> Martin
> --
> Martin J. Evans
> Easysoft Ltd, UK
> Development
> 
> 
> On 13-Dec-2003 Martin J. Evans wrote:
>> Mitchell,
>> 
>> I don't see why SQLNumResultCols returns an invalid cursor state but
>> it may be something to do with the SQLExecDirect returning a 
>> SQL_SUCCESS_WITH_INFO. Is it
>> at all possible you could mail me your code and the info to allow me
to run
>> this against my SQL Server and I'll take a look.
>> 
>> I see from the MS site that:
>> 
>> DBCC DBREINDEX returns this result set (message) if the NO_INFOMSGS
>> option is
>> specified:
>> 
>> DBCC execution completed. If DBCC printed error messages, contact
>> your system administrator.
>> 
>> which is what you got without specifying WITH NO_INFOMSGS.
>> 
>> Martin
>> --
>> Martin J. Evans
>> Easysoft Ltd, UK
>> Development
>> 
>> On 12-Dec-2003 Mitchell, Louise M wrote:
>>> Martin,
>>> 
>>> I did as you suggested, but am not sure how to interpret the
>>> results... I've included it below... could you possibly take a 
>>> look... it seems to error about a SQLNumResultCols call....which is 
>>> confusing to me... this command (DBCC REINDEX) doesn't return a 
>>> result set...
>>> 
>>> L
>>> process_engine  9a0-81c       ENTER SQLAllocHandle 
>>>               SQLSMALLINT                  3 <SQL_HANDLE_STMT>
>>>               SQLHANDLE           01F32400
>>>               SQLHANDLE *         01BA0CA8
>>> 
>>> process_engine  9a0-81c       EXIT  SQLAllocHandle  with return code
0
>>> (SQL_SUCCESS)
>>>               SQLSMALLINT                  3 <SQL_HANDLE_STMT>
>>>               SQLHANDLE           01F32400
>>>               SQLHANDLE *         0x01BA0CA8 ( 0x01f32d10)
>>> 
>>> process_engine  9a0-81c       ENTER SQLPrepare 
>>>               HSTMT               01F32D10
>>>               UCHAR *             0x01BA59A4 [      82] "begin\
adbcc
>>> traceon(3604)\ aDBCC
>>> DBREINDEX('pps.dbo.cost_sheet',ix_cost_sheet_ui)\
>>> aend"
>>>               SDWORD                    82
>>> 
>>> process_engine  9a0-81c       EXIT  SQLPrepare  with return code 0
>>> (SQL_SUCCESS)
>>>               HSTMT               01F32D10
>>>               UCHAR *             0x01BA59A4 [      82] "begin\
adbcc
>>> traceon(3604)\ aDBCC
>>> DBREINDEX('pps.dbo.cost_sheet',ix_cost_sheet_ui)\
>>> aend"
>>>               SDWORD                    82
>>> 
>>> process_engine  9a0-81c       ENTER SQLFreeStmt 
>>>               HSTMT               01F32D10
>>>               UWORD                        3 <SQL_RESET_PARAMS>
>>> 
>>> process_engine  9a0-81c       EXIT  SQLFreeStmt  with return code 0
>>> (SQL_SUCCESS)
>>>               HSTMT               01F32D10
>>>               UWORD                        3 <SQL_RESET_PARAMS>
>>> 
>>> process_engine  9a0-81c       ENTER SQLExecute 
>>>               HSTMT               01F32D10
>>> 
>>> process_engine  9a0-81c       EXIT  SQLExecute  with return code 1
>>> (SQL_SUCCESS_WITH_INFO)
>>>               HSTMT               01F32D10
>>> 
>>>               DIAG [01000] [Microsoft][ODBC SQL Server Driver][SQL
>>> Server]DBCC execution completed. If DBCC printed error messages, 
>>> contact your system administrator. (2528)
>>> 
>>> process_engine  9a0-81c       ENTER SQLErrorW 
>>>               HENV                01F31788
>>>               HDBC                01F32400
>>>               HSTMT               01F32D10
>>>               WCHAR *             0x0140F924 (NYI) 
>>>               SDWORD *            0x0140FB68
>>>               WCHAR *             0x0140F524 
>>>               SWORD                      511 
>>>               SWORD *             0x0140FB8A
>>> 
>>> process_engine  9a0-81c       EXIT  SQLErrorW  with return code 0
>>> (SQL_SUCCESS)
>>>               HENV                01F31788
>>>               HDBC                01F32400
>>>               HSTMT               01F32D10
>>>               WCHAR *             0x0140F924 (NYI) 
>>>               SDWORD *            0x0140FB68 (2528)
>>>               WCHAR *             0x0140F524 [     139]
>>> "[Microsoft][ODBC SQL Server Driver][SQL Server]DBCC execution
>>> completed. If DBCC printed error messages, contact your system 
>>> administrator."
>>>               SWORD                      511 
>>>               SWORD *             0x0140FB8A (139)
>>> 
>>> process_engine  9a0-81c       ENTER SQLErrorW 
>>>               HENV                01F31788
>>>               HDBC                01F32400
>>>               HSTMT               01F32D10
>>>               WCHAR *             0x0140F924 (NYI) 
>>>               SDWORD *            0x0140FB68
>>>               WCHAR *             0x0140F524 
>>>               SWORD                      511 
>>>               SWORD *             0x0140FB8A
>>> 
>>> process_engine  9a0-81c       EXIT  SQLErrorW  with return code 100
>>> (SQL_NO_DATA_FOUND)
>>>               HENV                01F31788
>>>               HDBC                01F32400
>>>               HSTMT               01F32D10
>>>               WCHAR *             0x0140F924 (NYI) 
>>>               SDWORD *            0x0140FB68
>>>               WCHAR *             0x0140F524 
>>>               SWORD                      511 
>>>               SWORD *             0x0140FB8A
>>> 
>>> process_engine  9a0-81c       ENTER SQLErrorW 
>>>               HENV                01F31788
>>>               HDBC                01F32400
>>>               HSTMT               00000000
>>>               WCHAR *             0x0140F924 (NYI) 
>>>               SDWORD *            0x0140FB68
>>>               WCHAR *             0x0140F524 
>>>               SWORD                      511 
>>>               SWORD *             0x0140FB8A
>>> 
>>> process_engine  9a0-81c       EXIT  SQLErrorW  with return code 100
>>> (SQL_NO_DATA_FOUND)
>>>               HENV                01F31788
>>>               HDBC                01F32400
>>>               HSTMT               00000000
>>>               WCHAR *             0x0140F924 (NYI) 
>>>               SDWORD *            0x0140FB68
>>>               WCHAR *             0x0140F524 
>>>               SWORD                      511 
>>>               SWORD *             0x0140FB8A
>>> 
>>> process_engine  9a0-81c       ENTER SQLErrorW 
>>>               HENV                01F31788
>>>               HDBC                00000000
>>>               HSTMT               00000000
>>>               WCHAR *             0x0140F924 (NYI) 
>>>               SDWORD *            0x0140FB68
>>>               WCHAR *             0x0140F524 
>>>               SWORD                      511 
>>>               SWORD *             0x0140FB8A
>>> 
>>> process_engine  9a0-81c       EXIT  SQLErrorW  with return code 100
>>> (SQL_NO_DATA_FOUND)
>>>               HENV                01F31788
>>>               HDBC                00000000
>>>               HSTMT               00000000
>>>               WCHAR *             0x0140F924 (NYI) 
>>>               SDWORD *            0x0140FB68
>>>               WCHAR *             0x0140F524 
>>>               SWORD                      511 
>>>               SWORD *             0x0140FB8A
>>> 
>>> process_engine  9a0-81c       ENTER SQLRowCount 
>>>               HSTMT               01F32D10
>>>               SQLLEN *            0x01BA0CD0
>>> 
>>> process_engine  9a0-81c       EXIT  SQLRowCount  with return code 0
>>> (SQL_SUCCESS)
>>>               HSTMT               01F32D10
>>>               SQLLEN *            0x01BA0CD0 (-1)
>>> 
>>> process_engine  9a0-81c       ENTER SQLNumResultCols 
>>>               HSTMT               01F32D10
>>>               SWORD *             0x0140FBBA
>>> 
>>> process_engine  9a0-81c       EXIT  SQLNumResultCols  with return
code -1
>>> (SQL_ERROR)
>>>               HSTMT               01F32D10
>>>               SWORD *             0x0140FBBA
>>> 
>>>               DIAG [24000] [Microsoft][ODBC SQL Server
>>> Driver]Invalid cursor state (0)
>>> 
>>> process_engine  9a0-81c       ENTER SQLErrorW 
>>>               HENV                01F31788
>>>               HDBC                01F32400
>>>               HSTMT               01F32D10
>>>               WCHAR *             0x0140F7F0 (NYI) 
>>>               SDWORD *            0x0140FA34
>>>               WCHAR *             0x0140F3F0 
>>>               SWORD                      511 
>>>               SWORD *             0x0140FA56
>>> 
>>> process_engine  9a0-81c       EXIT  SQLErrorW  with return code 0
>>> (SQL_SUCCESS)
>>>               HENV                01F31788
>>>               HDBC                01F32400
>>>               HSTMT               01F32D10
>>>               WCHAR *             0x0140F7F0 (NYI) 
>>>               SDWORD *            0x0140FA34 (0)
>>>               WCHAR *             0x0140F3F0 [      55]
>>> "[Microsoft][ODBC SQL Server Driver]Invalid cursor state"
>>>               SWORD                      511 
>>>               SWORD *             0x0140FA56 (55)
>>> 
>>> process_engine  9a0-81c       ENTER SQLErrorW 
>>>               HENV                01F31788
>>>               HDBC                01F32400
>>>               HSTMT               01F32D10
>>>               WCHAR *             0x0140F7F0 (NYI) 
>>>               SDWORD *            0x0140FA34
>>>               WCHAR *             0x0140F3F0 
>>>               SWORD                      511 
>>>               SWORD *             0x0140FA56
>>> 
>>> process_engine  9a0-81c       EXIT  SQLErrorW  with return code 100
>>> (SQL_NO_DATA_FOUND)
>>>               HENV                01F31788
>>>               HDBC                01F32400
>>>               HSTMT               01F32D10
>>>               WCHAR *             0x0140F7F0 (NYI) 
>>>               SDWORD *            0x0140FA34
>>>               WCHAR *             0x0140F3F0 
>>>               SWORD                      511 
>>>               SWORD *             0x0140FA56
>>> 
>>> process_engine  9a0-81c       ENTER SQLErrorW 
>>>               HENV                01F31788
>>>               HDBC                01F32400
>>>               HSTMT               00000000
>>>               WCHAR *             0x0140F7F0 (NYI) 
>>>               SDWORD *            0x0140FA34
>>>               WCHAR *             0x0140F3F0 
>>>               SWORD                      511 
>>>               SWORD *             0x0140FA56
>>> 
>>> process_engine  9a0-81c       EXIT  SQLErrorW  with return code 100
>>> (SQL_NO_DATA_FOUND)
>>>               HENV                01F31788
>>>               HDBC                01F32400
>>>               HSTMT               00000000
>>>               WCHAR *             0x0140F7F0 (NYI) 
>>>               SDWORD *            0x0140FA34
>>>               WCHAR *             0x0140F3F0 
>>>               SWORD                      511 
>>>               SWORD *             0x0140FA56
>>> 
>>> process_engine  9a0-81c       ENTER SQLErrorW 
>>>               HENV                01F31788
>>>               HDBC                00000000
>>>               HSTMT               00000000
>>>               WCHAR *             0x0140F7F0 (NYI) 
>>>               SDWORD *            0x0140FA34
>>>               WCHAR *             0x0140F3F0 
>>>               SWORD                      511 
>>>               SWORD *             0x0140FA56
>>> 
>>> process_engine  9a0-81c       EXIT  SQLErrorW  with return code 100
>>> (SQL_NO_DATA_FOUND)
>>>               HENV                01F31788
>>>               HDBC                00000000
>>>               HSTMT               00000000
>>>               WCHAR *             0x0140F7F0 (NYI) 
>>>               SDWORD *            0x0140FA34
>>>               WCHAR *             0x0140F3F0 
>>>               SWORD                      511 
>>>               SWORD *             0x0140FA56
>>> 
>>> process_engine  9a0-81c       ENTER SQLFreeHandle 
>>>               SQLSMALLINT                  3 <SQL_HANDLE_STMT>
>>>               SQLHANDLE           01F32D10
>>> 
>>> process_engine  9a0-81c       EXIT  SQLFreeHandle  with return code
0
>>> (SQL_SUCCESS)
>>>               SQLSMALLINT                  3 <SQL_HANDLE_STMT>
>>>               SQLHANDLE           01F32D10
>>> 
>>> process_engine  9a0-81c       ENTER SQLAllocHandle 
>>>               SQLSMALLINT                  3 <SQL_HANDLE_STMT>
>>>               SQLHANDLE           01F31830
>>>               SQLHANDLE *         0140FAAC
>>> 
>>> process_engine  9a0-81c       EXIT  SQLAllocHandle  with return code
0
>>> (SQL_SUCCESS)
>>>               SQLSMALLINT                  3 <SQL_HANDLE_STMT>
>>>               SQLHANDLE           01F31830
>>>               SQLHANDLE *         0x0140FAAC ( 0x01f32d10)
>>> 
>>> -----Original Message-----
>>> From: Martin J. Evans [mailto:[EMAIL PROTECTED]
>>> Sent: Friday, December 12, 2003 12:58 AM
>>> To: [EMAIL PROTECTED]
>>> Subject: RE: succint view of problem - getting results from DBCC 
>>> INDEXDEFRAG - DBD::ODBC
>>> 
>>> 
>>> Mitchell,
>>> 
>>> Can you generate an ODBC trace to locate exactly how the invalid
>>> cursor state occurs. You can do this from the ODBC Administrator 
>>> trace tab.
>>> 
>>> Martin
>>> --
>>> Martin J. Evans
>>> Easysoft Ltd, UK
>>> Development
>>> 
>>> 
>>> On 12-Dec-2003 Mitchell, Louise M wrote:
>>>> All,
>>>> 
>>>> I've posted bits of this earlier, but here is the problem in a 
>>>> nutshell... the code below executes DBCC INDEXDEFRAG in a MS SQL 
>>>> Server... I did some research on the 'invalid cursor state' that 
>>>> you'll see below in the output... this command returns a result 
>>>> set, so I realized I needed to retrieve that separately...that did 
>>>> not solve the problem... so the bottom line is... how do I get the 
>>>> result set from this sort of command... and also get the message 
>>>> output ( that's working right now...)
>>>> 
>>>> Other commands, such as DBCC CHECKDB...don't return result sets, so
>>>> I
>>>> get all of the output handled in the odbc_err_handler...
>>>> 
>>>> Here's the basic code..... results are below...you can see that the

>>>> 'dump_results' method didn't have anything to work on...
>>>> 
>>>> Does anyone have any clues here?
>>>> 
>>>> Thanks,
>>>> LouiseM
>>>> 
>>>> *************************
>>>> code
>>>> ***********************
>>>>#!d:\apps\perl\bin\perl.exe
>>>> 
>>>> use DBI;
>>>> 
>>>> $dbh_actions =  DBI->connect
>>>>            ("dbi:ODBC:Driver={SQL 
>>>> Server};Server=irmdm2;Trusted_Connection=yes;",'','',
>>>>             { PrintError => 0,
>>>>               RaiseError => 0,
>>>>               LongReadLen => 65536,
>>>>               odbc_async_exec => 0,
>>>>               odbc_err_handler => sub {
>>>>                                         my ($state, $msg) = @_;
>>>>                                         # Strip out all of the 
>>>> driver
>>>> ID stuff
>>>>                                         $msg =~
s/^(\[[\w\s]*\])+//;
>>>>                                         $err_text .= $msg."\n";
>>>>                                         return 0;
>>>>                                        }
>>>>             }
>>>>            );
>>>>            
>>>>            
>>>> $command = 'begin dbcc traceon(3604) DBCC
>>>> INDEXDEFRAG(pps,cost_sheet,ix_cost_sheet_u1) end';
>>>> 
>>>>  $sth = $dbh_actions->prepare($command);
>>>>     die $DBI::errstr unless $sth;
>>>> 
>>>> $rc = $sth->execute();  #  This is the 'do it'.....
>>>> $rows = $sth->dump_results();
>>>> print "** rows: $rows\n";
>>>> print "\nCOMMAND OUTPUT:\n$err_text\n";
>>>> 
>>>> $dbh_actions->disconnect;
>>>> 
>>>> *************************
>>>> RESULTS
>>>> *************************
>>>> 
>>>> 0 rows (-1: (DBD: no select statement currently executing err=-1))
>>>> ** rows: 0
>>>> 
>>>> COMMAND OUTPUT:
>>>> DBCC execution completed. If DBCC printed error messages, contact
>>>> your
>>> 
>>>> system administrator. Invalid cursor state

Reply via email to