DataTable - InCell编辑---如何使用编辑的值更新数据库

时间:2012-09-20 19:58:37

标签: java jsf jdbc primefaces

 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中编辑特定行并单击时   在右边标记保存更改onEdit方法被调用哪个   在bean里面。问题是数据库值保持不变   获取更新列表的类型为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

1 个答案:

答案 0 :(得分:3)

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

仅在您准备好的SQL字符串中只有2时,将rno值设置为第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;
}