Teil von SELFHTML Forum Teil von SELFHTML Forumsarchiv Teil von 2008 Teil von März

SELFHTML Forumsarchiv
MS-SQL -> MySQL

Informationsseite
  1. Seite (PHP) MS-SQL -> MySQL von Marc51147, 31. 03. 2008, 02:12
nach unten

MS-SQL -> MySQL

Die folgende Nachricht zum Thema stammt von: Marc51147, 31. 03. 2008, 02:12

Hallo,

ich sitze an einer Aufgabe und komem nicht weiter, wäre nett, wenn mir jemand helfen könnte :

ich soll alle 3 Minuten die letzten 5 Datensätze aus einer MS-SQL-Tabelle alle Datensätze auslesen und 1:1 in eine MySQL-Tabelle schreiben. Bereits vorhandene Datensätze sollen ohne Fehlermeldung überschrieben werden.

Die Abfrage (ich hoffe, sie funktioniert) hab ich hinbekommen, die Aktualisierung auch, aber wie schreibt man das ganze nun in die MySQL-Tabelle ?

Viele Grüße,
Marc


<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
<meta http-equiv="refresh" content="180">
<title>mssql-mysql.php - Detenübertragung von MS-SQL-Server nach MySQL</title>
</head>

<?php
//MS-SQL-Server
$SQLServer = "localhost";
$SQLUser = "user";
$SQLPass = "password";
$SQLDB = "db1";

//Server connect
$dbhandle = mssql_connect($SQLServer, $SQLUser, $SQLPass)
  or die("Keine Verbindung möglich: $SQLServer");

//DB auswählen
$selected = mssql_select_db($SQLDB, $dbhandle)
  or die("Couldn't open database $SQLDB");

//alle Daten auswählen, sortierung nach absteigender laufender Nummer
$query = "SELECT * FROM `tabelle` ORDER BY `tabelle`.`lfd_nr` DESC LIMIT 0, 5 ";

//Abfrageergebnis
$result = mssql_query($query);
while($rows = mysql_fetch_array($result))

//connect schließen
mssql_close($dbhandle);
?>

//ausgelesene Datensätze in MySQL-DB schreiben


<?php
//MySQL-Server
$MySQLServer = "localhost";
$MySQLUser = "user";
$MySQLPass = "password";
$MySQLDB = "db2";

//Server connect
$dbhandle = mssql_connect($MySQLServer, $MySQLUser, $MySQLPass)
  or die("Keine Verbindung möglich: $MySQLServer");

//DB auswählen
$selected = mssql_select_db($MySQLDB, $dbhandle)
  or die("Couldn't open database $mySQLDB");

//und jetzt weiss ich nicht mehr weiter ....





//connect schließen
mssql_close($dbhandle);
?>

</body>
</html>

nach obennach unten

MS-SQL -> MySQL

Die folgende Nachricht zum Thema stammt von: Tom, 31. 03. 2008, 06:48

Hello,


»» <?php
»» //MS-SQL-Server
»» $SQLServer = "localhost";
»» $SQLUser = "user";
»» $SQLPass = "password";
»» $SQLDB = "db1";
»»
»» //Server connect
»» $dbhandle = mssql_connect($SQLServer, $SQLUser, $SQLPass)
»»   or die("Keine Verbindung möglich: $SQLServer");
»»
»» //DB auswählen
»» $selected = mssql_select_db($SQLDB, $dbhandle)
»»   or die("Couldn't open database $SQLDB");
»»
»» //alle Daten auswählen, sortierung nach absteigender laufender Nummer
»» $query = "SELECT * FROM `tabelle` ORDER BY `tabelle`.`lfd_nr` DESC LIMIT 0, 5 ";

Kann mssql jetzt auch die Limit-Klausel vertragen?
Ich dachte bis eben, mssql könnte nur TOP?


»» //Abfrageergebnis
»» $result = mssql_query($query);
»» while($rows = mysql_fetch_array($result))
»»
»» //connect schließen
»» mssql_close($dbhandle);
»» ?>

Soweit konnte ich folgen.
Steht denn etwas drin in $rows? Kontrollausgaben?
Ich würde das anders schreiben...

»» $result = mssql_query($query);



  if ($result)
  {
      $_table = array();
      $_row   = array();

      while($_row = mysql_fetch_array($result))
      {
          $_table[] = $_row;         ## den aktuellen Satz zur Auswahltabelle hinzufügen
      }
  }
  else
  {
      ## Fehlerbehandlung
  }

  mssql_close($dbhandle);


»» //ausgelesene Datensätze in MySQL-DB schreiben
»»
»»
»» <?php
»» //MySQL-Server
»» $MySQLServer = "localhost";
»» $MySQLUser = "user";
»» $MySQLPass = "password";
»» $MySQLDB = "db2";
»»
»» //Server connect
#> $dbhandle = mssql_connect($MySQLServer, $MySQLUser, $MySQLPass)
#  wäre wohl besser, die MySQL-API-Funktion zu benutzen
   $dbhandle = mysql_connect($MySQLServer, $MySQLUser, $MySQLPass)

»»   or die("Keine Verbindung möglich: $MySQLServer");
»»
»» //DB auswählen
#> $selected = mssql_select_db($MySQLDB, $dbhandle)
   $selected = mysql_select_db($MySQLDB, $dbhandle)
»»   or die("Couldn't open database $mySQLDB");
»»
»» //und jetzt weiss ich nicht mehr weiter ....
»»

  $columnlist = '`zielspalte_1`,`zielspalte_2`, ... , `zielspalte_n`';

  foreach($_table as $key => $_rec)
  {
     # Voraussetzung: keine der Spalten enthält den Wert NULL oder TRUE/FALSE
     # Anderenfalls muss das Escaping diskret gehandhabt werden.

     $_rec = array_map(mysql_real_escape_string,$_rec,$dbhandle);  ## hope, that's right

     $values = "'".implode("','", $_rec)."'";

     $sql = "replace into `$tablename` ($columnlist) values($values)";

     $replace_ok = mysql_query($sql,$dbhandle);
     ## http://dev.mysql.com/doc/refman/5.0/en/replace.html

     ## erledigten Record aus der Aufgabentabelle entfernen
     if ($replace_ok)
     {
         unset($_table[$key);
     }
  }

  ## hier Aufgabentabelle anzeigen / auswerten
  ## bei allen noch vorhandenen Datensätzen ist was schiefgegangen



»»
»» //connect schließen
  mysql_close($dbhandle);
»» ?>

So ungefähr könnte es klappen.
Konntes es leider eben nicht mehr ausprobieren.



Liebe Grüße

Tom vom Berg
--
Nur selber lernen macht schlau

nach obennach unten

MS-SQL -> MySQL

Die folgende Nachricht zum Thema stammt von: Vinzenz Mai, 31. 03. 2008, 09:34

Hallo

»» »» //alle Daten auswählen, sortierung nach absteigender laufender Nummer
»» »» $query = "SELECT * FROM `tabelle` ORDER BY `tabelle`.`lfd_nr` DESC LIMIT 0, 5 ";
»»
»» Kann mssql jetzt auch die Limit-Klausel vertragen?

können MS SQL-Server 2005 und älter definitiv nicht.
SELECT * ist hier grundfalsch. Es ist eine hervorragende Idee, jede einzelne Spalte aufzuführen und gegebenenfalls mittels CONVERT() oder vergleichbarer Funktionen in ein MySQL-kompatibles Format zu bringen.

Ja, eine robuste Übertragungsfunktion muss mit NULL-Werten, boolschen Werten und natürlich auch Datumswerten umgehen können. Von der verwendung der angejahrten mysql-Funktionen rate ich in diesem Zusammenhang ab. Der OP sollte die mysqli-Funktionen oder PDO verwenden.

Interessant wären - wie bei Datenbankproblemen üblich - die Versionen der beiden beteiligten Datenbankmanagementsysteme.


Freundliche Grüße

Vinzenz

nach obennach unten

MS-SQL -> MySQL

Die folgende Nachricht zum Thema stammt von: Vinzenz Mai, 31. 03. 2008, 09:54

Hallo Marc,

»» ich soll alle 3 Minuten

nutze den SQL-Server-Agent.

»» die letzten 5 Datensätze aus einer MS-SQL-Tabelle alle Datensätze auslesen

Was nun, die letzten fünf oder alle?

»» und 1:1 in eine MySQL-Tabelle schreiben. Bereits vorhandene Datensätze sollen ohne Fehlermeldung überschrieben werden.

»» Die Abfrage (ich hoffe, sie funktioniert) hab ich hinbekommen,

Nein, die funktioniert hinten und vorne nicht.

»» die Aktualisierung auch,

Du hast die Aktualisierung hinbekommen? Wie? Wo?

»» $query = "SELECT * FROM `tabelle` ORDER BY `tabelle`.`lfd_nr` DESC LIMIT 0, 5 ";

MS SQL-Server leidet - wie ich - unter einer Backtick-Allergie und kennt bis einschließlich MS SQL-Server 2005 keine LIMIT-Klausel sondern TOP - siehe Handbuch. Das hier ist MySQL-Syntax, T-SQL wird Dir Fehlermeldungen um die Ohren schlagen. Maskierungszeichen in T-SQL, die hier sowieso völlig überflüssig sind, sind die eckigen Klammern.

SELECT * ist böse, hier sowieso. Gib die komplette Spaltenliste an. Du benötigst diese sowieso für das REPLACE-Statement, alternativ könntest Du auch INSERT ... ON DUPLICATE KEY UPDATE verwenden. Schließlich kann es erforderlich sein, die Datentypen geeignet zu konvertieren.

Nutze Prepared Statements mit der verbesserten MySQL-Erweiterung oder PDO.


Freundliche Grüße

Vinzenz

nach oben
Teil von SELFHTML Forum Teil von SELFHTML Forumsarchiv Teil von 2008 Teil von März

© 1998-2006 Seite Impressum, Software: Classic Forum