如何在更改列后向表中添加行? (SQLite,JAVA)

时间:2016-11-03 01:50:19

标签: java sql sqlite

我正在尝试向表中添加行。最初,我有这个代码,但它创建了一个错误,有8列(其他列被更改,最初我只有2列)但我只添加2个值:

PreparedStatement addDate = 
con.prepareStatement("insert into contributions values(?,?)");

           addDate.setString(2, string);
           addDate.execute();
     }

然后我尝试了这个:

  public void addDateToContributionsTable(String string) throws ClassNotFoundException, SQLException {
         if(con == null) {
             // get connection
             getConnection();
         }
          Statement st = con.createStatement();
          ResultSet rs = st.executeQuery("Select * from contributions");
          ResultSetMetaData rsmd = rs.getMetaData();
          int columnsNumber = rsmd.getColumnCount();
          StringBuilder sb = new StringBuilder();
          for(int i= 0; i < columnsNumber; i++){
              sb.append("?");
              sb.append(",");
          }

          System.out.println(sb.toString());
          System.out.println("insert into contributions values('"+sb.toString()+"')");
          PreparedStatement addDate = con
                    .prepareStatement("insert into contributions values('"+sb.toString()+"')");


          addDate.setString(2, string);
          addDate.execute();
     }

但我仍然遇到同样的错误:

  [SQLITE_ERROR] SQL error or missing database (table contributions has 8 columns but 1 values were supplied)

任何帮助将不胜感激。 :)

3 个答案:

答案 0 :(得分:0)

值不知道应该在哪里插入,所以我建议为每个值编写列名。

reparedStatement addDate = 
con.prepareStatement("insert into contributions (COLUMN_NAMES) values (?,?)");

       addDate.setString(2, string);
       addDate.execute();
 }

答案 1 :(得分:0)

您在SQL中添加了多个绑定参数,但您只绑定了其中一个:

addDate.setString(2, string);

您需要为每个绑定参数调用setXXX()。

如果您确定要使用相同的值,则可以改为使用命名参数,然后您不必多次调用setXXX()。你可以参考这个: Named parameters in JDBC

此外,questionMarksList和StringBuilder sb在两个循环中做同样的事情。

修改

如果你的SQL有2个问号,你有2个绑定参数,那么你需要设置两个绑定参数。

e.g。对于具有3个绑定参数的SQL:

INSERT INTO MYTABLE VALUES(?, ?, ?)

您需要提供3个值:

addDate.setString(1, "String1"); // Bind to first question mark
addDate.setString(2, "String2"); // etc.
addDate.setString(3, "String3");

答案 2 :(得分:0)

感谢所有回复我的问题。问题出在多少?每次增加或减少列数时,我都会发表声明。我的陈述唯一的问题是有这个表达式&#39;&#39; 。当我把它改成&#34; + questionMarks +&#34;而不是&#39;&#34; + questionMarks +&#34;&#39;,它起作用了。无论我使用多少setXXX()方法的数量多少?与表上的列数相同,它将起作用。有了下面的代码,我没有遇到任何错误。

  PreparedStatement addmembers = con
                    .prepareStatement("insert into membersdata values "+questionMarks+"");
                  addmembers.setString(2, name);
                  addmembers.setString(3, accounts);
                  addmembers.setString(4, email);
                  addmembers.execute();