Schrift
[thread]10958[/thread]

MSSQL, kleines Problem beim schreiben auf die DB

Leser: 2


<< >> 9 Einträge, 1 Seite
AppAttack
 2007-12-05 08:58
#103457 #103457
User since
2007-12-05
4 Artikel
BenutzerIn
[default_avatar]
Hi, ich bin noch SEHR neu in Perl und arbeite mich gerade darin ein weil ich quasi beruflich "gezwungen" bin dazu...

Ich arbeite an einem Perl Script das mir bestimmte Daten aus einer Webseite mittels DBD:ODBC in eine MSSQL Datenbank schreibt.

Eigentlich habe ich schon alles komplett fertig und es funktioniert auch alles wie gewünscht. Aber ein kleines Problem habe ich noch....
Zwei der Felder die ausgefüllt werden können E Mail Adressen beinhalten, diese Feldinhalte werden an Mail::Sendmail übergeben welches bei bestimmten aktionen automatisch emails versendet.....

Leider kommt es immer wieder vor das Mail::Sendmail Fehlermeldungen bringt weil auf einmal in der Datenbank für die entsprechenden Felder nicht mehr NULL als wert hinterlegt ist sondern auf einmal die komplette Zeichenlänge char(100) mit Leerzeichen gefüllt ist....

Das gleiche Problem mit den Leerzeichen habe ich auch bei anderen Datenbankfeldern....

Nun ist die Frage wie entsteht soetwas und wie könnte ich es verhindern ?
Bzw. wie übertrage ich den wert NULL falls ein Skalar oder Array oder Hash undefiniert ist oder leerzeichen enthält ?


Gruß Michael
nepos
 2007-12-05 09:25
#103458 #103458
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wie es entsteht ist schwer zu sagen, ohne deinen Code zu kennen.
Was meinst du, den Wert NULL übertragen? Zur Datenbank? Norml sollte es da reichen, wenn der Wert für das jeweilige Feld einfach undef ist.
Vielleicht kannst du dein Skript ja mal posten bzw. Teile daraus. Dann kann dir sicher wer besser weiterhelfen.
renee
 2007-12-05 09:33
#103459 #103459
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Die Fehlermeldungen wären auch ganz interessant...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
AppAttack
 2007-12-05 10:08
#103466 #103466
User since
2007-12-05
4 Artikel
BenutzerIn
[default_avatar]
Na dann Poste ich mal einen Teil ich hoffe es wird nicht zu viel da sich das ganze über viele CGIs verteilt.
Das script das ich hier poste dürfte das Problem verursachen, warum weiß ich leider nicht...
Code (perl): (dl )
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
use CGI;
use CGI::Carp qw(fatalsToBrowser);
$cgi = new CGI;

print($cgi->header('text/html'));

my ($logon, $cursor, %resultHash);
my($id,$telefon,$name,$beschreibung,$gebaeude,$geschoss,$ort,$check_bauschrott,
$check_schrott,$check_sperrmuell,$check_altpapier,$check_geheimpapier,$check_gga,
$check_fluessig,$manuell,$menge_m3,$menge_t,$menge_lesa,$menge,$geld_kostenstelle,
$geld_psp_element,$geld_co_auftrag,$email,$amail,$bemerkung,$status,$ausfuehrender,$erfasst,$bearbeiter);

#MSSQL Logon
use DBI;
my $data_source = q/dbi:ODBC:DDB/;
my $user = q/USER/;
my $password = q/PASS/;

my $dbh = DBI->connect($data_source, $user, $password, { RaiseError => 1, odbc_cursortype => 2})
    or die "Can't connect to $data_source: $DBI::errstr";


my $sqldate = "SELECT GETDATE() AS SMALLDATETIME";
        my $sth = $dbh->prepare($sqldate);
                $sth->execute;
                my @date = $sth->fetchrow_array;
        $date= @date[0];
        $sth->finish();

my $sqlformat = "SET LANGUAGE us_english";
        my $sth1 = $dbh->prepare($sqlformat);
                $sth1->execute;

$wunschd = $cgi->param('wunschdatum');


$id                     = $cgi->param('id');



if($cgi->param('status') eq 'e' or $cgi->param('status') eq 'a')
    {
        $datetime       = $date_timestamp;      #$datetime      = ($date . substr($time,2,6).'000000');
    }
else
    {
        $datetime = '';
    }

$id                     = $cgi->param('id');
$name                   = $cgi->param('name');
$email                  = $cgi->param('email');
$telefon                = $cgi->param('telefon');
$beschreibung           = $cgi->param('beschreibung');
$gebaeude               = $cgi->param('gebaeude');
$geschoss               = $cgi->param('geschoss');
$ort                    = $cgi->param('ort');

$check_bauschrott       = check2bin($cgi->param('check_bauschrott'));
$check_schrott          = check2bin($cgi->param('check_schrott'));
$check_sperrmuell       = check2bin($cgi->param('check_sperrmuell'));
$check_altpapier        = check2bin($cgi->param('check_altpapier'));
$check_geheimpapier     = check2bin($cgi->param('check_geheimpapier'));
$check_gga              = check2bin($cgi->param('check_gga'));
$check_fluessig         = check2bin($cgi->param('check_fluessig'));

$manuell                = $cgi->param('manuell');
$menge_m3               = $cgi->param('menge_m3');
$menge_t                = $cgi->param('menge_t');
$menge_lesa             = $cgi->param('menge_lesa');
$menge                  = $cgi->param('menge');
#$wunschdatum           = substr($wunschd,6,4).substr($wunschd,3,2).substr($wunschd,0,2);
my $wunschdatum         = substr($wunschd,6,4)."-".substr($wunschd,3,2)."-".substr($wunschd,0,2);
$erforderlich           = $cgi->param('erforderlich');
$geld_kostenstelle      = $cgi->param('geld_kostenstelle');
$geld_psp_element       = $cgi->param('geld_psp_element');
$geld_co_auftrag        = $cgi->param('geld_co_auftrag');

$bemerkung              = $cgi->param('bemerkung');
$status                 = $cgi->param('status');
$ausfuehrender          = $cgi->param('ausfuehrender');
$amail                  = $cgi->param('amail');

$erfasst                = $cgi->param('erfasstraw');
$bearbeiter             = $cgi->remote_user();


if($amail)
{
        if($datetime eq '')
        {
# EMAIL EMPFÄNGER

        print("E-Mail Versand an:<br>$amail");

        use Mail::Sendmail;

# EMAIL INHALT

        # Was muss entsorgt werden
        if($cgi->param('check_bauschrott')){$was = $was . "Bauschutt, ";}
        if($cgi->param('check_schrott')){$was = $was . "Schrott, ";}
        if($cgi->param('check_sperrmuell')){$was = $was . "Sperrmüll, ";}
        if($cgi->param('check_altpapier')){$was = $was . "Altpapier, ";}
        if($cgi->param('check_geheimpapier')){$was = $was . "Geheimpapier, ";}
        if($cgi->param('check_gga')){$was = $was . "Gemischter Gewerbe Abfall, ";}
        if($cgi->param('check_fluessig')){$was = $was . "Flüssige Abfälle, ";}
        $was = $was . $cgi->param('manuell');

        # Aufwand
        if($cgi->param('menge_m3')){$aufwand = $cgi->param('menge_m3')." m³, ";}
        if($cgi->param('menge_t')){$aufwand = $cgi->param('menge_t')." Tonnen, ";}
        if($cgi->param('menge_lesa')){$aufwand = $cgi->param('menge_lesa')." Lesabehälter, ";}


                # Message

                $message = "
Entsorgungsauftrag
-----------------

Auftragsnummer  \t = ".$cgi->param('id')."
Wunschdatum     \t = ".$cgi->param('wunschdatum')."
Name            \t = ".$cgi->param('name')."
E-Mail          \t = ".$cgi->param('email')."
Telefon         \t = ".$cgi->param('telefon')."
Gebäude                \t = ".$cgi->param('gebaeude')."
Geschoss        \t = ".$cgi->param('geschoss')."
Ort             \t = ".$cgi->param('ort')."
Was?            \t = ".$was."
Menge           \t = ".$menge.$cgi->param('menge')."
Beschreibung    \t = ".$cgi->param('beschreibung')."
Bemerkung       \t = ".$cgi->param('bemerkung')."
Ausführender   \t = ".$cgi->param('ausfuehrender')."
erforderlich, weil\t = ".$erforderlich."

Kostenstelle    \t = ".$cgi->param('geld_kostenstelle')."
PSP Element     \t = ".$cgi->param('geld_psp_element')."
CO-Auftrag      \t = ".$cgi->param('geld_co_auftrag')."

===========================================================================================



-----------------------      -------------------------      -------------------------------
Erledigt am:                 Name/Firma:                    Geprüft/Anerkannt Auftraggeber:
===========================================================================================
";

        # EMAIL HEADER

                %mail = (
                        To      => $amail,
                        From    => 'absender@mail.com',
                        Subject => "Entsorgungsauftrag ".$cgi->param('id'),
                        Message => $message
                );

        # EMAIL VERSAND

                sendmail(%mail) or die $Mail::Sendmail::error;

        # EMAIL LOG

                $log = $Mail::Sendmail::log;
                $log =~ s/\n/<br>/g;

                print "\n\n<br><br>E-Mail Versand Log:\n\n<br><br>", $log;
        }

}

# SQL
if($datetime eq '')
{
$sqlupdate="UPDATE DDBUSER.Entsorgung Set telefon='$telefon',name='$name',beschreibung='$beschreibung',
bemerkung='$bemerkung',gebaeude='$gebaeude',geschoss='$geschoss',ort='$ort',
check_bauschrott='$check_bauschrott',check_schrott='$check_schrott',check_sperrmuell='$check_sperrmuell',
check_altpapier='$check_altpapier',check_geheimpapier='$check_geheimpapier',check_gga='$check_gga',
check_fluessig='$check_fluessig',manuell='$manuell',menge_m3='$menge_m3',menge_t='$menge_t',
menge_lesa='$menge_lesa',menge='$menge',geld_kostenstelle='$geld_kostenstelle',
geld_psp_element='$geld_psp_element',geld_co_auftrag='$geld_co_auftrag',email='$email',
erfasst='$erfasst',status='$status',ausfuehrender='$ausfuehrender',amail='$amail',bearbeiter='$bearbeiter',
wunschdatum='$wunschdatum' WHERE ID=$id";
}
else
{
$sqlinsert=("INSERT INTO DDBUSER.Entsorgung_archiv(id,telefon,name,beschreibung,bemerkung,gebaeude,geschoss,ort,check_bauschrott,
check_schrott,check_sperrmuell,check_altpapier,check_geheimpapier,check_gga,check_fluessig,
manuell,menge_m3,menge_t,menge_lesa,menge,wunschdatum,geld_kostenstelle,
geld_psp_element,geld_co_auftrag,email,erfasst,erledigt,status,ausfuehrender,amail,bearbeiter) 
VALUES($id,'$telefon','$name','$beschreibung','$bemerkung','$gebaeude','$geschoss','$ort',
'$check_bauschrott','$check_schrott','$check_sperrmuell','$check_altpapier','$check_geheimpapier',
'$check_gga','$check_fluessig','$manuell','$menge_m3','$menge_t','$menge_lesa','$menge',
'$wunschdatum','$geld_kostenstelle','$geld_psp_element','$geld_co_auftrag','$email',
'$erfasst','$datetime','$status','$ausfuehrender','$amail','$bearbeiter')");
        my $sth2 = $dbh->prepare($sqlinsert);
        $sth2->execute;
        $sqlupdate = "DELETE FROM DDBUSER.Entsorgung WHERE ID=$id";
}
my $sth3 = $dbh->prepare($sqlupdate);
$sth3->execute;
$dbh->commit;

print($cgi->br().$cgi->br().$cgi->br().$cgi->br().$cgi->p({-align => 'center'},"Entsorgungsauftrag mit der laufenden Nummer $id wurde geändert!"));

#print($sql);

print $cgi->end_html();
AppAttack
 2007-12-06 08:29
#103492 #103492
User since
2007-12-05
4 Artikel
BenutzerIn
[default_avatar]
So zur Auflösung, habe den Fehler gefunden.
Der VariablenTyp war als Char angelegt und der MSSQL hat die blöde angewohnheit bei dem Datentyp alle nicht genutzten Zeichen durch Leerzeichen aufzufüllen. Vielleicht ist es auch nur die kombination aus MSSQL dem Datentyp und dem DBD ODBC ?

Habe Varchar genommen als Typ damit geht es ohne Probleme !

Gruß App
pq
 2007-12-06 11:22
#103498 #103498
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
AppAttack+2007-12-06 07:29:18--
Der VariablenTyp war als Char angelegt und der MSSQL hat die blöde angewohnheit bei dem Datentyp alle nicht genutzten Zeichen durch Leerzeichen aufzufüllen.

ist das nicht gerade der sinn vom datentyp char?
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
AppAttack
 2007-12-07 08:02
#103537 #103537
User since
2007-12-05
4 Artikel
BenutzerIn
[default_avatar]
Hi, kann sein ich bin nicht wirklich drauf gekommen weils mit ner Adabas Datenbank nicht so war !

Gruß App
nepos
 2007-12-07 09:51
#103538 #103538
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Eine Datenbank sollte da nicht eigenmächtig Zeichen einfügen oder abschneiden meiner Meinung. Bei PostgreSQL passiert sowas meines Wissens auch nicht...
MySQL hat da ähnliche Murksereien...
GwenDragon
 2007-12-07 16:48
#103581 #103581
User since
2005-01-17
14759 Artikel
Admin1
[Homepage]
user image
Beim Datentyp Char ist ja eine feste Länge vorgegeben und die wird dann mit Leerzeichen aufgefüllt.

Das ist aber schon seit 20 Jahren so bei SQL und anderen DB-Abfragesprachen!
<< >> 9 Einträge, 1 Seite



View all threads created 2007-12-05 08:58.