繁体   English   中英

使用Java的MS Access数据库

[英]ms access database with java

我正在创建一个Java程序,通过它我可以将其编辑到Microsoft Access数据库中。 我有一个特定的情况,在这种情况下,我需要搜索表中是否已经存在某个记录,如果存在,我想对其进行更新,否则,我想从头开始创建它。

我发现了这段代码:

IF EXISTS (SELECT * FROM USERS WHERE USERID=@UID) select 1 else select 

这段代码给我一个错误,说应该是SELECT,UPDATE或DELETE语句。

在我自己尝试过的代码中,我完成了以下操作:

try{
            s = con.createStatement();
            s.executeQuery("SELECT * FROM table WHERE date='" + today + "'");
            rset = s.getResultSet();    

            if (rset.getString("date") == null){

                s = con.createStatement();     
                s.executeUpdate("INSERT INTO table VALUES ('" + today + "','" + cflow + "','" + vat + "','" + cnn + "')");

            }
        }

        catch (SQLException exp)
        {
            System.err.println(exp);
        }

但是使用此代码,当记录尚不存在时,用户输入不会在数据库内部更新。

谢谢你的时间 :)

第一:如果我没记错的话,那就是

IF EXISTS (SELECT * FROM USERS WHERE USERID=@UID) select 1 else select 

不完整的事务sql语句-由sql引擎从数据库系统使用。

第二名:

if (rset.getString("date") == null){}

您应该避免这种方式,因为有很大的机会获取Nullpointer异常。

在我眼中,更好的方法是测试结果集的大小是否为零,或者测试结果集本身是否为NULL值

如果也不会执行UPDATE语句,请直接使用数据库引擎-Ms Access,SQL Server等-检查您的SELECT语句。 好处是您可以在SELECT查询中排除错误。

(rset.getString("date") == null)

应该

(!rset.next())

rset定位在返回第一个结果之前。 如果要获取“下一个”结果,则next()返回true。

另外,您的“日期”变量是什么数据类型? 不能保证date.toString()会为MS-Access版本的SQL正确格式化日期。

而是准备一份声明

PreparedStatement ps = connetion.prepareStatement("SELECT * from table where date=?");

并将日期设置为

ps.setDate(1, date);

然后使用准备好的语句发出查询。

这样可以保存所有toString()问题。 (我还没有编译它,几乎可以肯定不会按原样工作,但是这个想法就在那里)。

那这个呢?

SELECT IF EXISTS (SELECT * FROM USERS WHERE USERID=@UID) THEN 1 ELSE 0 END

要么

SELECT IF(EXISTS (SELECT * FROM USERS WHERE USERID=@UID), 1, 0)

(我不确定真正的语法在这里。)

这是我用来查找表中最后一个ID的内容。 如果表为空,则不会返回ID。 如果表被填充,那么我需要新记录的下一个ID。

 ResultSet mn = stmt.executeQuery("SELECT MAX(ExamID)FROM ExamResults"); if (mn == null){ jTextField1.setText("1"); } else{ while (mn.next()) { int lastID =Integer.parseInt(""+(mn.getObject(1))); jTextField1.setText(""+(lastID+1)); } } // close the objects mn.close(); stmt.close(); conn.close(); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM