【问题标题】:ms access database with java用java ms访问数据库
【发布时间】:2011-07-26 20:26:30
【问题描述】:

我正在创建一个 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);
        }

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

感谢您的宝贵时间 :)

【问题讨论】:

    标签: java sql ms-access


    【解决方案1】:

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

    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 查询中的错误。

    【讨论】:

    • 感谢您的快速回复 :) 我已经尝试过测试 null 的结果集,实际上这就是它最初的方式,但没有奏效。现在我尝试将其测试为 0,java 给了我一个错误,说“java.sql.ResultSet and int”..
    • @Brian Zammit 您不应该测试 rset 是否等于 0,您应该测试大小/计数/他们所说的是否为 0 或更大,如果 size > 0 则您有一行或多行数据库。你为什么不做一个 select count(...) 并检查你是否得到 0 或其他东西?
    • 哦是的..我会检查更多的细节..谢谢..因为我从未使用过选择计数,我不确定如何使用它...
    • 我刚刚找到了有关选择计数的更多信息。rgagnon.com/javadetails/java-0292.html 实际上看起来很简单 xD.. 我会试一试..
    • 我试了一下,但是在某些情况下,记录不存在,当我尝试 rs.next() 时,它给了我一个空指针异常...
    【解决方案2】:

    这个怎么样?

    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)
    

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

    【讨论】:

      【解决方案3】:
      (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() 问题。 (我还没有编译这个,它几乎肯定不会按原样工作,但想法就在那里)。

      【讨论】:

      • 是的,好点..我觉得自己像个白痴,以前没有想过这个..但是它仍然没有用 -.- 谢谢你的回复
      【解决方案4】:

      这是我用来查找表中最后一个 ID 的内容。如果表为空,则将返回 no 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();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-01
        • 1970-01-01
        • 2012-12-25
        • 1970-01-01
        • 2013-12-04
        相关资源
        最近更新 更多