1

我正在尝试在 sql 上将数据插入到我的数据库中,并且在运行程序后发生错误并说:

[Microsoft][ODBC SQL Server Driver][SQL Server]Insert Error: Column name or number of supplied values does not match table definition.

我该如何解决?谁能告诉我我的代码有什么问题?

这是代码:

private void btnInsertActionPerformed(java.awt.event.ActionEvent evt) {
        try {
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

        String url = "jdbc:odbc:****";
        String user = "****";
        String pass = "****";
        Connection connection = DriverManager.getConnection(url, user, pass);
        Statement statement = connection.createStatement();
        String pIDNo = txtPatientID.getText();
        String pFName = txtpFName.getText();
        String pLName = txtpLName.getText();
        String pMI = txtpMI.getText();

        String sql = "INSERT INTO dbo.Patients VALUES (" + 
                (pIDNo)+",'"+(pFName)+"','"+(pLName)+"','"+(pMI)+"')";
        statement.executeUpdate(sql);
        JOptionPane.showMessageDialog(rootPane, "Patient Added!");
        }catch (Exception ex) {
            JOptionPane.showMessageDialog(this, ex.getMessage());
            System.exit(1);
        }
    }

这是表格信息:

病人表

4

3 回答 3

4

使用隐式INSERT语句时,提供的值的数量必须等于表中列的总数量,例如

INSERT INTO tableName VALUES (val1, val2)

在上面的查询中,预期的列数是两个,因为您提供了两个值。

当存在递增字段时,您必须null在其上传递值。但如果没有,您需要指定将为其插入值的列名,例如

INSERT INTO tableName (col1, col2) VALUES (val1, val2)

作为旁注,必须对值进行参数化以避免 from sql injection。请参阅下面的文章:

更新 1

由于您没有在所有列上插入值,因此需要指定列名。

INSERT INTO Patients (pIDNo, pFName, pLName, pMI)
VALUES (...)
于 2013-04-04T05:16:03.390 回答
1

pIDNo、pFName、pLName、pMI 的类型是什么?

将类型更改为 varchar 以接收文本输入。

于 2013-04-04T05:16:09.997 回答
0

您可能将 ID 字段设置为自动,所以不应该在插入中传递它?您应该在插入语句中列出字段,例如 INSERT INTO dbo.Patients(column1, column2...)。见这里

于 2013-04-04T05:16:32.557 回答