无法在ucanaccess中执行更新语句

问题描述 投票:2回答:2

我已连接到Microsoft Access数据库。建立连接后,我试图从该表中获取所有内容,并通过以下查询进行访问。

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;
java sql ms-access ucanaccess
2个回答
3
投票

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

-nz(double)的问题。我刚刚实现了nz(text),因此缺少在下一个版本中修复的实现(我将尽快发布该版本,可能会在下周发布)。

-第二个关于在查询上使用更新sql语句。访问选择查询即使看起来像也不是物理表。它们只是选择查询。如果对选择查询执行更新,则访问权限可以更新基础表中的数据:基础表在查询中使用并且在更新中涉及。因此,如果使用不当,Jet引擎可以完成一些复杂的事情,并且可能会导致错误和不清楚的SQL代码。 UCanAccess依赖Hsqldb,在许多情况下,Hsqldb不允许在视图上进行更新语句。因此,您必须直接在要更新的表上调用SQL更新语句。

注意,hsqldb支持SQL 2003 standard的某些高级功能(例如MERGE INTO),这些功能可以与UCanAccess一起使用,并且在某些情况下可以作为您的要求的“智能”(但标准)替代解决方案(请参见thread) 。


0
投票

您无法使用UCanAccess通过标准SELECT查询更新结果集。您有两个选择:

  1. 使用带有此参数的PreparedStatement(“ SELECT * FROM YourTableName”,ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_UPDATABLE,ResultSet.CLOSE_CURSORS_AT_COMMIT)。执行以使用ExecuteQuery()生成结果集。最后,更新您的结果集,调用以下两个方法: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'");
    }
© www.soinside.com 2019 - 2024. All rights reserved.