Thread Datum in MS SQL einfügen... (14 answers)
Opened by wingster at 2005-11-25 16:08

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};

View full thread Datum in MS SQL einfügen...