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
sub LogDb {
my $Name = shift;
my $Severity = shift;
my $Message = shift;
# Aktuelle Uhrzeit und Datum
my $Date = strftime "%Y-%m-%d", localtime(time);
my $Time = strftime "%H:%M:%S", localtime(time);
if (!defined $Name) {
$Name = "Name";
}
if (!defined $Message) {
$Message = "Message";
}
if (!defined $Severity){
$Severity = "I";
}
# define DB Parameters
my $DBLogServer = '***';
my $DBLogDatabase = '***';
my $DBLogUsername = '***';
my $DBLogPassword = '***';
my $DBLogdbh;
if ($Severity eq "A") {
# Connect to DB
my $DBLogConnection = "driver={SQL Server};Server=$DBLogServer;Database=$DBLogDatabase;UID=$DBLogUsername;PWD=$DBLogPassword";
$DBLogdbh = DBI->connect("DBI:ODBC:$DBLogConnection") or die "Cannot Connect";
}
if ($Severity eq "I") {
# Build Statement and execute
my $DBLogStatement = "Insert Into Logging (Date,Time,Priority,Message,Modul) VALUES ('$Date','$Time','$Severity','$Message','$Name')";
my $DBLogsth = $DBLogdbh->prepare( $DBLogStatement );
$DBLogsth->execute();
}
if ($Severity eq "Z") {
# Disconnct DB
$DBLogdbh->disconnect();
}
}
1
2
3
LogDb($Modul,"A", "Module $Modul was started.");
LogDb($Modul,"I", "Here is an Information");
LogDb($Modul,"Z", "End");
1 2
$sth = $dbh->prepare("insert into my_table (columns...) values (?, ?, ?)") # mit den ? drin! So viele ? wie Spalten! $sth->execute($date, $message, ....) # entsprechend zu dem Prepare
2020-09-04T12:45:02 tk102Na ja, es reicht ja schon, wenn Dein Programm sich merkwürdig verhält, wenn in $Name oder $Message mal etwas drin ist, was in SQL Bedeutung hat. Zum Beispiel ist don't ein gültiger Name für eine Perl-Funktion, und der Apostroph kann auch in Namen und Dateinamen vorkommen. Platzhalter, wie vom Raubtier vorgeschlagen, sind nicht mal sonderlich kompliziert, dafür bist Du aber alle Unsicherheiten beim Inhalt der Datenbankfelder los.Oh, das ist ein guter Hinweis! Wobei das in meinem Anwendungsfall wohl eher keine riesen Rolle spielen wird.
2020-09-04T12:45:02 tk102Die Verbindung fällt dir runter, weil Du $DBLogdbh als lexikalische Variable (mit my) innerhalb Deines Unterprogramms deklariert hast. Nach einem Durchlauf geht $DBLogdbh "out of scope" - und damit wird die Datenbankverbindung automatisch geschlossen.Wie genau bringe ich Perl dazu, die Verbindung offen zu halten?