将值从jtable发送到sql时出现SQL异常

时间:2016-05-16 10:12:49

标签: java sql-server swing

我遇到了问题。当我尝试通过存储过程将数据从jtable发送到sql数据库时。在这里我在做什么:

将数据插入jtable

String b= jLabel116.getText(),c=jTextField6.getText(),e=jTextField20.getText(),f=jTextField25.getText(),g=jTextField48.getText();

float x,y,z;
x=Float.parseFloat(jTextField25.getText());
y=Float.parseFloat(jTextField48.getText());
z=x*y;
String total1=String.valueOf(z);

DefaultTableModel df = (DefaultTableModel) jTable5.getModel();
df.addRow(new Object[]{b,c,d,f,g,total1});
int rowsCount = jTable5.getRowCount();
int Price = 0,Qty=0, total=0;
for(int i=0;i<rowsCount;i++){
Price += Integer.parseInt(jTable5.getValueAt(i,3).toString());
Qty += Integer.parseInt(jTable5.getValueAt(i,4).toString());  
}
total = Price*Qty;
System.out.println(total);
jTextField26.setText(String.valueOf(total));
jTextField51.setText(String.valueOf(total));
jTextField50.setText(String.valueOf(Qty));
jTable5.setModel(df);

将数据发送到数据库

try{
    DefaultTableModel df = new DefaultTableModel();
    df=(DefaultTableModel) jTable5.getModel();
             CallableStatement cs=m.XC.prepareCall("call Prod_SALE (?,?,?,?,?,?,?,?)");    
        for (int i = 0; i < df.getRowCount(); i++) {
            for (int j = 0; j < df.getColumnCount(); j++) {
                Object o = df.getValueAt(i, j);
                System.out.println("object from table is  : " +o);
            cs.setString(j+1, (String)o);
          cs.addBatch();
            }
      cs.executeBatch();
          cs.clearParameters();
        }
    }
    catch(Exception ex){
         ex.printStackTrace();

错误异常:

java.sql.SQLException: Parameter-Set has missing values.
    at sun.jdbc.odbc.JdbcOdbcPreparedStatement.addBatch(JdbcOdbcPreparedStatement.java:1546)

请帮助我....我无法解决它

2 个答案:

答案 0 :(得分:1)

在设置一个参数后,您可以在内部循环(变量addBatch)中调用j。显然这会失败,因为你有8个参数。 PreparedStatement.addBatch的Javadoc说:

  

向此PreparedStatement对象的批处理添加一组参数   命令。

您需要将调用移至内部循环中的addBatch。 (也许executeBatch也应该移出外部循环(变量i)。

DefaultTableModel df = (DefaultTableModel) jTable5.getModel();
CallableStatement cs=m.XC.prepareCall("call Prod_SALE (?,?,?,?,?,?,?,?)");    
for (int i = 0; i < df.getRowCount(); i++) 
{
    for (int j = 0; j < df.getColumnCount(); j++) 
    {
        Object o = df.getValueAt(i, j);
        System.out.println("object from table is  : " +o);
        cs.setString(j+1, (String)o);
    }
    cs.addBatch();
}
cs.executeBatch();

答案 1 :(得分:0)

如消息所示,您尚未在SQL中设置所有值。