Torsten: Access Datenbank mit Perl auslesen und komplett an eine HTML Seite ausgeben

Hallo,
Mein Problem :
ich soll eine Access Datenbank mit Hilfe von einem Perl Script über ODBC auslesen, und sie dann
komplett als HTML an den Browser zurückgeben.
Das ganze läuft auf einem NT 4.0 Server mit IIS4.
Hier mein bisherieges Script, mein Fehler müßte glaube ich in irgendeiner Schleife liegen???

#!/perl/bin/perl.exe

$os = "WINDOWS";

use Win32::ODBC;
$DSN="stamm";
if(!($db=new Win32::ODBC($DSN)))
{
print "Error:" . Win32::ODBC::Error(). "<br>";
}
else
{

$sql_string = "SELECT * FROM Stellenplan";
  $db->Sql($sql_string);

if ($db->Sql($sql_string))
{
@FelderNamen = $db->FieldNames();
$spalten = @FelderNamen;

print "<html>";
print "<head>";
print "</head>";
print "<body>";
print "<table border=1 cellspacing=0>";
print "<tr>";
for (@FelderNamen){
   print "<th>", $_ , "</th>";
  }
print "</tr>";
  while ($db->FetchRow())
   {
    print "<tr>";
    undef %Data;
    %Data = $db->DataHash();
    $rows++;
    for ($i = 0; $i < $spalten; $i++)
     {
      if ($Data{$FelderNamen[$i]} gt '')
      {
       print "<td>", $Data{$FelderNamen[$i]}, "</td></tr>";
      }
      else
      {
    print "<td>Nicht Angegeben</td>";
      }
    print "</tr>";
  }
}
$db->Close();
print "</table>";
print "</body>";
print "</html>";
}
else
{
print "Fehler im SQL Statement";
}
}

  1. Hallo,

    Was kriegst du eigentlich für eine FM mit dem o.g. Script?

    Unabh. davon hier ein paar gedankliche Ansätze:

    if(!($db=new Win32::ODBC($DSN)))

    ^

    Machs besser so:
    $db = new Win32::ODBC("DSN=nordwind"); # ggf so:
    $db = new Win32::ODBC("DSN=nordwind;");

    und beachte:
    Anmerkung: Die Rückgabe ist "undef" wenn ein Fehler bei der Objekterstellung auftritt.

    http://i-netlab.de/odbc/inhalt.htm

    Wenn die DSN (DataSourceName) als System DSN erstellt wurde und der Name im ODBC Setup mit dem Namen im script übereinstimmt, sollte es eigentlich gehen.

    Viele Grüße, Rolf

    1. Hallo,

      Was kriegst du eigentlich für eine FM mit dem o.g. Script?

      Unabh. davon hier ein paar gedankliche Ansätze:

      if(!($db=new Win32::ODBC($DSN)))
                                  ^

      Machs besser so:
      $db = new Win32::ODBC("DSN=nordwind"); # ggf so:
      $db = new Win32::ODBC("DSN=nordwind;");

      und beachte:
      Anmerkung: Die Rückgabe ist "undef" wenn ein Fehler bei der Objekterstellung auftritt.

      http://i-netlab.de/odbc/inhalt.htm

      Wenn die DSN (DataSourceName) als System DSN erstellt wurde und der Name im ODBC Setup mit dem Namen im script übereinstimmt, sollte es eigentlich gehen.

      Viele Grüße, Rolf

      Ich habe das mal so geändert, aber trotzdem gibt er mir immer nur dies aus:
      <html><head></head><body><table border cellspacing=0><tr></tr></table></body></html>
      er überspringt also die gesamte Schleife.

      Torsten

      1. Hallo,

        auf jeden Fall fehlt für das CGI der Content-Type header...

        Aehm, geh da mal Schritt für Schritt vor, lass mal den ganzen HTML-Kram weg und versuche das Script zunächst auf der Befehlszeile zum Laufen zu bringen, Fehler bei Objekterstellung abfragen (hängts vielleicht hier schon?), klappt der Zugriff über ODBC überhaupt?! Lies nach dem SQL-Statement erst einmal nur die Feldernamen aus usw....

        Good Luck, Rolf

        BTW, hast du das ODBC Modul richtig installiert? Tipp: Machs mit PPM, das klappt auf Anhieb.

        1. Es hat geklappt

          DANKE!!!

          Das neue Script sieht jetzt so aus:

          #!/perl/bin/perl.exe

          $os = "WINDOWS";

          $max_rows = 10;
          $rows = 0;
          use CGI;
          $cgi = new CGI;
          use Win32::ODBC;
          $DSN="stamm";
          $db=new Win32::ODBC("DSN=stamm");

          $sql_string = "SELECT * FROM Stellenplan";

          @FelderNamen = $db->FieldNames();
          $spalten = @FelderNamen;

          if(! $db->Sql($sql_string)){
              @FelderNamen = $db->FieldNames();  # Feldnamen
              $spalten = @FelderNamen;           # Spaltenanzahl ermitteln
              #Ausgabe der Daten in den Browser (Tabelle)
              print        $cgi->header,

          $cgi->start_html('Ergebnis der SQL - Abfrage'),
                    $cgi->h2('Ergebnis der SQL - Abfrage'),
                    chop;
              print "<table border cellspacing=0><tr>";
              print "<table border cellspacing=0><tr>";
              for (@FelderNamen){
                print "<th>", $_, "</th>";
              }
              print "</tr><br>";
              # Und nun den Rest der Tabelle
              # FetchRow() gibt 0, wenn keine weiteren Daten anliegen
              while ($db->FetchRow() and $rows < $max_rows){
                print "<tr>";
                undef %Daten ;
                %Daten = $db->DataHash();
                $rows++;
                for ($i = 0; $i < $spalten; $i++){
                  if ($Daten{$FelderNamen[$i]} gt ''){
                    print "<td>", $Daten{$FelderNamen[$i]}, "</td>";
                  }
                  else{
                    print "<td>-frei-</td>";
                  }
                }
                print "</tr>";
              }
              print "</table>",
              $cgi->end_html;
              $db->Close() ;
            }
            else{
              print $cgi->header,
                    $cgi->start_html('Fehler im SQL Statement'),
                    $cgi->h2('Fehler im SQL Statement'),
                    $cgi->p,
                    $db->Error();
            }