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>

我在这里的某些地方出错了吗.....调用此方法来保存已编辑的数据表行....但是数据库记录没有得到更新。当我在数据表中编辑特定行并单击右标记以保存更改时,正在调用 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,不必要的重复Class#forName()调用和完全不必要 newInstance()的调用,控制器类中的紧耦合数据访问代码,不使用快速连接池,所有这些都与具体问题无关,到目前为止发布的代码看起来不错。

只是,您将rno值设置为第三个参数,而您准备好的 SQL 字符串中只有 2 个。

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

我不确定这是否是粗心的过度简化,或者您是否真的阅读了服务器日志以获取任何有关 的迹象e.printStackTrace(),但这是不对的。确保ul.rno在参数索引 2 上设置了 。我还宁愿修复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。你应该做一个空检查:

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

    return bdate;
}
于 2012-09-21T11:20:09.087 回答