2015-02-05 54 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'"); 
 
    }