无法在ucanaccess中执行update语句

时间:2015-02-05 16:39:35

标签: java sql ms-access ucanaccess

我有一个连接到Microsoft Access数据库。一旦我建立了连接,我就试图通过以下查询获取该表中的所有内容。

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

据我所知,这很好。然后我有一个与rSet.nex()一样运行的while循环。

在我的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网站上可以看出它也适用于此。

编辑:

用于查询抛出PUBLIC.NZ(DOUBLE)错误的SQL:

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;

2 个答案:

答案 0 :(得分:3)

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

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

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

请注意,hsqldb支持SQL 2003标准的一些高级功能(如MERGE INTO),它们与UCanAccess一起使用,并且在某些情况下可以作为“智能”(但标准)替代解决方案满足您的要求(请参阅此{{3 }})。

答案 1 :(得分:0)

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

  1. 将PreparedStatement与此参数一起使用(" SELECT * FROM YourTableName",ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_UPDATABLE,ResultSet.CLOSE_CURSORS_AT_COMMIT)。执行以使用ExecuteQuery()生成Resultset。最后,使用以下两种方法更新Resultset:UpdateString(如果字段类型为String)和UpdateRow。
  2. 使用2个语句:
  3. 
    
        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'");
        }