Je suis en train d'exécuter des commandes SQL de Java à l'aide ProcessBuilder. Mon problème est que je ne peux pas utiliser le même cmd de différentes fonctions. Par exemple, je veux exécuter un fichier SQL lorsque j'appuie sur un bouton. Après cela, je veux maintenir la connexion à sql plus et valider ou annuler la transaction en appuyant sur un autre bouton. Comment garder le processus d'un bouton à l'autre?Essayer d'exécuter des commandes SQL de java
Mon premier code de bouton:
public class MyExec {
public static ProcessBuilder builder;
public static Process p;
public static BufferedReader bri;
public static BufferedReader bre;
public static BufferedWriter p_stdin;
public static void executeScript(String scriptName, String alias, String path, TextArea txtArea) throws IOException {
//obtaining sql script from a share folder
NtlmPasswordAuthentication userCred = new NtlmPasswordAuthentication("domain",
"user", "pass");
SmbFile smbFile=new SmbFile("path" + scriptName, userCred);
File file = new File("D://" + scriptName);
try (InputStream in = smbFile.getInputStream()) {
Files.copy(smbFile.getInputStream(), file.toPath());
}
//init shell
builder = new ProcessBuilder("cmd");
builder.redirectErrorStream(true);
try {
p = builder.start();
} catch (IOException e) {
System.out.println(e);
}
//get stdin of shell
p_stdin =new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
//executing commands in cmd
try {
p_stdin.write("sqlplus sys/[email protected]" + alias +" as sysdba");
p_stdin.newLine();
p_stdin.flush();
p_stdin.write("@"+file.toPath());
p_stdin.newLine();
p_stdin.flush();
} catch (IOException e) {
System.out.println(e);
}
// write stdout of shell (=output of all commands)
String line;
bri = new BufferedReader(new InputStreamReader(p.getInputStream()));
bre = new BufferedReader(new InputStreamReader(p.getErrorStream()));
while ((line = bri.readLine()) != null) {
txtArea.appendText(line + "\n");
System.out.println(line + "\n");
}
while ((line = bre.readLine()) != null) {
txtArea.appendText(line + "\n");
System.out.println(line + "\n");
}
System.out.println("Done.");
}
}
Code bouton Second:
Thread t1 = new Thread(new Runnable() {
public void run() {
//commit the sql script which was run with the first button
try {
MyExec.p_stdin.write("commit");
MyExec.p_stdin.newLine();
MyExec.p_stdin.flush();
MyExec.p_stdin.write("exit");
MyExec.p_stdin.newLine();
MyExec.p_stdin.flush();
//output the result of commiting sql script
String line;
BufferedReader bri = new BufferedReader(new InputStreamReader(MyExec.p.getInputStream()));
BufferedReader bre = new BufferedReader (new InputStreamReader(MyExec.p.getErrorStream()));
while ((line = MyExec.bri.readLine()) != null) {
txtArea.appendText(line + "\n");
System.out.println(line + "\n");
}
MyExec.bri.close();
while ((line = MyExec.bre.readLine()) != null) {
txtArea.appendText(line + "\n");
System.out.println(line + "\n");
}
MyExec.bri.close();
System.out.println("Done.");
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
//event on Commit button, running the thread above
public void commit(ActionEvent e) {
t1.start();
}
Indice: vous n'avez jamais ** jamais de blocs de saisie vides. Ensuite: lisez les conventions de nommage Java. vous n'utilisez pas "_" dans les noms de variables; les noms de variables vont camelCase. Et vraiment important: vous voulez que nous passions ** notre ** temps pour vous aider. Vous prenez donc le temps nécessaire pour formater/indenter ** tout ** correctement votre entrée. – GhostCat
Et puis: éviter la duplication de code. Le code pour mettre à jour votre txtArea est presque identique. Ne fais pas ça. – GhostCat
Veuillez fournir quelques explications supplémentaires sur votre code, ce que vous essayez de faire et le problème que vous rencontrez. Il est difficile de trouver une erreur dans des dizaines ou même des centaines de lignes de code. [Créez un * Exemple * minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve) et lisez [Comment poser une bonne question?] (Http://stackoverflow.com/help/) comment demander). –