我的表格如下。
++++++++++++++++++++++++++++++++++++++++++++++++++
+ Id : TextBox +
+ Name : TextBox +
+ Mob : TextBox +
+ Photo : File Option +
+ +
+ Submit Update +
++++++++++++++++++++++++++++++++++++++++++++++++++
我想要做的是更新相应Id的数据。如需更新,我的查询如下。
PreparedStatement pst = conn.prepareStatement("UPDATE myTable SET name=?, mob=?, photo=? WHERE id=?");
pst.setString(1, personName);
pst.setString(2, mobileNum);
pst.setBinaryStream(3, InputStreamData);
pst.setString(4, personId);
pst.executeUpdate();
我有问题。我将用场景解释。
假设id为1且我已经拥有personName&的数据文件。现在我只输入手机号码。 。我怎么能避免pst.setBinaryStream(4, InputStreamData);
陈述?我不想输入任何数据,因为数据已经存在。是否有可以插入数据的sql语句。
我只能预填充名称数据而不是文件数据。
解决方法是,有许多UPDATE语句。但问题是我有很多领域。我不能使用这么多的UPDATE语句。
我尝试的是阅读照片数据&在setBinaryStream中设置该数据如下。
pst.setBinaryStream(4, rst.getBinaryStream(1));
但它给我的错误
java.lang.AbstractMethodError: com.mysql.jdbc.PreparedStatement.setBinaryStream(ILjava/io/InputStream;)V
javax.faces.el.EvaluationException: java.lang.AbstractMethodError: com.mysql.jdbc.PreparedStatement.setBinaryStream(ILjava/io/InputStream;)V
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
at javax.faces.component.UICommand.broadcast(UICommand.java:315)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1542)
-
Caused by: java.lang.AbstractMethodError: com.mysql.jdbc.PreparedStatement.setBinaryStream(ILjava/io/InputStream;)V
at com.sac.databean.PersonalInformationDataBean.editPersonalInfo(PersonalInformationDataBean.java:1530)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at javax.el.BeanELResolver.invokeMethod(BeanELResolver.java:779)
at javax.el.BeanELResolver.invoke(BeanELResolver.java:528)
at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:257)
答案 0 :(得分:2)
当用户使用表单编辑他的个人信息时,表格应该预先填写他当前的姓名和电话号码。
这样,如果他只改变他的电话号码,他就不会触摸包含他姓名的姓名输入字段,表格将以他当前的姓名和新的电话号码提交。您可以更新数据库中的所有字段。
这是一个UI问题,而不是数据库问题。
答案 1 :(得分:0)
您可以使用两个UPDATE语句。一个用于个人信息,另一个用于文件。后者仅在用户实际上传新照片时执行(通过网络表单提交时很容易检查)。
或者,您可以拥有两个UPDATE语句,一个仅更新个人信息,另一个更新个人信息和文件。和以前一样,后者将在用户实际上传新照片时执行。
答案 2 :(得分:0)
您在编辑2中遇到的错误是说该方法尚未实施。
尝试查看MySQL-BLOB-setBinaryStream
测试3传递的是流的长度,这种方法似乎已经实现。
我假设您使用的是在这些测试中使用的JDBC 3.0。
答案 3 :(得分:0)
pst.setBinaryStream(4, rst.getBinaryStream(1), (int) rst.getString(1).length());
完成了这个伎俩。