Java 无法在ucanaccess中执行update语句

Java 无法在ucanaccess中执行update语句,java,sql,ms-access,ucanaccess,Java,Sql,Ms Access,Ucanaccess,我已连接到Microsoft Access数据库。一旦我建立了连接,我将尝试从我使用以下查询访问的表中获取所有内容 ResultSet rSet = stmt.executeQuery("Select * FROM DraftNightQuery") 据我所知,这很好用。然后我有一个while循环,它运行的时间与rSet.nex()一样长 在我的while循环中,我尝试运行一个update语句,如下所示: connec.executeUpdate("UPDATE DraftNightQuery

我已连接到Microsoft Access数据库。一旦我建立了连接,我将尝试从我使用以下查询访问的表中获取所有内容

ResultSet rSet = stmt.executeQuery("Select * FROM DraftNightQuery")
据我所知,这很好用。然后我有一个while循环,它运行的时间与rSet.nex()一样长

在我的while循环中,我尝试运行一个update语句,如下所示:

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(双精度)
错误:

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;

我可以看到两个不同的问题:

-新西兰的一个问题(双重)。我刚刚实现了nz(text),因此在下一个版本(我将尽快发布,可能在下周发布)中会修复它缺乏实现

-第二个是关于在查询中使用UPDATESQL语句。 Access select查询不是物理表,即使它们看起来像。 它们只是选择查询。 如果对select查询执行更新,access可以更新基础表中的数据:查询中使用的表和更新中涉及的表。因此,这是喷气式引擎可以完成的复杂工作,如果使用不当,也可能导致糟糕和不清楚的SQL代码。UCanAccess依赖于Hsqldb,在许多情况下,Hsqldb不允许在视图上使用update语句。 因此,必须直接对要更新的表调用SQL update语句


请注意,hsqldb支持SQL 2003标准中的一些高级功能(如合并到),这些功能可与UCanAccess一起使用,并且在某些情况下可以作为“智能”(但标准)替代解决方案来满足您的需求(请参见此)。

您不能使用UCanAccess使用标准选择查询更新结果集。您有两个选择:

  • 使用带有此参数的PreparedStatement(“从表名中选择*”、ResultSet.TYPE_FORWARD_ONLY、ResultSet.CONCUR_Updateable、ResultSet.CLOSE_CURSORS_AT_COMMIT)。执行以使用ExecuteQuery()生成结果集。最后,调用这两个方法更新结果集:UpdateString(如果字段类型是String)和UpdateRow
  • 使用2个语句:
  • st1=conn.createStatement();
    rs=st1.executeQuery(“从MyTable中选择*);
    while(rs.next()){
    st2=连接createStatement();
    st2.executeUpdate(“更新MyTable SET MyField='New Value',其中MyField2类似'Condition'”;
    
    }
    不要在查询和更新中使用相同的语句对象。@gknicker我应该指定,在循环中,我再次说stmt=con.createStatement。还是使用完全不同的变量更好?是的,当然。你还在用另一个。它支持结果集。我已将其更改为
    Statement connec=con.createStatement()并且它仍然给出相同的错误。我还更新了我原来的帖子,以反映修改后的代码。好的,谢谢。对不起,我不知道。听起来您的access数据库文件被设置为只读,或者可能是驱动程序中的错误。感谢您的帮助。我最终按照@GordThompson的建议编辑了原始表,这似乎做得很好。虽然NZ(double)错误仍然存在,但我目前没有尝试对该查询执行任何操作,因此没有什么紧迫性。