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;
}
变量
dob
是null
。您应该进行nullcheck:public String getBdate() {
if (dob != null) {
bdate = new SimpleDateFormat(DATE_FORMAT).format(dob);
}
return bdate;
}