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>



  我在这里的某个地方出错吗...这种方法被称为
  保存数据表的已编辑行...。但是数据库记录不是
  不断更新。当我在数据表中编辑特定行并单击
  在右边的标记上以保存更改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

最佳答案

除了missing finally block,不必要的重复Class#forName()调用和completely unnecessary newInstance()调用之外,控制器类中的tight-coupling数据访问代码,不使用快速连接池,所有这些都与具体问题,到目前为止发布的代码看起来还可以。

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

    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;
}

10-07 19:30
查看更多