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