Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]3616[/thread]

Dynamisches Binden bei DBI



<< |< 1 2 >| >> 16 Einträge, 2 Seiten
renee
 2005-09-13 12:32
#33525 #33525
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Kann ich bind_param() dynamisch (abhängig vom Datentyp) verwenden??

Ich habe folgendes versucht:
Code: (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
#! /usr/bin/perl

use strict;
use warnings;
use DBI ':sql_types';

my $dbh = DBI->connect('DBI:ODBC:driver=Microsoft Access-Treiber (*.mdb);dbq=db1.mdb',user,pass);

my $col = 'Testcol';
my $statement = "INSERT INTO table (`$col`) VALUES(?)";

my $coltype = get_type($col,$dbh);
$coltype = 'SQL_'.$coltype;

my $sth = $dbh->prepare($statement);

for(2..1000){
my $var = <STDIN>;
chomp $var;
$sth->bind_param(1,$var,$coltype);
$sth->execute($var) or die $dbh->errstr();
}

sub get_type{
my ($name,$dbh) = @_;
my ($sthcolinfo) = $dbh->column_info(undef,undef,undef,$name);
my $hashref = $sthcolinfo->fetchrow_hashref();
return $hashref->{TYPE_NAME};
}


Folgende Fehlermeldung wurde dann ausgegeben:
Code: (dl )
DBI::st=HASH(0x3e9c2dc)->bind_param(...): attribute parameter 'SQL_INTEGER' is not a hash ref at C:/access.pl line 19
\n\n

<!--EDIT|renee|1126600385-->
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-09-13 13:00
#33526 #33526
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hm, macht das DBI nicht eh automatisch, wenn du mit Platzhaltern in den SQL-Statements arbeitest?

EDIT: Eventuell musst du noch ein
Code: (dl )
use DBI qw(:sql_types);
einbauen.
Siehe auch perldoc DBI unter bind_param:
Quote
The SQL_INTEGER and other related constants can be
imported using use DBI qw(:sql_types); See "DBI Constants" for more information.
\n\n

<!--EDIT|nepos|1126602200-->
renee
 2005-09-13 13:03
#33527 #33527
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Nein... Bei Standardsachen wird es vielleicht gemacht, aber wenn man z.B. Memo-Felder in Access macht, muss man es per Hand machen...
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-09-13 13:04
#33528 #33528
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Oh, du hast das use ja drin. Sollte mal meine Brille putzen ;)
Sorry, dann weiss ich auch nicht, wieso er das nicht schluckt...
pq
 2005-09-14 00:10
#33529 #33529
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
direkt aus perldoc DBI:
Code: (dl )
$sth->bind_param(1, $value, { TYPE => SQL_INTEGER });


warum das mit $sth->bind_param(1, $value, SQL_INTEGER); nicht geht, ist aber merkwürdig.
DBI-version?

edit: achso, klar:
Code: (dl )
1
2
3
4
perl -wle'
use DBI qw(:sql_types);
print SQL_INTEGER'
4


edit2:
Code: (dl )
1
2
3
         foreach (@{ $DBI::EXPORT_TAGS{sql_types} }) {
printf "%s=%d\n", $_, &{"DBI::$_"};
}
\n\n

<!--EDIT|pq|1126642435-->
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
renee
 2005-09-14 09:46
#33530 #33530
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@pq: Mit Deinem Code geht es, da ist aber nix dynamisches dabei. Du gibst den Typ ja explizit an ($sth->bind_param(1, $value, SQL_INTEGER);). Da müsste ich ca. 35 if-elsif-Abfragen machen für die Bindung. Um das zu vermeiden, wollte ich die oben beschriebene Methode anwenden. Mittels column_info den Datentyp herausfinden (klappt wunderbar) und dann einen String bauen...

Dein edit2 funktioniert komischerweise in einem einzelnen Skript, aber als ich es in mein Modul mit eingepackt habe, hat es nicht mehr funktioniert (muss die Fehlermeldung mal rauskramen). Da bin ich noch auf Fehlersuche...
Aber der Quellcode hilft auch nicht wirklich bei meinem eigentlichen Problem...
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/
renee
 2005-09-14 10:57
#33531 #33531
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
So wie es aussieht hilft mir der Code aus der Doku doch, allerdings muss ich noch den Fehler suchen, warum es in dem Skript funktioniert, im Modul aber nicht...
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/
renee
 2005-09-14 11:30
#33532 #33532
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
This piece of code works:
Code: (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
#! /usr/bin/perl

use strict;
use warnings;
use DBI ':sql_types';

my $dbh = DBI->connect('DBI:ODBC:driver=Microsoft Access-Treiber (*.mdb);dbq=db1.mdb',user,pass);

my $col = 'Testcol';

my $statement = "INSERT INTO table (`$col`) VALUES(?)";

my $coltype = get_type($col,$dbh);
$coltype = 'SQL_'.$coltype;
my $sth = $dbh->prepare($statement);

for(2..1000){
my $var = <STDIN>;
chomp $var;
no strict 'refs';
$sth->bind_param(1,$var,&{"DBI::$coltype"});
use strict 'refs';
$sth->execute($var) or die $dbh->errstr();
}

sub get_type{
my ($name,$dbh) = @_;
my ($sthcolinfo) = $dbh->column_info(undef,undef,undef,$name);
my $hashref = $sthcolinfo->fetchrow_hashref();
return $hashref->{TYPE_NAME};
}


But when I split the code in "script" and "module" it does not work.
I've tried this:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
#! /usr/bin/perl

use strict;
use warnings;
use lib qw(.);
use DbiTest;
use DBI ':sql_types';

my $col = 'Testcol';
DbiTest->new($col);


module:
Code: (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
package DbiTest;

use strict;
use warnings;
use DBI ':sql_types';

sub new{
my ($class,$col) = @_;
my $dbh = DBI->connect('DBI:ODBC:driver=Microsoft Access-Treiber (*.mdb);dbq=db1.mdb',user,pass);

my $statement = "INSERT INTO table (`$col`) VALUES(?)";

my $coltype = get_type($col,$dbh);
$coltype = 'SQL_'.$coltype;
my $sth = $dbh->prepare($statement);

for(2..1000){
my $var = <STDIN>;
chomp $var;
no strict 'refs';
$sth->bind_param(1,$var,&{"DBI::$coltype"});
use strict 'refs';
$sth->execute($var) or die $dbh->errstr();
}
}

sub get_type{
my ($name,$dbh) = @_;
my ($sthcolinfo) = $dbh->column_info(undef,undef,undef,$name);
my $hashref = $sthcolinfo->fetchrow_hashref();
return $hashref->{TYPE_NAME};
}

1;



With that code the script dies with the following errormessage:
Code: (dl )
Usage: SQL_LONGVARCHAR() at DbiTest line 21
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/
Strat
 2005-09-14 14:02
#33533 #33533
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
du verwendest die aufrufende form &DBI::SQL_LONGVARCHAR und uebergibst damit dieser Funktion automatisch die Parameterliste @_ von new, und das mag DBI::SQL_LONGVARCHAR nicht, es muss immer ohne parameter aufgerufen werden...

entweder versuchen, da noch () reinzubekommen, oder @_ vorher leeren (z.B. mit shift)\n\n

<!--EDIT|Strat|1126692277-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
pq
 2005-09-14 14:06
#33534 #33534
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=renee,14.09.2005, 09:30]
Code: (dl )
    $sth->bind_param(1,$var,&{"DBI::$coltype"});


With that code the script dies with the following errormessage:
Code: (dl )
Usage: SQL_LONGVARCHAR() at DbiTest line 21
[/quote]
Code: (dl )
    $sth->bind_param(1,$var,&{"DBI::$coltype"}());
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
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2005-09-13 12:32.