Forums Neueste Beiträge
 

DBI Fehler

17/03/2010 - 20:25 von Marcel Kleist | Report spam
Hallo NG,

mein unten angefügter Code funktioniert nicht so, wie ich es gerne hàtte.
Ich habe eine csv-Datei, aus welcher ich, wenn die Bedingung erfüllt ist, über eine Schleife Daten in die Tabelle eines MSSQL-Server einlesen lassen will.
Eingelesen wird aber nur die erste Zeile, dann bricht das Script mit der Fehlermeldung:
'Can't call method "execute" without a package or object reference' ab.
Hat jemand eine Idee, was ich falsch mache, oder wie ich mein Vorhaben besser lösen könnte?

Dank & Gruß,

Marcel

#!/usr/local/bin/perl

use warnings;
use strict;
use DBI;

# Pfad zum einzulesenden VZ
my $dirpath = "Vz-Pfad";
my $filename = "dateiname";
my $imp_file = $dirpath.$filename;

my ( $csv_dbh, $csv_sth ); # CSV Database- & Statement- Handle
my ( $sql_dbh, $sql_sth ); # ODBC Database- & Statement- Handle
my $head = "feldname"; # Spaltenname
my $entry = "bedingung"; # der gesuchte Eintrag

# einlesen der csv-Daten in den Speicher
$csv_dbh = DBI->connect(qq{DBI:CSV:csv_sep_char=\\;}); # CSV Trennzeichen festlegen
$csv_dbh->{'csv_tables'}->{'xxx'} = { 'file' => $imp_file}; # CSV Tabelle zuweisen
$csv_sth = $csv_dbh->prepare("SELECT * FROM xxx WHERE $head = '$entry'") or die(); #Statementhandle zuweisen
$csv_sth->execute() or die(); # Statement ausführen

my ( $TimeString, $TimeLong, $LogID );
my @data;

if ( $csv_sth->rows != 0 ) { # wenn Eintràge verhanden
$sql_dbh = DBI->connect("DBI:ODBC:odbc", "user", "pw"); # zum SQL verbinden
while ( @data = $csv_sth->fetchrow_array() ) {
$TimeString = @data[0];
$TimeLong = @data[1];
$LogID = @data[2];
# Daten in Tabelle schreiben
$sql_sth = $sql_dbh->do ("INSERT INTO tabelle VALUES ('$TimeString', '$TimeLong', '$LogID')") or die();
$sql_sth->execute() or die();
}
$csv_sth->finish();
$csv_dbh->disconnect;
$sql_sth->finish();
$sql_dbh->disconnect;
}
 

Lesen sie die antworten

#1 Ralf Döblitz
17/03/2010 - 21:15 | Warnen spam
Marcel Kleist schrieb:
Hallo NG,

mein unten angefügter Code funktioniert nicht so, wie ich es gerne hàtte.
Ich habe eine csv-Datei, aus welcher ich, wenn die Bedingung erfüllt ist, über eine Schleife Daten in die Tabelle eines MSSQL-Server einlesen lassen will.
Eingelesen wird aber nur die erste Zeile, dann bricht das Script mit der Fehlermeldung:
'Can't call method "execute" without a package or object reference' ab.



Bei so etwas sollte man auch immer die Zeile mit angeben, für die der
fehler ausgegeben wurde - du hats nàmlich mehrere Aufrufe von execute()
im Script.

Hat jemand eine Idee, was ich falsch mache, oder wie ich mein Vorhaben besser lösen könnte?


[...]
$sql_sth = $sql_dbh->do ("INSERT INTO tabelle VALUES ('$TimeString', '$TimeLong', '$LogID')") or die();
$sql_sth->execute() or die();



Du solltest entweder ein Statement-Handle durch prepare() erzeugen und
spàter das Statement mittels execute() mit Daten versorgt ausführen
lassen oder aber das in einem Rutsch mit do() erledigen. Also entweder
die zweite der zitierten Zeilen entfernen (einfachste Lösung) oder das
Script umbauen, so daß àhnlich wie beim select-Statement aus den
CSV-Daten vor der Schleife erst das Statement-Handle mittels prepare() und
'?' als Platzhaltern im SQL-Code erzeugt und dann innerhalb der Schleife
wiederholt mittels execute() ausgeführt wird (effizientere Lösung).

Ralf
Ralf Döblitz * Schapenstraße 6 * 38104 Braunschweig * Germany
Phone: +49-531-2361223 Fax: +49-531-2361224 mailto:
Homepage: http://www.escape.de/users/selene/
Mit UTF-8 kann man gleichzeitig àöüßÄÖÜæœłø‱¼½¾¤¹²³¢€£¥¶§¬÷×±©®™¡¿ verwenden…

Ähnliche fragen