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
答案 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;
}
变量dob
为null
。你应该做一个nullcheck:
public String getBdate() {
if (dob != null) {
bdate = new SimpleDateFormat(DATE_FORMAT).format(dob);
}
return bdate;
}