0
 I have a managed bean called registerBean.

        private List<registerBean> std;

        public void onEdit(RowEditEvent event) {
            registerBean ul = (registerBean) event.getObject();
            Connection con = null;
            PreparedStatement stat = null;
            ResultSet rs = null;

            try {
                Class.forName("com.mysql.jdbc.Driver").newInstance();
                con = DriverManager.getConnection("jdbc:mysql://localhost:3306/db", "root", "");
                stat = con.prepareStatement("update regtbl set fname=? where rno=?");
                stat.setString(1, ul.fname);
                stat.setInt(3, ul.rno);
                stat.executeUpdate();
                con.commit();
                stat.close();
                con.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    This is my Facelets page

    std.xhtml

    <!-- language: xhtml -->

        <p:dataTable  value="#{registerBean.list}"  var="rb"  rows="10" paginator="true"
            paginatorTemplate=" {FirstPageLink} {PreviousPageLink} {CurrentPageReport}  {NextPageLink}  {LastPageLink} {RowsPerPageDropdown}"
            rowsPerPageTemplate="5,15,20" rowKey="#{rb.fname}" selectionMode="single"
            selection="#{registerBean.selectedStudent}"
            scrollable="true" resizableColumns="true"  editable="true" >
            <p:ajax event="rowEdit" listener="#{registerBean.onEdit}"
                update=":form:messages" />
            <p:ajax event="rowEditCancel" listener="#{registerBean.onCancel}"
                update=":form:messages" />
            <p:column headerText="Roll No" filterBy="#{rb.rno}" sortBy="#{rb.rno}" width="124">
                <h:outputText value="#{rb.rno}" />
            </p:column>
            <p:column headerText="First Name" filterBy="#{rb.fname}" sortBy="#{rb.fname}" width="124">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{rb.fname}" />
                    </f:facet>
                    <f:facet name="input">
                        <h:inputText value="#{rb.fname}" />
                    </f:facet>
                </p:cellEditor>
            </p:column>
            <!-- more columns... -->
        </p:dataTable>

ここでどこか間違っていますか.....このメソッドはdatatableの編集された行を保存するために呼び出されます....しかしデータベースレコードは更新されていません。データテーブルの特定の行を編集し、右のマークをクリックして変更を保存すると、Bean内にあるonEditメソッドが呼び出されます。問題は、データベースの値が同じままであり、更新されたリストがregisterBeanタイプではないことです。registerBeanで、挿入(正常に動作)、データテーブルに表示されるデータベースからの値の取得などの他の操作を実行しています...行編集で問題に直面しています。

Thanks in Advance

Note: Check [this link][1]. My table is similar to this but i am using database.

[1]: http://www.primefaces.org/showcase/ui/datatableEditing.jsf
4

1 に答える 1

3

欠落finallyしているblock、不必要に繰り返されるClass#forName()呼び出しとその上での完全に不必要な newInstance()呼び出し、コントローラー クラスでの密結合データ アクセス コード、高速接続プールを使用しないことは別として、これらはすべて具体的な問題とは関係ありませんが、これまでに投稿されたコード大丈夫そうです。

rno準備した SQL 文字列に 2 つしかないのに、値を 3 番目のパラメーターとして設定しています。

    stat = con.prepareStatement("update regtbl set fname=? where rno=?");
    stat.setString(1, ul.fname);
    stat.setInt(3, ul.rno);

これが不注意に単純化しすぎたのか、サーバー ログを実際に読んでe.printStackTrace(). がパラメータ インデックス 2 に設定されていることを確認してください。また、コードが実行され続けるul.rno原因となる愚かなことも修正したいと思います。e.printStackTrace()

} catch (Exception e) {
    throw new FacesException(e);
}

結局、SQL が実際に正しく、実際に例外が発生しない場合、明らかにそのWHERE句に一致する行はありません。は、影響を受ける行を表す をPreparedStatement#executeUpdate()返します。intそれを入手して、本当に更新があったかどうかを確認することをお勧めします。

int affectedRows = stat.executeUpdate();

if (affectedRows == 0) {
    // No rows affected!
}

また、ul.rno設定した値を確認してください。


最後に更新して、サーバーログを読んで例外の証拠を探しました。例外は基本的に具体的な問題に対する完全な答えであるため、学ぶことが非常に重要であることを理解する必要があります。取得したものは、基本的に次のコードでそれを伝えています

public String getBdate() {
    SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
    bdate = sdf.format(dob);
    return bdate;
}

変数dobnullです。nullcheck を実行する必要があります。

public String getBdate() { 
    if (dob != null) {
        bdate = new SimpleDateFormat(DATE_FORMAT).format(dob);
    }

    return bdate;
}
于 2012-09-21T11:20:09.087 に答える