2

私は CachedRowSetImpl を使用しています。データベースからデータを取得できますが、挿入できません。

これはコードです:

public class NewClass {

    static final String DATABASE_URL = "jdbc:derby://localhost:1527/TaskDB;create=true";
    static final String USERNAME = "user";
    static final String PASSWORD = "user";

    public static void main (String [] agr) throws SQLException
    {
        CachedRowSetImpl rs = new CachedRowSetImpl();
        rs.setUrl(DATABASE_URL);
        rs.setUsername(USERNAME);
        rs.setPassword(PASSWORD);

        rs.setCommand("SELECT * FROM TASKTABLE");
        rs.execute();

        rs.moveToInsertRow();
        rs.updateString("Column_Name","DataString");

        rs.insertRow();
        rs.moveToCurrentRow();
        rs.updateRow();
    }

}

例外をスローします:

スレッド「メイン」での例外 java.sql.SQLException: NewClass.main(NewClass.java:32) の com.sun.rowset.CachedRowSetImpl.insertRow(CachedRowSetImpl.java:5462) で行の挿入に失敗しました

CachedRowSetImpl の代わりに JdbcRowSetImpl を試しましたが、問題なく動作します

更新:私はこのコードを使用して、例外に関する詳細をキャッチしました:

    catch(SQLException e) {
     do {
        System.out.println("SQLState:" + e.getSQLState());
        System.out.println("Error Code:" + e.getErrorCode());
        System.out.println("Message:" + e.getMessage());
        Throwable t = e.getCause();
        while(t != null) {
            System.out.println("Cause:" + t);
            t = t.getCause();
        }
        e = e.getNextException();
    } while (e != null);
}

出力は次のとおりです。

SQLState:null

エラーコード:0

メッセージ: 行の挿入に失敗しました

4

2 に答える 2

2

私はあなたと同じ問題に遭遇しましたがacceptChanges(cnnt)、APIが述べたように、例外がスローされた場所を最後に置きました。

....

cachedSet.moveToInsertRow();
cachedSet.updateInt(1,12);
cachedSet.updateString(2,"Joe");
cachedSet.updateString(3,"abcde");
cachedSet.insertRow();
cachedSet.moveToCurrentRow();
cachedSet.acceptChanges(cnnt);

.....

最後の なしで実行するとrow(acceptChanges(cnnt))、例外はスローされませんが、DB は更新されません。

最後のもので実行すると、あなたが得たのと同じ例外が発生します。acceptChanges()を確認し、 API からのドキュメントを取得しました。

SQLException - if the cursor is on the insert row 

のドキュメントを確認しましたinsertRow():

SQLException - データベース アクセス エラーが発生した場合。結果セットの同時実行性が CONCUR_READ_ONLY である場合、このメソッドがクローズされた結果セットで呼び出される場合、カーソルが挿入行にないときにこのメソッドが呼び出される場合、または挿入行の null 非許容列のすべてに非値が指定されていない場合-ヌル値

そこから何かを得ることができるかもしれません。

于 2012-08-30T15:43:23.437 に答える
0

rs.acceptChanges(); を呼び出す必要があります。rs.updateRow(); の代わりに

rs.updateRow(); を置き換えてみてください。次のように:

try{
   jrs.acceptChanges();
}catch(SyncProviderException spe){
  //Conflict handling code.
}
于 2012-08-16T00:38:27.957 に答える