2015-02-05 56 views
1

我有一個連接到Microsoft Access數據庫。一旦我建立了連接,我試圖從下面的查詢中訪問該表中的所有內容。無法執行ucanaccess中的更新語句

ResultSet rSet = stmt.executeQuery("Select * FROM DraftNightQuery") 

據我可以告訴,這工作正常。然後我有一個while循環,只要rSet.nex()就會運行。

在我while循環中我試圖運行它看起來像這樣的更新語句:

connec.executeUpdate("UPDATE DraftNightQuery SET OwnerID='"+x+"' WHERE Last='"+split[0]+"' AND First='"+split[1]+ "' "); 

和它拋出這個錯誤:

net.ucanaccess.jdbc.UcanaccessSQLException: INSERT, UPDATE, DELETE or TRUNCATE not permitted for table or view 

我假定它有話使用更新查詢本身,但是這對ODBC起作用,並且從我在UCanAccess網站上可以看出它也適用於此。

編輯:

SQL查詢投擲PUBLIC.NZ(DOUBLE)錯誤:

SELECT TotalStats.ID, Players.First, Players.Last, (Nz([TotalStats].[W]*25))-(Nz([TotalStats].[L]*5))+(Nz([TotalStats].[PG]*10))+(Nz([TotalStats].[QS]*10))+(Nz([TotalStats].[SV]*20))-(Nz([TotalStats].[BS]*5))+(Nz([TotalStats].[Holds]*15))+(Nz([TotalStats].[GF]*5))+(Nz([TotalStats].[Innings]*3))-(Nz([TotalStats].[PH]*1))-(Nz([TotalStats].[ER]*2))-(Nz([TotalStats].[PHR]*8))-(Nz([TotalStats].[PBB]*3))+(Nz([TotalStats].[PK]*5))-(Nz([TotalStats].[PHB]*3))-(Nz([TotalStats].[WP]*1))+(Nz([TotalStats].[CG]*50))+(Nz([TotalStats].[ShO]*75)) AS Points, Owners.TeamName, Players.OwnerID, Players.PositionType 
FROM Owners RIGHT JOIN (Players LEFT JOIN TotalStats ON Players.ID = TotalStats.ID) ON Owners.OwnerID = Players.OwnerID 
WHERE (((Players.PositionType)="Pitch") AND ((Players.DraftStatus)="Drafted")) 
ORDER BY (Nz([TotalStats].[W]*25))-(Nz([TotalStats].[L]*5))+(Nz([TotalStats].[PG]*10))+(Nz([TotalStats].[QS]*10))+(Nz([TotalStats].[SV]*20))-(Nz([TotalStats].[BS]*5))+(Nz([TotalStats].[Holds]*15))+(Nz([TotalStats].[GF]*5))+(Nz([TotalStats].[Innings]*3))-(Nz([TotalStats].[PH]*1))-(Nz([TotalStats].[ER]*2))-(Nz([TotalStats].[PHR]*8))-(Nz([TotalStats].[PBB]*3))+(Nz([TotalStats].[PK]*5))-(Nz([TotalStats].[PHB]*3))-(Nz([TotalStats].[WP]*1))+(Nz([TotalStats].[CG]*50))+(Nz([TotalStats].[ShO]*75)) DESC; 
+0

不要使用相同的語句對象的查詢和更新。 – gknicker 2015-02-05 16:44:28

+0

@gknicker我應該指定,一旦在循環中我再次說stmt = con。的createStatement。 完全使用不同的變量還是更好嗎? – Eabryt 2015-02-05 16:45:25

+0

是的,絕對。你還在使用另一個。它支持ResultSet。 – gknicker 2015-02-05 16:46:31

回答

2

我可以看到兩個不同的問題:

與NZ(雙) - 一個問題。我只是實現了nz(text),所以在下一個版本(我將盡快發佈,可能在下個星期發佈)中缺少實現。

- 第二個是關於在查詢中使用更新sql語句。 訪問選擇查詢不是物理表,即使它們看起來像。 他們只是選擇查詢。 如果對選擇查詢執行更新,則訪問可以更新基礎表中的數據:查詢中使用的表和參與更新的表。所以Jet引擎可以做的更復雜一些,如果使用不當,也可能導致糟糕和不清楚的SQL代碼。 UCanAccess依賴Hsqldb,在很多情況下不允許在視圖上使用更新語句。 因此,您必須直接在要更新的表上調用SQL更新語句。

請注意,hsqldb支持SQL 2003標準(如MERGE INTO)的某些高級功能,可與UCanAccess一起使用,並且在多種情況下可用作您的需求的「智能」(但標準)替代解決方案(請參閱此thread) 。

+2

感謝您的洞察力。我最終得到了@ GordThompson的建議,並且只是編輯了原來的表格,這似乎足以完成這項工作。儘管NZ(double)錯誤依然存在,但我目前沒有試圖對該查詢進行任何操作,所以沒有什麼緊迫的。 – Eabryt 2015-02-06 18:02:47

0

使用UCanAccess無法使用stardard SELECT查詢更新resulset。你有兩個選擇:

  1. 使用PreparedStatement這個參數( 「SELECT * FROM YourTableName」,ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_UPDATABLE,ResultSet.CLOSE_CURSORS_AT_COMMIT)。使用ExecuteQuery()執行以生成結果集。最後,更新你的Resultset調用這兩個方法:UpdateString(如果字段類型是String)和UpdateRow。
  2. 使用2說明:

st1 = conn.createStatement(); 
 
    rs = st1.executeQuery("SELECT * FROM MyTable"); 
 
    while(rs.next()) { 
 
     st2 = conn.createStatement(); 
 
     st2.executeUpdate("UPDATE MyTable SET MyField='New Value' WHERE MyField2 LIKE 'Condition'"); 
 
    }