Hi.
habe fogendes Problem und zwar versuche ich Log FIles von einem Linux server (Red Hat) auf eine Microsoft Sql Datenbank zu schreiben.
Habe dafuer einen Programmtext in Perl geschrieben der sieht folgendermassen aus:
#!/usr/bin/perl -w
use DBI;
$file = "/var/log/messages";
unless (open(FH, $file)){
die "error: could not '$file': $!\n;
}#if
while (defined($getline=<FH>)){
@line=split(/ /, $getline);
for ($i=9; $i<scalar(@line);$i+=1) {
$line[8]=$line[8].' '.$line[$i];
}#for
my $dbh = DBI->connect("dbi:mSQL:T1:fabian:3306","password","fabian");
my $sth=$dbh->prepare("insert into fabian ('month1','day1','time1','ip','port','month2','day2','time2','message')
values('".$line[0]."','".$line[1]."','".$line[2]."','".$line[3]."','".$line[4]."','".$line[5]."','".$line[6]."','".$line[7]."','".$line[8]."')");
$sth->execute();
}#while
iclose (FH);
Habe das mal ausgefuehrt und bekomme Fehlermeldungen ohne Ende.
z.B.
Possible unintended interpolation of @line in string at ./syslogmsql line 5.
Bareword found where operator expected at ./syslogmsql line 13, near "my $dbh=DB
(Might be a runaway multi-line "" string starting on line 5)
(Do you need to predeclare my?)
Unquoted string "dbi" may clash with future reserved word at ./syslogmsql line 1
Unquoted string "fabian" may clash with future reserved word at ./syslogmsql lin
String found where operator expected at ./syslogmsql line 13, near "3306",""
(Missing operator before ","?)
Bareword found where operator expected at ./syslogmsql line 13, near "","passwor
(Missing operator before password?)
Unquoted string "password" may clash with future reserved word at ./syslogmsql l
String found where operator expected at ./syslogmsql line 13, near "password",""
Bareword found where operator expected at ./syslogmsql line 13, near "","fabian"
(Missing operator before fabian?)
Unquoted string "fabian" may clash with future reserved word at ./syslogmsql lin
String found where operator expected at ./syslogmsql line 14, near "my $sth=$dbh
(Might be a runaway multi-line "" string starting on line 13)
(Missing semicolon on previous line?)
Bareword found where operator expected at ./syslogmsql line 14, near "my $sth=$d
(Do you need to predeclare my?)
String found where operator expected at ./syslogmsql line 15, at end of line
(Missing semicolon on previous line?)
syntax error at ./syslogmsql line 13, near "my $dbh=DBI->connect("dbi"
Can't find string terminator '"' anywhere before EOF at ./syslogmsql line 15.
Kann mir da aber keinen Reim draus machen wenn jemand weiss was ich da falsch gemacht habe waere ich ueber einen Tip sehr dankbar
cu
dayspring
User since
2003-08-04
14371
Artikel
ModeratorIn
#!/usr/bin/perl -w
use strict; # unbedingt benutzen... jetzt aber alle variablen mit my deklarieren
use warnings;
use DBI;
my $file = "/var/log/messages";
unless (open(FH, "<$file")){ # hier besser angeben, das Du lesen willst...
die "error: could not '$file': $!\n"; # hier hat das letzte " gefehlt
}#if
while (defined($getline=<FH>)){
my @line=split(/ /, $getline,8); # durch das ,8 sparst du die for-Schleife
my $dbh = DBI->connect("dbi:mSQL:T1:fabian:3306","password","fabian");
my $statement = "insert into fabian (month1, day1, time1, ip, port, month2, day2, time2, message) values(".join(", ", map{"'$_'"}@lines).")";
my $sth=$dbh->prepare($statement);# fehler im statement beseitigt
$sth->execute();
}#while
close (FH);
\n\n
<!--EDIT|renee|1086162967-->
User since
2003-08-04
2145
Artikel
ModeratorIn + EditorIn
Noch besser ist es,
- die Datenbank vor der Schleife zu oeffnen,
- Fehler beim Oeffnen abzufangen und
- gleich mit Platzhaltern zu arbeiten.
...
my $dbh = DBI->connect("dbi:mSQL:T1:fabian:3306", "password", "fabian")
or die "Kann Datenbank nicht oeffnen: " . DBI->errstr();
while (defined($getline=<FH>)) {
my @line = split(/ /, $getline, 8);
my $statement = 'insert into fabian (month1, day1, time1, ip, port, month2, day2, time2, message) values (?,?,?,?,?,?,?,?,?)';
my $sth=$dbh->prepare($statement);
$sth->execute(@lines)
or warn "Fehler beim Schreiben in Datenbank: " . $sth->errstr();
}
$dbh->disconnect();
...
User since
2004-06-02
5
Artikel
BenutzerIn
Hi
Danke fuer eure schnelle Antwort
Habe die Aenderungen gemacht und es sind schon weniger Meldungen geworden die einzigen sind jetzt
Global symbol "$getline" requires explicit package name at ./syslog line 8.
Global symbol "$getline" requires explicit package name at ./syslog line 9.
Global symbol "@lines" requires explicit package name at ./syslog line 11.
Execution of ./syslog aborted due to compilation errors.
Hab den Code umbenannt.
Ich weiss halt nicht was fuer einen Package name der sucht
Weiss da jemand weiter
Gruesse
dayspring
User since
2004-06-02
5
Artikel
BenutzerIn
Danke
Der code ist jetzt richtig muss jetzt nur noch ein Modul nachinstallieren. Hakt noch mit der mSQL . dachte haette alles.
Gruesse
dayspring
User since
2004-06-02
5
Artikel
BenutzerIn
Hab doch noch was. Hab jetzt nach diesem Modul gesucht dachte ich koennte irgendwo ne RPM davon finden aber Fehlanzeige. Der Rechner sagte mir
install_driver(mSQL) failed: Can't locate DBD/mSQL.pm in @INC (@INC contains: /u sr/lib/perl5/5.6.1/i386-linux /usr/lib/perl5/5.6.1 /usr/lib/perl5/site_perl/5.6. 1/i386-linux /usr/lib/perl5/site_perl/5.6.1 /usr/lib/perl5/site_perl/5.6.0 /usr/ lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.6.1/i386-linux /usr/lib/perl5/v endor_perl/5.6.1 /usr/lib/perl5/vendor_perl .) at (eval 1) line 3, <FH> line 1.
Perhaps the DBD::mSQL perl module hasn't been fully installed,
or perhaps the capitalisation of 'mSQL' isn't right.
Available drivers: ExampleP, Pg, Proxy.
at ./syslog line 10
Erst hatte ich gedacht es wuerde mit dem DBD::ODBC klappen, das ist auch auf meinem Rechner drauf aber jetzt braucht er DBD/mSQL modul und hab keine Ahnung wo ich das finde. hab das letzte mal als ich DBI module installiert habe den Rechner so zugrunde gerichtet das sich alle Module gegensitig blockiert haben. Vielleicht weiss jemand was man da installieren sollte
Gruesse
dayspring
User since
2003-08-04
14371
Artikel
ModeratorIn
User since
2003-08-04
5246
Artikel
ModeratorIn
achtung: mSQL ist, wenn ich mich recht erinnere, nicht fuer M
sSql verwendbar, sondern nur fuer msql und mysql...
dafuer besser DBD::ODBC verwenden... oder versuchen, ob DBD::Sybase noch immer zu MsSql kompatibel ist... aber ich fuerchte, bei zweiterem werden uebers Netzwerk ein paar libs fehlen...\n\n
<!--EDIT|Strat|1086292476-->