Hi,
Ich weiß nicht ob ich hier in diesem Forum mit der Frage richtig bin, aber ich hoffe ihr könnt mir helfen.
Ich greife mit Sybperl auf eine Sybase-Datenbank zu. Leider kommt es zum Sofortigen Script abbruch, wenn ich einen Fehler von SYBASE erhalte.
Ich habe, wie von Michael Pepper beschrieben eine eigene Fehlerbehandlungsroutine geschrieben, in der ich nichts von dem Scriptabbruch geschrieben habe.
WARUM BRICHT DIESES ***** SCRIPT DANN TROTZDEM AB?
Ich benutze Perl 5.6.1, Sybperl und bin auf einer HP-UX am coden.
vielen Dank für eure Aufmerksamkeit,
Tronde
User since
2003-08-04
467
Artikel
HausmeisterIn
Gibt es denn irgendeine Meldung, wenn das Skript abbricht?
edit: Will meinen, wird eine Fehlerausschrift vom Modul oder von Perl durchgereicht?\n\n
<!--EDIT|JW|1068740915-->
User since
2003-11-13
10
Artikel
BenutzerIn
Ich verstehe noch nicht ganz was du meinst...
Also bei mir wird die meldung der DB durch die Routine von mir in eine Datei geschrieben.
Allerdings sollte das Script doch dannach einfach weiter laufen, oder nicht?
User since
2003-08-04
12209
Artikel
Admin1
ich kann DBD::Sybase empfehlen, also wenn du SYBperl nicht unbedingt
benutzen musst, wechsle das modul...
User since
2003-11-13
10
Artikel
BenutzerIn
KAnn ich mir denken... leider steht genau das nicht in meiner Gewalt das zu Entscheiden...
hat wer von euch ne Ahnung warum das Script aufhört?
User since
2003-08-06
2261
Artikel
ModeratorIn
Um es noch mehr zu unterstreichen, Sybperl ist seit über 5 Jahren deprecated, will heißen vom eigenen Autor nicht mehr empfohlen. Weiter unterstützt wird statt dessen
DBD::Sybase
User since
2003-11-13
10
Artikel
BenutzerIn
Ja. Stimmt.
Allerdings ist das wie gesagt nicht in meiner Macht! - Leider
Bekomme diese meldung zurück:
DB-Library: General SQL Server error: Check messages from the SQL Server.
Ansonsten steht halt im Log das ich ohne Berechtigung auf ne Tablle zugegriffen habe... (aus test zwecken)
Hier mal das script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#! perl
use Sybase::Sybperl;
use Sybase::DBlib;
dbmsghandle ("message_handler");
dberrhandle ("error_handler");
my $user= "";
my $pass= "";
my $server= "";
my $db = "";
my $dbh = 0;
my @data;
my @rueck;
my $status = "";
my $sql = " Select * from Test ";
open(LOGG,">>x.test");
print LOGG "\n LOGG".log_time()."opend";
$dbh = new Sybase::DBlib $user,$pass;
print LOGG "\n LOGG".log_time()."Connected";
$dbh->dbuse($db);
print LOGG "\n LOGG".log_time()."DB changed";
$status = $dbh->dbcmd($sql);
print LOGG "\n LOGG".log_time()."sql";
$status = $dbh->dbsqlexec;
print LOGG "\n LOGG".log_time()."executed";
$status=$dbh->dbresults;
print LOGG "\n LOGG".log_time()."results";
while(@data = $dbh->dbnextrow)
{
if(@rueck==0)
{
@rueck=[@data];
}
else
{
push(@rueck,[@data]);
}
}
$sql = "select * from tet";
$status = $dbh->dbcmd($sql);
print LOGG "\n LOGG".log_time()."sql";
$status = $dbh->dbsqlexec;
print LOGG "\n LOGG".log_time()."executed";
$status=$dbh->dbresults;
print LOGG "\n LOGG".log_time()."results";
$dbh->dbclose;
print LOGG "\n LOGG".log_time()."DB closed";
foreach (@rueck)
{
print "\n ". $_;
}
close(LOGG);
#=============================================================
#=============================================================
# Sybperl Error-Handling
#=============================================================
sub message_handler
{
my ($db, $message, $state, $severity, $text, $server, $procedure,$line) = @_;
if ($severity > 10)
{
print LOGG "\n !FAIL".log_time()."Sybase message ". $message .", Severity ". $severity .", state ". $state;
print LOGG "\n !FAIL".log_time()."Server `". $server. "'" if defined ($server);
print LOGG "\n !FAIL".log_time()."Procedure `". $procedure. "'" if defined ($procedure);
print LOGG "\n !FAIL".log_time()."Line ". $line if defined ($line);
print LOGG "\n !FAIL".log_time().$text. "\n\n";
# &dbstrcpy returns the command buffer.
if(defined($db))
{
my ($lineno, $cmdbuff) = (1, undef);
my $row;
$cmdbuff = &Sybase::DBlib::dbstrcpy($db);
foreach $row (split (/\n/, $cmdbuff))
{
print LOGG "\n !FAIL".log_time(). sprintf ("%5d", $lineno ++). "> ". $row, "\n";
}
}
}
elsif ($message == 0)
{
print LOGG "\n !FAIL".log_time(). $text;
}
return 1;
}
sub error_handler
{
my ($db, $severity, $error, $os_error, $error_msg, $os_error_msg)= @_;
# Check the error code to see if we should report this.
if ($error != SYBESMSG)
{
print LOGG "\n !FAIL".log_time()."Sybase error: ", $error_msg;
print LOGG "\n !FAIL".log_time()."OS Error: ", $os_error_msg if defined ($os_error_msg);
}
return 0;
}
User since
2003-08-04
467
Artikel
HausmeisterIn
Mhh, da ich gleich zum Treffen muss, habe ich mich nicht wirklich vertieft, aber die Funktion error_handler gibt eine 0 zurück. Könnte es sein, dass die empfangende Funktion daraufhin das Skript beendet?
Wie gesagt, Sybperl kenne ich gar nicht und da scheint ja auch noch eine eigene C-Bibliothek dahinter zu stehen.
User since
2003-11-13
10
Artikel
BenutzerIn
Scheinst mit deiner Vermutung recht zu haben, bei
sagt er mir zumindestens schon mal
Attempt to INT_CONTINUE on a non-timeout error:
DB-Library: General SQL Server error: Check messages from the SQL Server.
Ich schau mal ob ich die C-Library finden kann..