Schrift
[thread]3641[/thread]

Datum in MS SQL einfügen...

Leser: 1


<< |< 1 2 >| >> 15 Einträge, 2 Seiten
wingster
 2005-11-25 16:08
#33781 #33781
User since
2005-11-25
5 Artikel
BenutzerIn
[default_avatar]
hallo,

ich versuche verzweifelt einen datumswert in die datetime spalte einer ms sql datenbank (via odbc) einzutragen:

Code: (dl )
1
2
my $termin = $dbh->prepare ("INSERT INTO termin (NR, TERMIN) VALUES (?, ?)");
$termin->execute ($num, $wdat);


wobei $wdat ein datum als string (10.10.2005) ist...

ich bekomme immer nur den fehler:

Code: (dl )
1
2
DBD::ODBC::st execute failed: [Microsoft][ODBC SQL Server Driver]Ungültiger Zeichenwert für  Konvertierungsangabe (SQL-22018)(DBD: st_execute/SQLExecute err=-1)
at ...


direkte eingabe eines strings hat auch nix geholfen...

kann jemand helfen

danke! :)

gruß

wingster
esskar
 2005-11-25 16:39
#33782 #33782
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
von welchem typ ist den die spalte in der mssql tabelle?
wingster
 2005-11-25 16:50
#33783 #33783
User since
2005-11-25
5 Artikel
BenutzerIn
[default_avatar]
die spalte ist vom typ DATETIME...
esskar
 2005-11-25 17:08
#33784 #33784
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
hast du es mal mit "2005.10.10 00:00:00" versucht ?
wingster
 2005-11-25 17:21
#33785 #33785
User since
2005-11-25
5 Artikel
BenutzerIn
[default_avatar]
ja, funktioniert aber auch nicht...

ich bin jetzt bis mittwoch mittag weg... würde mich aber trotzdem sehr über antworten freuen!

macht es gut!

gruß

wingster
renee
 2005-11-26 09:32
#33786 #33786
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Fuege mal einen Datensatz mit der SQL-Funktion NOW() ein und schau Dir dann das Format des DATETIME-Feld an...
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/
nepos
 2005-11-26 13:01
#33787 #33787
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Oder lies mal in der Dokumentation, was MS SQL alles als Datetime parsen kann.
Strat
 2005-11-26 14:44
#33788 #33788
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
ich bin mir nicht sicher, ob MsSql die Funktion NOW() unterstuetzt; da ist mir nur die funktion GETDATE() bekannt.
z.B.
[sql]CREATE TABLE xyz (
x VARCHAR(20),
date DATETIME DEFAULT GETDATE()
);
INSERT INTO xyz (x) VALUES('test');
SELECT x,date FROM xyz WHERE x ='test');
[/sql]
dann wird immer automatisch das aktuelle datum gespeichert, wenn du keinen wert fuer 'date' eingibst. Teste das mal und dann siehst du das format, das herauskommt; das kannst du dann auch wieder reinschicken.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
steffenw
 2005-11-27 00:26
#33789 #33789
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
Du kannst ja nicht einfach bei prepare einen Sack voll ? angeben und dann hoffen, daß sich "irgendwer" die Mühe macht, herauszufinden, was der Typ denn sein soll. Wenn man den Typ nicht angibt, dann geht DBI immer von SQL_VARCHAR aus. Manche Datenbank-Treiber kommen damit zurecht, manche sind recht eigenwillig. MS SQL braucht Typen, bei MySQL z.B. ging es immer ohne. Stehen die Werte im Statement, parst die Datenbank sie daraus - intelligenter und natürlich langsamer. Übergibst Du sie, müssen sie passen, da überlegt die Datenbank nicht lange.

http://search.cpan.org/~timb/DBI-1.48/DBI.pm#bind_param
Code: (dl )
1
2
3
4
5
6
7
use DBI ':sql_types'; # siehe auch http://search.cpan.org/~timb/DBI-1.48/DBI.pm#DBI_Constants
...
my $sth = $dbh->prepare ("INSERT INTO termin (NR, TERMIN) VALUES (?, ?)");
$sth->bind_param(1, undef, SQL_INTEGER); # nur Typdefinition für 1. Platzhalter
$sth->bind_param(2, undef, SQL_DATETIME);
$sth->execute(12, '2005-06-07 12:34:56'); # das steht dann wirklich in der Datenbank
$sth->execute(34, '2005-06-07 23:45:00'); # und das ist der nächste Datensatz

Hast Du nur ein execute, kannst du die Werte auch da hinschreiben, wo ich undef stehen habe und execute ohne Parameter aufrufen.

Das mit den Platzhaltern beim prepare und dann per execute nur noch Daten hochpumpen geht wirklich superschnell. Die Typen herausfinden ist manchmal etwas schwierig. Lasse Dir die Typen auflisten, so wie das im DBI-Modul beschrieben ist und probiere mit den naheliegendsten, dann hast Du Erfolg.

bind_param bzw. execute kann auch gut mit undef umgehen. Der Feldwert wird dann in der Datenbank zu NULL.\n\n

<!--EDIT|steffenw|1133045206-->
$SIG{USER} = sub {love 'Perl' or die};
wingster
 2005-12-01 11:30
#33790 #33790
User since
2005-11-25
5 Artikel
BenutzerIn
[default_avatar]
Danke für die Tipps!

Ich bin heute erst wieder dran und werde es mal alles ausprobieren!
(und mal die DBI-doku lesen ;o)

melde mich dann!

gruß

wingster
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2005-11-25 16:08.