我正在尝试在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);
}
}
以下是表格信息:
答案 0 :(得分:4)
使用隐式INSERT
语句时,提供的值的数量必须等于表中列的总数,例如
INSERT INTO tableName VALUES (val1, val2)
在上面的查询中,预期的列数为2,因为您提供了两个值。
如果有增量字段,则必须在其上传递null
值。但如果没有,则需要指定要插入值的列名,例如
INSERT INTO tableName (col1, col2) VALUES (val1, val2)
作为旁注,必须参数化值以避免sql injection
。请参阅以下文章:
更新1
由于未在所有列上插入值,因此需要指定列名称。
INSERT INTO Patients (pIDNo, pFName, pLName, pMI)
VALUES (...)
答案 1 :(得分:1)
pIDNo,pFName,pLName,pMI的类型是什么?
将类型更改为varchar以接收文本输入。
答案 2 :(得分:0)
你可能将ID字段设置为auto,所以不应该在插入中传递它?您应该在insert语句中列出字段,例如INSERT INTO dbo.Patients(column1,column2 ...)。请参阅here。