0

我正在尝试将 TextField 值保存到数据库中,但出现错误:

org.h2.jdbc.JdbcSQLException: Column count does not match; SQL statement:
INSERT INTO KIWI VALUES (104, ) [21002-173]

我希望在调用“addClient()”方法时将客户的名字保存到数据库中。

谁能帮我让它工作?谢谢大家。

我在 JavaFx 中工作,并且正在从使用 JavaFx SceneBuilder 创建的 FXML 文件中调用“TextField firstName”。我试过在控制器中初始化它,但没有成功。有任何想法吗?我认为这些类型的对象不应该被初始化,至少按照我理解的 JavaFx 规则。

控制器类:

import java.net.URL;
import java.sql.SQLException;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TextField;
import wakiliproject.Forms.AddNew.DB.NewClientDB;

public class NewClientController implements Initializable {

    @FXML
    public TextField firstName;

    // Initializes the controller class.
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }

    @FXML
    public void addClient() throws SQLException {
        new NewClientDB().main();
    }
}

数据库类:

import Database.Plain.Skell.DBConnect;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import wakiliproject.Forms.AddNew.NewClientController;

public class NewClientDB extends NewClientController {

    private String firstNames = new NewClientController().firstName.getText();

    public void main() throws SQLException {
        Connection conn = DBConnect.connect();
        Statement stmt = null;
        try {

            //STEP 3: Open a connection
            System.out.println("Connecting to a selected database...");
            System.out.println("Connected database successfully...");

            //STEP 4: Execute a query
            System.out.println("Inserting records into the table...");
            stmt = conn.createStatement();

            String sql = "INSERT INTO KIWI "
                    + "VALUES (104, " + (firstNames) + ")";
            stmt.executeUpdate(sql);
            System.out.println("Inserted records into the table...");

        } catch (SQLException se) {
            //Handle errors for JDBC
            se.printStackTrace();
        } catch (Exception e) {
            //Handle errors for Class.forName
            e.printStackTrace();
        } finally {
            //finally block used to close resources
            try {
                if (stmt != null) {
                    conn.close();
                }
            } catch (SQLException se) {
            }// do nothing
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException se) {
                se.printStackTrace();
            }//end finally try
        }//end try
        System.out.println("Goodbye!");
    }//end main
}

编辑:
我认为没有选择 TextField 值

4

2 回答 2

0

这里有很多问题。

您不能使用新语句创建新的控制器类并期望它与 FXMLLoader 创建的实例相同。删除这一行:

private String firstNames = new NewClientController().firstName.getText();

NewClientDB 不应扩展 NewClientContoller。FXMLLoader 对子类一无所知。

将 firstName 从您的控制器传递到您的 NewClientDB 实例。

new NewClientDB().main(firstName);

....

public void main(String firstNames)

在插入语句中的 firstNames 字符串周围放置单引号。

"INSERT INTO KIWI VALUES (104, '" + (firstNames) + "')";

确保您的 KIWI 表只有两列类型与您的插入语句兼容。

检查您的 FXML 是否为 firstName 提供 fx:id。

检查您是否在 FXML 中定义了一个触发 #addClient 的按钮

如果上述方法不能解决您的问题,请编辑您的问题以包含您的 KIWI 表 DDL 和您的 FXML 文件。

于 2013-10-04T05:42:20.413 回答
0

作为旁注,您应该使用PreparedStatements. 您将避免连接错误以及 SQL 注入。

但是您的问题似乎来自这样一个事实,即您在用户有机会在那里输入任何内容之前就获得了价值。我不熟悉 JavaFX,但您当前的代码在程序开始时获取文本字段值(当它显然仍然为空时)。当您单击按钮或其他内容时,它不应该执行添加吗?

于 2013-10-03T19:24:57.703 回答