[英]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.