如何使用 UCanAccess 插入行?

Posted

技术标签:

【中文标题】如何使用 UCanAccess 插入行?【英文标题】:How to INSERT rows using UCanAccess? 【发布时间】:2016-03-07 06:07:23 【问题描述】:

我正在使用 Windows 8 64 位和 NetBeans 8.1、Java 8

我知道在 Java 8 中删除了 jdbc-odbc 桥。我正在使用 ucanaccess 但我有一个问题

我正在尝试使用此代码从 MS Access 读取数据

(1)

package javaapplication1;
/**
*
* @author JAY
*/
import java.sql.*;

public class JavaApplication1 
public static void main(String[] args) 

  Connection cn;
  Statement st;
  ResultSet re;
  try

    Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
    cn=DriverManager.getConnection("jdbc:ucanaccess://D://J//DB//database.accdb");
    st = cn.createStatement();
    re=st.executeQuery("select * from db1");
    while(re.next())
    
       System.out.println(re.getString(1));     
    
    catch(ClassNotFoundException | SQLException e)
    
      System.out.println(e);
    
    

我已经在 msaccess 中手动插入了数据 我们解决了这个问题

运行:

a
a
b
BUILD SUCCESSFUL (total time: 1 second)

但是当我尝试使用以下 Java 代码插入数据时

(2)

package javaapplication1;
/**
*
* @author JAY
*/
import java.sql.*;

public class JavaApplication1 
public static void main(String[] args) 

  Connection cn;
  Statement st;
  ResultSet re;
  try

    Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
    cn=DriverManager.getConnection("jdbc:ucanaccess://D://J//DB//database.accdb");
    st = cn.createStatement();
    re=st.executeQuery("insert into db1 values('a','a')");

    System.out.println("inserted")     

    catch(ClassNotFoundException | SQLException e)
    
      System.out.println(e);
    
  

我收到了这个错误:

net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::3.0.3.1 java.lang.NullPointerException java.lang.NullPointerException
BUILD SUCCESSFUL (total time: 0 seconds)

第三次尝试后

(3)

/**
*
* @author JAY
*/
import java.sql.*;

public class JavaApplication1 
public static void main(String[] args) 

  Connection cn;
  Statement st;
  ResultSet re;
  String ID ="username"; 
  String NAME="password";  


  try

    Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
    cn=DriverManager.getConnection("jdbc:ucanaccess://D://J//DB//database.accdb");
    st = cn.createStatement();
    String q ="insert into db1 values('"+ID+"','"+NAME+"'))";
    st.executeQuery(q);

    System.out.println("inserted")     

    catch(ClassNotFoundException | SQLException e)
    
      System.out.println(e);
    



我尝试了很多不同的插入方式:

String q ="insert into db1 (ID,NAME) values('"+ID+"','"+NAME+"'))";

当我评论已经通过上边并尝试直接插入值时

String q ="insert into db1 (ID,NAME) values('a','b'))";

但出现此错误

run:
net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::3.0.3.1 unexpected token: )
BUILD SUCCESSFUL (total time: 0 seconds)

【问题讨论】:

What is a Null Pointer Exception, and how do I fix it?的可能重复 insert into db1 (ID,NAME) values('a','b')) 是无效的 SQL。那应该是insert into db1 (ID,NAME) values('a','b') - 最后只有一个关闭) 【参考方案1】:

您正在尝试使用 executeQuery 执行 INSERT,但 executeQuery 仅用于 SELECT 查询。尝试改用executeUpdate

String q = "INSERT INTO db1 ([ID], [NAME]) VALUES (?, ?)";
PreparedStatement st = cn.prepareStatement (q);
st.setString(1, "a");
st.setString(2, "b");
st.executeUpdate();

【讨论】:

如果 ID 是自动递增的怎么办...?如何将值传递给它? @戈德 @gumuruh - ***.com/a/43323859/2144390

以上是关于如何使用 UCanAccess 插入行?的主要内容,如果未能解决你的问题,请参考以下文章

格式化 UCanAccess 的时间字段

如何将 Jaspersoft Studio 与 UCanAccess 一起使用?

插入时的 JDBC PreparedStatement 默认值 (UCanAccess)

使用 UCanAccess 插入 ResultSet 时出现“必须在插入之前设置所有列”错误

使用 UCanAccess 从大文本文件中插入数据非常慢

在 Ucanaccess 中插入错误