相关的程序如下:
public static void saveToDB(String message){ 
decodeMSG(message); 
Info i = new Info(); 
String time = i.time; 
String info = i.info; 
String url = "jdbc:odbc:test"; try { 
Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver"); 

catch(java.lang.ClassNotFoundException e) { 
System.out.print("ClassNotFoundException: "); 
System.out.println(e.toString()); 

try{ 
Connection con = DriverManager.getConnection (url); 
//Statement stmt = con.createStatement(); 
PreparedStatement pstmt=con.prepareStatement("INSERT INTO test(time,info) VALUES (?,?)"); 
pstmt.setString(1,time); 
pstmt.setString(2,info); 
pstmt.executeUpdate(); 
pstmt.close(); 
con.close(); 
}catch (SQLException ex) { 
ex.printStackTrace(); 

} public static Info decodeMSG(String message){ //解析消息 
Info i = new Info(); 
StringTokenizer st=new StringTokenizer(message,"*"); 
i.time = st.nextToken(); 
if(st.hasMoreTokens()){ 
i.info=st.nextToken(); 

return i; 
} 在得到message之后用saveToDB方法,先调用decodeMSG方法解析消息,然后写入数据库 
因为要return多个值就写了个Info类 
class Info{ 
public static String time; 
public static String info; 

但始终报错,完整错误信息如下:
java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] INSERT INTO 语句的语法错误。 
at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6958) 
at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7115) 
at sun.jdbc.odbc.JdbcOdbc.SQLExecute(JdbcOdbc.java:3150) 
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.execute(JdbcOdbcPreparedStatement.java:214) 
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.executeUpdate(JdbcOdbcPreparedStatement.java:136) 
at TestServer.saveToDB(TestServer.java:54) 
at ServerThread.run(TestServer.java:170) 

解决方案 »

  1.   

    是不是test表字段有不能为空的列呀?
      

  2.   

    access有很多限制的,特别是不要使用time,user这种关键字作为表名,字段名...
      

  3.   

    to sxm1945:
    test表的字段都是可以为空的
    而且我也试过在后台输出要写入的String time 和info,都不为nullto li_d_s:
    是指time,user这种类似与保留字的字段么?我改改试试看...
      

  4.   

    ...果然,把time改了就可以了...
    纠结了我一整天的问题啊...- -
      

  5.   

    access很变态的,不管是表名还是字段名,用多个单词的组合或者加入下划线之类的来做会比较好一些,关键字太多了,防不胜防