簡體   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