2

Microsoft Access データベースに接続しています。接続を確立したら、次のクエリでアクセスしているそのテーブルからすべてを取得しようとしています。

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

私が知る限り、それはうまくいきます。次に、rSet.nex() と同じだけ実行される while ループがあります。

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 Webサイトでわかることから、これでも機能するはずです。

編集:

クエリ スロー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

2 つの異なる問題が見られます。

-nz(ダブル)の問題。nz(text) を実装したばかりなので、次のバージョンで修正される実装の欠如です (次の週にできるだけ早くリリースする予定です)。

-2 つ目は、クエリで update sql ステートメントを使用することです。アクセス セレクト クエリは、物理テーブルのように見えても物理テーブルではありません。それらは単なる選択クエリです。選択クエリで更新を実行すると、基になるテーブル (クエリで使用され、更新に関与するテーブル) のデータを更新できます。したがって、これは Jet エンジンが実行できる高度な処理であり、不適切に使用すると、不適切で不明瞭な SQL コードが生成される可能性があります。UCanAccess は、多くの場合、ビューの更新ステートメントを許可しない Hsqldb に依存しています。そのため、更新するテーブルで SQL update ステートメントを直接呼び出す必要があります。

hsqldb は、SQL 2003 標準の一部の高度な機能 (MERGE INTO など) をサポートしていることに注意してください。これは、UCanAccess で動作し、場合によっては、要件の "スマート" (ただし標準) 代替ソリューションとして機能する可能性があります (このスレッドを参照)。

于 2015-02-06T18:00:54.903 に答える
0

UCanAccess を使用して標準の SELECT クエリで結果セットを更新することはできません。次の 2 つのオプションがあります。

  1. このパラメーター ("SELECT * FROM YourTableName"、ResultSet.TYPE_FORWARD_ONLY、ResultSet.CONCUR_UPDATABLE、ResultSet.CLOSE_CURSORS_AT_COMMIT) で PreparedStatement を使用する。ExecuteQuery() で結果セットを生成するために実行します。最後に、UpdateString (フィールド タイプが String の場合) と UpdateRow の 2 つのメソッドを呼び出して、Resultset を更新します。
  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 に答える