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 网站上的信息,它也应该适用于此。

编辑:

查询抛出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;
4

2 回答 2

3

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

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

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

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

于 2015-02-06T18:00:54.903 回答
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'");
    }

于 2015-02-21T00:26:05.917 回答