mysqldump.exe in Process auslagern

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Marcus Gräfe.

    mysqldump.exe in Process auslagern

    Hey,
    ich habe ein Problem, und zwar versuche ich, einen mysqldump.exe-Aufruf aus Schönheitsgründen in einen Prozess auszulagern bzw. einen Prozess zu erschaffen, der mit Parametern mysqldump.exe + Parameter aufruft und verarbeitet.
    Das Problem ist aber, dass ich, wenn ich entweder den kompletten Dateipfad mit Parametern in den File-Parameter des Prozesses oder die Parameter in den Para-Parameter (wtf...) des Prozesses geschrieben hab oder alles in die Process.StartInfo-Klasse geschrieben hab und immer eine Win32Exeption bekommen hab, die lt. Beschreibnung sagt, das die Date nicht existiert, obwohl, wenn ich den kompletten Befehl in die cmd.exe schreibe alles wie geplant verläuft.

    Hier mal der Code, da steht letzten endes alles drin, was ich mal versucht hab (Auszug):

    VB.NET-Quellcode

    1. Option Explicit On
    2. Imports Import_Export.Functions
    3. Imports MySql.Data.MySqlClient
    4. Public Class Form1
    5. Dim Pfad As String
    6. Dim User As String
    7. Dim Recover As String
    8. Dim Pass As String
    9. Dim Host As String
    10. Dim Path As String
    11. Dim DB1 As String
    12. Dim DB2 As String
    13. Dim DB3 As String
    14. Dim Pfad_DB1 As String
    15. Dim Pfad_DB2 As String
    16. Dim Pfad_DB3 As String
    17. Dim Path_DB1 As String
    18. Dim Path_DB2 As String
    19. Dim Path_DB3 As String
    20. Dim cmd1 As String
    21. Dim cmd2 As String
    22. Dim cmd3 As String
    23. Dim Dump As String
    24. Dim Reco As String
    25. Dim Pro_import As New Process()
    26. Dim Pro_export As New Process()
    27. Function Setup() '.ini-Variablen holen
    28. Label8.Text = "Hinweis: Das Programm benötigt nur einen einzigen Dateinamen." + vbNewLine + " Dieser kann z.B. ein Datum oder eine Versionsangabe enthalten." + vbNewLine + " Um die Dateien zu unterscheiden, hängt das Programm die Datenbanknamen, " + vbNewLine + " wie in der der Konfiguration angegeben, an."
    29. INIDatei.Pfad = "C:\Users\Laurenz\AppData\Roaming\Import_Export\setup.ini"
    30. If Not My.Computer.FileSystem.FileExists(INIDatei.Pfad) Then
    31. MessageBox.Show("Die erforderliche setup.ini existiert entweder noch nicht, oder wurde versehentlich gelöscht. Bitte tragen Sie in den Einstellungen die jeweiligen Daten zur Wiederherstellung der Datei ein.", "Fehler")
    32. Return Nothing
    33. Exit Function
    34. End If
    35. User = INIDatei.WertLesen("Con", "User")
    36. Pass = INIDatei.WertLesen("Con", "Pass")
    37. Host = INIDatei.WertLesen("Con", "Host")
    38. DB1 = INIDatei.WertLesen("DB", "DB1")
    39. DB2 = INIDatei.WertLesen("DB", "DB2")
    40. DB3 = INIDatei.WertLesen("DB", "DB3")
    41. Chb_DB1.Text = Chb_DB1.Text & " (" & INIDatei.WertLesen("DB", "DB1") & ")"
    42. Chb_DB2.Text = Chb_DB2.Text & " (" & INIDatei.WertLesen("DB", "DB2") & ")"
    43. Chb_DB3.Text = Chb_DB3.Text & " (" & INIDatei.WertLesen("DB", "DB3") & ")"
    44. Dump = INIDatei.WertLesen("MySQL", "mysqldump.exe")
    45. Reco = INIDatei.WertLesen("MySQL", "mysql.exe")
    46. Return Nothing
    47. End Function
    48. Function Query(Methode)
    49. Pfad = Txt_Save.Text
    50. If (Methode = 1) Or (Methode = 2) Then 'Methode 1 --> Export/Backup; Methode 2 --> Import/Recovery
    51. Else
    52. MessageBox.Show("Fehlerhaftes Argument in der Abfragenfunkton!", "Fehler")
    53. Return 900
    54. Exit Function
    55. End If
    56. If (Pfad = Nothing) Then
    57. MessageBox.Show("Bitte geben Sie eine Datei zum Speichern und exportieren der Datenbank an!", "Fehler: Keine Datei angegeben")
    58. Return 901
    59. Exit Function
    60. End If
    61. If (Methode = 1) Then
    62. Pfad_DB1 = Pfad.Substring(0, Pfad.IndexOf(".")) + "_" + INIDatei.WertLesen("DB", "DB1") + ".sql"
    63. Pfad_DB2 = Pfad.Substring(0, Pfad.IndexOf(".")) + "_" + INIDatei.WertLesen("DB", "DB2") + ".sql"
    64. Pfad_DB3 = Pfad.Substring(0, Pfad.IndexOf(".")) + "_" + INIDatei.WertLesen("DB", "DB3") + ".sql"
    65. MessageBox.Show(Pfad_DB1 & vbNewLine & Pfad_DB2 & vbNewLine & Pfad_DB3 & vbNewLine & vbNewLine & DB1 & vbNewLine & DB2 & vbNewLine & DB3)
    66. If (Chb_DB1.Checked = True) Then
    67. cmd1 = Dump + " -e -u" & User & " -p" & Pass & " -h" & Host & " " & DB1 & " > " & Pfad_DB1 & " "
    68. 'Pro_export.StartInfo.WorkingDirectory = Dump
    69. 'Pro_export.StartInfo.FileName = "mysqldump.exe"
    70. 'Pro_export.StartInfo.Arguments = " -e -u" & User & " -p" & Pass & " -h" & Host & " " & DB1 & " > " & Pfad_DB1 & " "
    71. 'Pro_export.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
    72. Pro_export.Start("C:\xampp\mysql\bin\mysqldump.exe -e -urecovery -precovery_digikam -hlocalhost digikam > C:\Users\Laurenz\Documents\FA_Tests\1_digikam_digikam.sql")
    73. MsgBox(cmd1)
    74. Shell("C:\xampp\mysql\bin\mysqldump.exe -e -urecovery -precovery_digikam -hlocalhost digikam > C:\Users\Laurenz\Documents\FA_Tests\1_digikam_digikam.sql")
    75. Return 100
    76. End If
    77. If (Chb_DB2.Checked = True) Then
    78. cmd2 = "-e -u" & User & " -p" & Pass & " -h" & Host & " " & DB2 & " > " & Pfad_DB2 & " "
    79. Pro_export.Start(Dump, cmd2)
    80. Return 101
    81. End If


    Die MsgBox() Sachen sind eigentlich nur zum Debuggen gedacht, damit ich die Strings, die entstehen, betrachten kann.


    Wäre cool, wenn jmd ne Idee hätte, wie ich dieses Problem lösen könnte (und ja, ich habe es auch mal mit Shell() probiert).

    Vielen Dank im Voraus:) :D
    Hey

    1) Heilige Mutter Maria.. Mein Gehirn streikt bei deiner Problembeschreibung :P
    2) Ich denke das könnte an dem ">" liegen. Hatte mit solche Zeichen auch Probleme.
    3) Deine StartInfo Sachen sind auch unvollständig:

    VB.NET-Quellcode

    1. Dim proc As New Process
    2. proc.StartInfo.FileName = "C:\blabla.exe"
    3. proc.StartInfo.Arguments = "deine komischen Args"
    4. proc.StartInfo.UseShellExecute = False
    5. proc.StartInfo.RedirectStandardInput = True
    6. proc.StartInfo.RedirectStandardOutput = True
    7. proc.StartInfo.CreateNoWindow = False
    8. proc.Start()

    So hätte ich es mal gemacht. Wurde nicht von mir getestet..

    LG
    Bitte benutze OPTION STRICT ON.
    Und optional OPTION EXPLICIT ON.
    Hier ein CODE-CONVERTER.

    Suchanfragen-Ansatz für GOOGLE.
    Prüfe deinen Beitrag in einer RECHTSCHREIBPRÜFUNG.

    Hey, danke schonmal für deine Rückmeldung, das Programm spuckt jetzt zumindest keine merkwürdige Fehlermeldung aus. Dennoch Bleibt das Problem, dass er den Befehl, der in der cmd funktioniert, nicht ausführen will. Liegt es vllt. an irgendeiner fehlenden MySQL-Resource oder fehlenden bereichtigungen?

    LG sepperwelt

    sepperwelt schrieb:

    Dennoch Bleibt das Problem, dass er den Befehl, der in der cmd funktioniert, nicht ausführen will.
    Pack mal den Aufruf in eine Batch-Datei. Wenn das funktionieert, geht es auch über Process.
    Wenn Du händisch Eingaben machen musst, musst Du über den redirecteten Input arbeiten.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Okay, hab jetzt den -e Parameter rausgelöscht, nachdem mir die Batch nen Fehler angezeigt hatte. Danach gings auch in der Batch, aber nach Änderung immernoch nicht in VB.NET.(

    VB.NET-Quellcode

    1. If (Chb_DB1.Checked = True) Then
    2. Pro_export.StartInfo.FileName = Dump
    3. Pro_export.StartInfo.Arguments = " -u" & User & " -p" & Pass & " -h" & Host & " " & DB1 & " > " & Pfad_DB1 & " "
    4. Pro_export.StartInfo.UseShellExecute = False
    5. Pro_export.StartInfo.RedirectStandardInput = True
    6. Pro_export.StartInfo.RedirectStandardOutput = True
    7. Pro_export.StartInfo.CreateNoWindow = True
    8. Pro_export.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
    9. Pro_export.Start()
    10. MsgBox(Dump)
    11. MsgBox(Pro_export.StartInfo.Arguments)
    12. 'MsgBox(cmd1)
    13. Shell("C:\xampp\mysql\bin\mysqldump.exe -urecovery -precovery_digikam -hlocalhost digikam > C:\Users\Laurenz\Documents\FA_Tests\1_digilkhjökjlökjlökam_digikam.sql")
    Klär mich mal auf: was macht denn dieser Parameter "-e".
    Bzw: Was machen generell deine Parameter?
    Bitte benutze OPTION STRICT ON.
    Und optional OPTION EXPLICIT ON.
    Hier ein CODE-CONVERTER.

    Suchanfragen-Ansatz für GOOGLE.
    Prüfe deinen Beitrag in einer RECHTSCHREIBPRÜFUNG.

    sepperwelt schrieb:

    VB.NET-Quellcode

    1. Pro_export.StartInfo.Arguments = " -u" & User & " -p" & Pass & " -h" & Host & " " & DB1 & " > " & Pfad_DB1 & " "
    machst Du

    VB.NET-Quellcode

    1. .Arguments = String.Format("-u{0} -p{1} -h{2} {3} > {4}", User, Pass, Host, DB1, Pfad_DB1)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Okay, leuchtet ein. Klappt es mit den Tipps von @RodFromGermany und mir?
    Bitte benutze OPTION STRICT ON.
    Und optional OPTION EXPLICIT ON.
    Hier ein CODE-CONVERTER.

    Suchanfragen-Ansatz für GOOGLE.
    Prüfe deinen Beitrag in einer RECHTSCHREIBPRÜFUNG.

    Ihr beide habt mich ein großes Stück weiter gebracht. Du, @SystemException hast schonmal den Win32Exeption-Fehler behoben und @RodFromGermany hat mal etwas ordnung in den Laden gebracht. Vielen Lieben Dank dafür:) :D


    Okay, ich habs jetzt rausgefunden: Man darf nicht > %Pfad% nehmen, sondern --result-file %path%. Ich danke euch allen, dass ihr mmir geholfen habt!
    Eine schöne Woche euch:)

    LG sepperwelt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „sepperwelt“ ()

    Habe ich doch gesagt.
    Lg
    Bitte benutze OPTION STRICT ON.
    Und optional OPTION EXPLICIT ON.
    Hier ein CODE-CONVERTER.

    Suchanfragen-Ansatz für GOOGLE.
    Prüfe deinen Beitrag in einer RECHTSCHREIBPRÜFUNG.

    Datenbankimport ohne SQL/mysql.exe

    Servus,
    mein Problem ist, dass ich eine Datenbank per VB.NET importieren will. Mein Plan, dass über einen Prozess zu lösen, sollte eigentlich auch gehen, aber die Prozessparameter lassen es nicht zu, dass ich > und < schreibe. Zum Export hab ich schon mysqldump.exe mit --result-file genutzt. Bei mysql.exe klappt das aber nur mit < und mysqlimport.exe verarbeitet nur Tabellen. FDrage: gibt es eine Möglichkeit bei mysql.exe das < zu umgehen oder mit einem anderen Programm dateinamensunabhängig eine ganze DB auf einmal zu importieren?

    Vielen Dank im Voraus

    *Threads zusammengeführt*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()