pr wrote:
> 
> --- On Thu, 2/18/10, Martin Evans <[email protected]> wrote:
> 
>> From: Martin Evans <[email protected]>
>> Subject: Re: Error during SQL Server restore fails to propagate back to DBI 
>> client on Windows
>> To: "pr" <[email protected]>
>> Cc: [email protected]
>> Date: Thursday, February 18, 2010, 8:51 AM
>> pr wrote:
>>> Overview:
>>>
>>> Using perl+DBI+DBD::ODBC on Windows, I am connecting
>> to a SQL Server 2005 instance and issuing a "restore
>> database [foo] from disk='c:\foo-backup.bak'".
>>> The restore attempt appears to succeed, and nothing
>> calls my installed error handler.
>>> However, if I run a trace on the SQL Server, I can see
>> the restore is throwing an error:
>>> Error 3224, Severity 16, State 1: Cannot create worker
>> thread.
>>> RESTORE DATABASE is terminating abnormally.
>>>
>>> If I write the same SQL to a file, then execute the
>> file via sqlcmd, the restore works as expected.  Hence
>> I am confident in the SQL command as well as the backup
>> file.
>>> Other DML-type commands work as advertised, as does
>> the error handler.  It seems to be something
>> specifically about a restore.
>>>
>>> Specifics:
>>>
>>> The version of perl is ActiveState's v5.10.0 running
>> on a 32 bit Windows 2003 server.
>>> My DSN and connect code looks like:
>>>
>>> my $dsn = 'Driver={SQL Native
>> Client};Server=myServer;Database=master;Trusted_Connection=yes;Encrypt=yes;';
>>> my $dbh = DBI->connect("dbi:ODBC:$dsn",'','', {
>> RaiseError => 1, AutoCommit => 1 } );
>>> $dbh->{HandleError} = \&error_handler;
>>>
>>> My error handler looks like:
>>>
>>> sub error_handler {
>>>      my @err = @_;
>>>
>>>      print "Error handler
>> triggered!\n";
>>>      return 0;
>>> }
>>>
>>> I have tried:
>>> - $dbh->do ( $restore_command )
>>> - $sth = $dbh->prepare( $restore_command );
>> $sth->execute(); ...
>>> I've tried with and without
>> $dbh->{odbc_exec_direct} = 1 and also not specifying it.
>>> The MDAC version on the machine is recent: version
>> 2.82.3959.0.
>>> The version of DBI is 1.604.
>>>
>>> I have tried running a DBI trace at up to level 15,
>> and there doesn't seem to be anything of interest.  
>>>
>>>
>>> Has this been brought up before?  Has someone
>> encountered it?  
>>> If there are other things I should try, I would very
>> much appreciate the suggestions!
>>> I'm completely at a loss where the problem is. 
>> Code?  DBD?  DBI?  SQL Server?  mdac?
>>> Thanks
>>> -rt
>>>
>>>
>>>
>>>
>>>
>>
>> Can I see the rest of the code after the prepare please?
>> Preferably a small self contained and complete example
>> would be best.
>>
>> Are you calling odbc_more_results after execute until it
>> returns false?
>>
>> Martin
>> -- 
>> Martin J. Evans
>> Easysoft Limited
>> http://www.easysoft.com
>>
> 
> Hi Martin,
> 
> Thank you for your reply.
> 
> I'm depending on DBI's do() method:
> 
> my $dbh=DBI->connect("dbi:ODBC:$dsn",'','');
> $dbh->{HandleError} = sub { print "error occurred\n"; };
> $sql = 'restore database [foo] from disk=\'c:\\mybackup.bak\' with replace';
> $dbh->do( $sql );
> 
> 
> 
> I've also tried:
> 
> my $dbh=DBI->connect("dbi:ODBC:$dsn",'','');
> $dbh->{HandleError} = sub { print "error occurred\n"; };
> $sql = 'restore database [foo] from disk=\'c:\\mybackup.bak\' with my $sth = 
> $dbh->prepare( $sql );
> my $dbh->execute();
> while ( my @junk = $sth->fetchrow_array() ) {
>    # do nothing
> }
> 
> 
> In both cases, the error handler is not triggered, and all appears well on 
> the client in.  However, a trace using SQLProfiler shows Msg 3224 and that 
> the backup terminates abnormally.
> 
> I've been able to confirm this on two systems running the same versions of 
> the software.
> 
> 
> I would expect either approach to work?
> 
> Regards,
> -rt
> 
> 
> 
>       
> 
> 

When you call procedures in MS SQL Server you often need to use
prepare/execute/odbc_more_results because SQL Server batches up results
and anything printed in the procedure can count as a result. I would try
this:

$sth = prepare(restore....)
$sth->execute
do {
            my @row;
            while (@row = $sth->fetchrow_array()) {
               # do stuff here
            }
         } while ($sth->{odbc_more_results});


There is an example in t/20SqlServer.t that comes with DBD::ODBC - you
can find it by browsing the source on CPAN.

Martin
-- 
Martin J. Evans
Easysoft Limited
http://www.easysoft.com

Reply via email to