Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA写访问数据库、检索和索引_Java_Ms Access_Resultset - Fatal编程技术网

JAVA写访问数据库、检索和索引

JAVA写访问数据库、检索和索引,java,ms-access,resultset,Java,Ms Access,Resultset,我正在将数据从Java写入Windows 32位上的Access数据库。当我写一条记录时,我需要检索行ID/主键,这样我就可以a)方便地更新记录,b)交叉引用该记录的其他数据 当我在C中做了类似的事情时,我可以创建一个可更新的游标,它允许我编写一条新记录并同时检索行ID。在Java中,看起来我应该能够做到这一点,但它抛出了一个异常,下面的代码如下 con = openAccessDatabase(); String selectString = "SELECT ID, RunCo

我正在将数据从Java写入Windows 32位上的Access数据库。当我写一条记录时,我需要检索行ID/主键,这样我就可以a)方便地更新记录,b)交叉引用该记录的其他数据

当我在C中做了类似的事情时,我可以创建一个可更新的游标,它允许我编写一条新记录并同时检索行ID。在Java中,看起来我应该能够做到这一点,但它抛出了一个异常,下面的代码如下

    con = openAccessDatabase();
    String selectString = "SELECT ID, RunCount FROM SpeedTable";
    try {
        PreparedStatement selectStatement = con.prepareStatement(selectString, 
                ResultSet.TYPE_SCROLL_INSENSITIVE,
                ResultSet.CONCUR_UPDATABLE);
        ResultSet idResult = selectStatement.executeQuery();
        int id;
        for (int i = 0; i < nWrites; i++) {
            idResult.moveToInsertRow();
            idResult.updateObject(1, null); // this line makes no difference whatsoever !
            idResult.updateInt(2, i);
            idResult.insertRow(); // throws java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver]Error in row
            id = idResult.getInt(1);
        }
        selectStatement.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
con=openAccessDatabase();
String selectString=“从SpeedTable中选择ID、运行次数”;
试一试{
PreparedStatement selectStatement=con.prepareStatement(selectString,
ResultSet.TYPE\u SCROLL\u不敏感,
结果集CONCUR_可更新);
ResultSet idResult=selectStatement.executeQuery();
int-id;
for(int i=0;i
我唯一能做的就是写一条新记录,然后运行另一个查询来获取行id

    String insertString = "INSERT INTO SpeedTable (RunCount) VALUES (?)";
    String idString = "SELECT ID FROM SpeedTable ORDER BY ID DESC";
    //      
    try {
        ResultSet idResult = null;
        PreparedStatement preparedStatement, idStatement;
        preparedStatement = con.prepareStatement(insertString,
                ResultSet.TYPE_FORWARD_ONLY,
                ResultSet.CONCUR_READ_ONLY);
        idStatement = con.prepareStatement(idString, 
                ResultSet.TYPE_FORWARD_ONLY,
                ResultSet.CONCUR_READ_ONLY);

        for (int i = 0; i < nWrites; i++) {
            // write the data into the database
            preparedStatement.setInt(1, i);
            preparedStatement.execute();
            // re-run the query to get the index back from the database. 
            idResult = idStatement.executeQuery();
            idResult.next();
            int lastIndex = idResult.getInt(1);
            idResult.close();
        }
String insertString=“插入到速度表(运行计数)值(?);
String idString=“按ID DESC从SpeedTable订单中选择ID”;
//      
试一试{
结果集idResult=null;
已编制的报表已编制的报表;
preparedStatement=con.prepareStatement(插入字符串,
ResultSet.TYPE_FORWARD_ONLY,
结果集CONCUR_只读);
idStatement=con.preparest陈述(idString,
ResultSet.TYPE_FORWARD_ONLY,
结果集CONCUR_只读);
for(int i=0;i
这可以工作,但当表中的记录数超过1000条中的10条时,速度会变得非常慢。如果程序的两个部分同时开始写入,也有返回错误ID的风险(不太可能,但并非不可能)


我知道至少有一个建议是要么不使用Java,要么不使用Access,但它们不是选项。它也是免费开源软件包的一部分,所以我不愿意支付任何费用。编写自己的C JNI接口,提供我的应用程序所需的基本功能,就更不吸引人了。

我不确定f这适用于MS Access,但您可以尝试:

st.executeUpdate("INSERT INTO SpeedTable (RunCount) VALUES (1000)", Statement.RETURN_GENERATED_KEYS);
ResultSet rs = st.getGeneratedKeys();
rs.next();
long id = rs.getLong(1);

您应该能够针对连接实例选择@@identity。谢谢。MS Access不能使用它。进一步阅读表明没有解决方案。我将解决这个问题,可能是读取一次索引,然后保留一个内部计数器,除非索引非常关键。