2016-11-25 13 views
0

NetbeansのJDBCを使用してJavaアプリケーションにデータベースをリンクしました。 しかし、私がTextFieldからMySQLテーブルに何かを書き込もうとすると、それは動作しません。JavaFXでMySQLテーブルにデータを書き込む

データベース接続を行うための既成のクラスがあります。

 package testswitch; 

import java.sql.Connection; 
import java.sql.Driver; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.Enumeration; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

/** 
* 
* @author Maarten 
*/ 

public class Database { 


public final static String DB_DRIVER_URL = "com.mysql.jdbc.Driver"; 
public final static String DB_DRIVER_PREFIX = "jdbc:mysql://"; 

private Connection connection = null; 

public Database(String dataBaseName, String serverURL, String userName, String passWord) { 
    try { 
     // verify that a proper JDBC driver has been installed and linked 
     if (!selectDriver(DB_DRIVER_URL)) { 
      return; 
     } 

     if (serverURL == null || serverURL.isEmpty()) { 
      serverURL = "localhost:3306"; 
     } 

     // establish a connection to a named Database on a specified server 
     connection = DriverManager.getConnection(DB_DRIVER_PREFIX + serverURL + "/" + dataBaseName, userName, passWord); 
    } catch (SQLException eSQL) { 
     logException(eSQL); 
    } 
} 

private static boolean selectDriver(String driverName) { 
    // Selects proper loading of the named driver for Database connections. 
    // This is relevant if there are multiple drivers installed that match the JDBC type. 
    try { 
     Class.forName(driverName); 
     // Put all non-prefered drivers to the end, such that driver selection hits the first 
     Enumeration<Driver> drivers = DriverManager.getDrivers(); 
     while (drivers.hasMoreElements()) { 
      Driver d = drivers.nextElement(); 
      if (!d.getClass().getName().equals(driverName)) { 
       // move the driver to the end of the list 
       DriverManager.deregisterDriver(d); 
       DriverManager.registerDriver(d); 
      } 
     } 
    } catch (ClassNotFoundException | SQLException ex) { 
     logException(ex); 
     return false; 
    } 
    return true; 
} 

public void executeNonQuery(String query) { 
     try (Statement statement = connection.createStatement()) { 
     statement.executeUpdate(query); 
    } catch (SQLException eSQL) { 
     logException(eSQL); 
    } 
} 

public ResultSet executeQuery(String query) { 
    Statement statement; 
    try { 
     statement = connection.createStatement(); 

     ResultSet result = statement.executeQuery(query); 

     return result; 
    } catch (SQLException eSQL) { 
     logException(eSQL); 
    } 

    return null; 
} 

private static void logException(Exception e) { 
    System.out.println(e.getClass().getName() + ": " + e.getMessage()); 

    e.printStackTrace(); 
} 
} 

そして、ここに私のJavaFXコントローラです:

は、ここに私のデータベースクラスです。 「ハンドル」ボタンを押すと、TextFieldに入力されたデータがデータベースに挿入されます。

package testswitch; 

import java.io.IOException; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.scene.control.Button; 
import javafx.scene.control.CheckBox; 
import javafx.scene.control.TextField; 
import javafx.stage.Stage; 
import testswitch.Database; 

/** 
* 
* @author Maarten 
*/ 
public class gebruikerToevoegenController { 

    //TextFields 
    @FXML 
    private TextField FXVoornaam, FXTussenvoegsel, FXAchternaam, FXGebruikersnaam; 
    @FXML 
    private TextField FXWachtwoord, FXEmail, FXTelefoonnummer; 

    //Boolean checkbox positie 
    @FXML 
    private CheckBox ManagerPosition; 
    @FXML 
    private Button gebruikerButton; 

    public final String DB_NAME = "testDatabase"; 
    public final String DB_SERVER = "localhost:3306"; 
    public final String DB_ACCOUNT = "root"; 
    public final String DB_PASSWORD = "root"; 

    Database database = new Database(DB_NAME, DB_SERVER, DB_ACCOUNT, DB_PASSWORD); 

    public void handle(ActionEvent event) throws SQLException { 

     String query = "INSERT INTO testDatabase.Gebruikers (Voornaam) VALUES " + FXVoornaam.getText(); 
     try { 
      database.executeQuery(query); 

     } catch (Exception e) { 

     } 
    } 
} 

おかげで、事前

+0

ここオフトピックである「なぜ、このコードは動作していません」。デバッガを使用して、取得したエラーと取得したエラーとそれらを修正しようとしたものを記述する:http://stackoverflow.com/help/how-to-ask – Vampire

+0

"query" StringをDBMSで直接実行しようとしましたかそのステートメント自体が実際に動作することを確認しますか?また、 "結果"はあなたの "executeQuery"メソッドに何を含んでいますか(有用なものは何ですか?) –

+0

はい、私は実行中のクエリを試して、それが動作します。私は結果がデータベースへの接続を保持していると思って、その上にクエリを実行し、私が間違っていれば私を修正し、先に述べたように、あらかじめ作られたクラス – Maarten

答えて

0

にあなたはJavaFXの中で次のように追加する必要があります。

String query = "INSERT INTO testDatabase.Gebruikers (Voornaam) VALUES ('{FXVoornaam.getText()}') "; 
+0

返事をありがとうが、悲しいことに悲しいことにはうまくいきません。 – Maarten

+0

getText()の代わりにrawText()を試してみましたか? – Anands23

+0

私はなぜこのようなことをJavaで書くのかはわかりませんが、私はそれがうまくいかないと確信しています... – fabian

0

、SQLクエリ内の文字列を正しく引用されていないようです。それは、このシナリオのためPreparedStatementを使用するのが最善です:

public class Database { 

    public PreparedStatement prepareStatement(String query) throws SQLException { 
     return connection.prepareStatement(query); 
    } 

    ... 
public void handle(ActionEvent event) throws SQLException { 

    String query = "INSERT INTO testDatabase.Gebruikers (Voornaam) VALUES (?);"; 
    PreparedStatement statement = database.prepareStatement(query); 
    try { 
     statement.setString(1, FXVoornaam.getText()); 
     statement.executeUpdate(); 
    } catch (Exception e) { 
     // log info somewhere at least until it's properly tested/ 
     // you implement a better way of handling the error 
     e.printStackTrace(System.err); 
    } 
} 
+0

ありがとう、これは解決策でした。 – Maarten

0
String query = "INSERT INTO testDatabase.Gebruikers(Voornaam) 
VALUES('" + FXVoornaam.getText() + "')"; 
関連する問題