2013-08-22 35 views
0

我一直在尝试将值保存到名为“CLIENT”的数据库中。将数据插入数据库 - org.h2.jdbc.JdbcSQLException:列数不匹配; SQL语句:

package Database; 

//STEP 1. Import required packages 
import java.sql.*; 

public class JDBCExampleCreateTables { 
    // JDBC driver name and database URL 
    private static String JDBC_DRIVER = "org.h2.Driver"; 
    private static String DB_URL = "jdbc:h2:file:C:/WAKILI/WAKILIdb"; 

    // Database credentials 
    private static String USER = "sa"; 
    private static String PASS = ""; 

    public static void main (String[] args) { 
     Connection conn = null; 
     Statement stmt = null; 

     try { 
      //STEP 2: Register JDBC driver 
      Class.forName(JDBC_DRIVER); 

      //STEP 3: Open a connection 
      System.out.println("Connecting to a selected database..."); 
      conn = DriverManager.getConnection(DB_URL, USER, PASS); 
      System.out.println("Connected database successfully..."); 

      //STEP 4: Execute a query 
      System.out.println("Creating table in given database..."); 
      stmt = conn.createStatement(); 

      String sql = "CREATE TABLE CLIENT " + 
        "(ID INT UNSIGNED NOT NULL AUTO_INCREMENT, " + 
        " fullNames VARCHAR(255), " + 
        " iDNumber VARCHAR(255), " + 
        " pINNumber VARCHAR(255), " + 
        " passportNumber VARCHAR(255), " + 
        " postOfficeBoxNumber VARCHAR(255), " + 
        " postalCode VARCHAR(255), " + 
        " telephoneNumberLandline VARCHAR(255), " + 
        " telephoneNumberMobile VARCHAR(255), " + 
        " CARD VARCHAR(255)) "; 

      stmt.executeUpdate(sql); 
      System.out.println("Created table in given database..."); 

     } 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 
} // end 

说我想有保存到数据库中的类是:

package Database; 

//STEP 1. Import required packages 
import java.sql.*; 

public class JDBCExampleInsertRecords { 
    public final String values; 
    public final String table; 

    public JDBCExampleInsertRecords (String values, String table) 
    { 
     this.values = values; 
     this.table = table; 
    } 

    // JDBC driver name and database URL 
    private static String JDBC_DRIVER = "org.h2.Driver"; 
    private static String DB_URL = "jdbc:h2:file:C:/WAKILI/WAKILIdb"; 

    // Database credentials 
    private static String USER = "sa"; 
    private static String PASS = ""; 

    public static void main() { 
     Connection conn = null; 
     Statement stmt = null; 

     try { 
      //STEP 2: Register JDBC driver 
      Class.forName(getJDBC_DRIVER()); 

      //STEP 3: Open a connection 
      System.out.println("Connecting to a selected database..."); 
      conn = DriverManager.getConnection(getDB_URL(), getUSER(), getPASS()); 
      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 CLIENT " + "VALUES ((values))"; 
      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 

    /** 
    * @return the JDBC_DRIVER 
    */ 
    public static String getJDBC_DRIVER() { 
     return JDBC_DRIVER; 
    } 

    /** 
    * @param aJDBC_DRIVER the JDBC_DRIVER to set 
    */ 
    public static void setJDBC_DRIVER(String aJDBC_DRIVER) { 
     JDBC_DRIVER = aJDBC_DRIVER; 
    } 

    /** 
    * @return the DB_URL 
    */ 
    public static String getDB_URL() { 
     return DB_URL; 
    } 

    /** 
    * @param aDB_URL the DB_URL to set 
    */ 
    public static void setDB_URL(String aDB_URL) { 
     DB_URL = aDB_URL; 
    } 

    /** 
    * @return the USER 
    */ 
    public static String getUSER() { 
     return USER; 
    } 

    /** 
    * @param aUSER the USER to set 
    */ 
    public static void setUSER(String aUSER) { 
     USER = aUSER; 
    } 

    /** 
    * @return the PASS 
    */ 
    public static String getPASS() { 
     return PASS; 
    } 

    /** 
    * @param aPASS the PASS to set 
    */ 
    public static void setPASS(String aPASS) { 
     PASS = aPASS; 
    } 
} //end 

是可以获得价值的代码是在

数据库通过这段代码创建类被称为“AddNewClient”和如下:

public String getValues() { 
    String fullNames = fullNamesJTextField.getText(); 
    String iDNumber = identificationNumberJTextField.getText(); 
    String pINNumber = pINNumberJTextField.getText(); 
    String passportNumber = passportNumberJTextField.getText(); 
    String postOfficeBoxNumber = postOfficeBoxNumberJTextField.getText(); 
    String postalCode = postalCodeJTextField.getText(); 
    String telephoneNumberLandline = telephoneNumberLandlineJTextField.getText(); 
    String telephoneNumberMobile = telephoneNumberMobileJTextField.getText(); 

    List<String> client = new ArrayList<String>(); 

    client.add(fullNames); 
    client.add(iDNumber); 
    client.add(pINNumber); 
    client.add(passportNumber); 
    client.add(postOfficeBoxNumber); 
    client.add(postalCode); 
    client.add(telephoneNumberLandline); 
    client.add(telephoneNumberMobile); 

    StringBuilder builder = new StringBuilder(); 
    String listStringClient = ""; 

    for (String s : client) 
    { 
     listStringClient += "NULL" + "'" + s + "'" + ","; 
    } 

    return listStringClient; 
} 

我得到一个错误信息:

run: 
Connecting to a selected database... 
Connected database successfully... 
Inserting records into the table... 
org.h2.jdbc.JdbcSQLException: Column count does not match; SQL statement: 

我在过去两天一直没有成功。我会非常非常非常感谢任何会来救我的人。谢谢。

回答

2

这是其中一个问题是:

String sql = "INSERT INTO CLIENT " + "VALUES ((values))"; 
stmt.executeUpdate(sql); 

值应的GetValues()方法,而不是只是一个字符串,所以

String sql = "INSERT INTO CLIENT VALUES (" + getValues() + ")"; 

此外,由于您不指定哪些列,因此假定所有列都是被输入的值。如果CARD在您的SQL数据库中没有缺省值,并且它不能为NULL,那么您将遇到问题。

最后,这是一个有些奇怪:

for (String s : client) 
{ 
    listStringClient += "NULL" + "'" + s + "'" + ","; 
} 

你想要的值,而不是 'NULL',所以它应该是

for (String s : client) 
{ 
    listStringClient += "'" + s + "'" + ","; 
} 

最后,你的方式这样做,你将不得不在最后一个额外的逗号(例如:“值1”,“值”,“值3”)

剪辑的最后一个逗号:

return listStringClient.substring(0, listStringClient.size() - 1); 

当然,还有一种更好的方法可以做到for循环,因为你没有额外的逗号。

末结束,SQL字符串应该是这样的:

"INSERT INTO CLIENT VALUES('value1','value2','value3','value4','value5','value6')" 

做一个的System.out.println(SQL),并看到字符串声明是什么,你要执行。那么你会看到错误。

这里建立自己的价值观字符串没有逗号问题有更好的方式:我不能感谢大家足够的惊人答案

Iterator<String> iter = client.iterator(); 
StringBuilder sb = new StringBuilder(); 

while (iter.hasNext()) { 
    sb.append("'").append(iter.next()).append("'"); 
    if (iter.hasNext()) 
     sb.append(","); 
} 
return sb.toString(); 
+0

我不是一个有经验的程序员,我一直在试图教自己如何编程软件。你介意教我怎样才能做一个循环,让我没有逗号? –

+0

我会使用一个迭代器,因为当你迭代你的List时,你可以检查是否会有下一个值并添加一个逗号。看到我编辑的答案。 – hotforfeature

1

您不会在您的声明中传递任何价值。下面的代码是静态的,它没有参数:

INSERT INTO CLIENT " + "VALUES ((values)) 

这是无稽之谈SQL命令:INSERT INTO CLIENT VALUES((值))。你想表达

String sql = "INSERT INTO CLIENT VALUES " + getValues()"; 

我更喜欢使用PreparedStatement的,因为它是安全的,它会逃跑危险字符:

String sql = "INSERT INTO PRODUCT VALUES(?,?,?,?,?,?,?,?,?,?)"; 
PreparedStatement prest = con.prepareStatement(sql); 
prest.setString(1, "asdf"); 
prest.setInt(2, 2009); 
// etc 
int count = prest.executeUpdate(); 
1

你忘记提及值CARD列。如果你不想在那里设置任何值,只需通过' '

for循环应该是这样的

for (String s : client) 
{ 
    listStringClient += "NULL" + "'" + s + "'" + ",";//GIVES YOU ERROR BECAUSE AT THE END OF 
}            // FOR LOOP IT HAS , IN THE END OF STRING. 
listStringClient+="' '";//This is for CARD COLUMN. 
1

我认为不是的:

String sql = "INSERT INTO CLIENT " + "VALUES ((values))"; 

你想要的东西,如:

String sql = "INSERT INTO CLIENT " + "VALUES ("+getValues()+")"; 

同样的getValues的实施是一种奇怪:

for (String s : client) 
{ 
    listStringClient += "NULL" + "'" + s + "'" + ","; 
} 

也许它可能是:

for (String s : client) 
{ 
    listStringClient += "'" + s + "'," 
} 
listStringClient += "NULL"; 
0

。我提出了各种想法,并针对我的问题提出了解决方案。

我对上述问题的工作答案需要Leos Literak,abmitchell,Vimal Bera和Grisha的答案。

package Database; 

//STEP 1. Import required packages 
import java.sql.*; 

public class JDBCExampleCreateTables { 
    // JDBC driver name and database URL 
    private static String JDBC_DRIVER = "org.h2.Driver"; 
    private static String DB_URL = "jdbc:h2:file:C:/WAKILI/WAKILIdb"; 

    // Database credentials 
    private static String USER = "sa"; 
    private static String PASS = ""; 

    public static void main (String[] args) { 
     Connection conn = null; 
     Statement stmt = null; 

     try { 
      //STEP 2: Register JDBC driver 
      Class.forName(JDBC_DRIVER); 

      //STEP 3: Open a connection 
      System.out.println("Connecting to a selected database..."); 
      conn = DriverManager.getConnection(DB_URL, USER, PASS); 
      System.out.println("Connected database successfully..."); 

      //STEP 4: Execute a query 
      System.out.println("Creating table in given database..."); 
      stmt = conn.createStatement(); 

      String sql = "CREATE TABLE CLIENT " + 
        "(ID INT UNSIGNED NOT NULL AUTO_INCREMENT, " + 
        " fullNames VARCHAR(255), " + 
        " iDNumber VARCHAR(255), " + 
        " pINNumber VARCHAR(255), " + 
        " passportNumber VARCHAR(255), " + 
        " postOfficeBoxNumber VARCHAR(255), " + 
        " postalCode VARCHAR(255), " + 
        " telephoneNumberLandline VARCHAR(255), " + 
        " telephoneNumberMobile VARCHAR(255)) "; 

      stmt.executeUpdate(sql); 
      System.out.println("Created table in given database..."); 

     } 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 
} // end 

是保存到数据库中的类是:

package Database; 

//STEP 1. Import required packages 
import java.sql.*; 

public class JDBCExampleInsertRecords { 
    public static String values; 
    public final String table; 

    public JDBCExampleInsertRecords (String values, String table) 
    { 
     this.values = values; 
     this.table = table; 
    } 

    // JDBC driver name and database URL 
    private static String JDBC_DRIVER = "org.h2.Driver"; 
    private static String DB_URL = "jdbc:h2:file:C:/WAKILI/WAKILIdb"; 

    // Database credentials 
    private static String USER = "sa"; 
    private static String PASS = ""; 

    public static void main() { 
     Connection conn = null; 
     Statement stmt = null; 

     try { 
      //STEP 2: Register JDBC driver 
      Class.forName(getJDBC_DRIVER()); 

      //STEP 3: Open a connection 
      System.out.println("Connecting to a selected database..."); 
      conn = DriverManager.getConnection(getDB_URL(), getUSER(), getPASS()); 
      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 CLIENT VALUES (NULL, " + (values) + ")"; 

      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 

    /** 
    * @return the JDBC_DRIVER 
    */ 
    public static String getJDBC_DRIVER() { 
     return JDBC_DRIVER; 
    } 

    /** 
    * @param aJDBC_DRIVER the JDBC_DRIVER to set 
    */ 
    public static void setJDBC_DRIVER(String aJDBC_DRIVER) { 
     JDBC_DRIVER = aJDBC_DRIVER; 
    } 

    /** 
    * @return the DB_URL 
    */ 
    public static String getDB_URL() { 
     return DB_URL; 
    } 

    /** 
    * @param aDB_URL the DB_URL to set 
    */ 
    public static void setDB_URL(String aDB_URL) { 
     DB_URL = aDB_URL; 
    } 

    /** 
    * @return the USER 
    */ 
    public static String getUSER() { 
     return USER; 
    } 

    /** 
    * @param aUSER the USER to set 
    */ 
    public static void setUSER(String aUSER) { 
     USER = aUSER; 
    } 

    /** 
    * @return the PASS 
    */ 
    public static String getPASS() { 
     return PASS; 
    } 

    /** 
    * @param aPASS the PASS to set 
    */ 
    public static void setPASS(String aPASS) { 
     PASS = aPASS; 
    } 
} //end 

是可以获得价值的代码是在一个名为“AddNewClient”级和

数据库通过这段代码创建如下:

public String getValues() { 
    String fullNames = fullNamesJTextField.getText(); 
    String iDNumber = identificationNumberJTextField.getText(); 
    String pINNumber = pINNumberJTextField.getText(); 
    String passportNumber = passportNumberJTextField.getText(); 
    String postOfficeBoxNumber = postOfficeBoxNumberJTextField.getText(); 
    String postalCode = postalCodeJTextField.getText(); 
    String telephoneNumberLandline = telephoneNumberLandlineJTextField.getText(); 
    String telephoneNumberMobile = telephoneNumberMobileJTextField.getText(); 

    List<String> client = new ArrayList<String>(); 

    client.add(fullNames); 
    client.add(iDNumber); 
    client.add(pINNumber); 
    client.add(passportNumber); 
    client.add(postOfficeBoxNumber); 
    client.add(postalCode); 
    client.add(telephoneNumberLandline); 
    client.add(telephoneNumberMobile); 

    Iterator<String> iter = client.iterator(); 
    StringBuilder sb = new StringBuilder(); 

    while (iter.hasNext()) { 
     sb.append("'").append(iter.next()).append("'"); 
     if (iter.hasNext()) 
      sb.append(","); 
    } 

    return sb.toString(); 
    } 
相关问题