3

我的表格如下。

++++++++++++++++++++++++++++++++++++++++++++++++++
+   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 & file 的数据。现在我只输入手机号码。. 我怎么能避免pst.setBinaryStream(4, InputStreamData);声明?我不想输入任何数据,因为数据已经存在。有没有可以插入数据的sql语句。

我只能预填充名称数据,但不能预填充文件数据。

编辑 1

对此的解决方案是,有许多 UPDATE 语句。但问题是我有很多领域。我不能使用这么多 UPDATE 语句。

编辑 2

我尝试的是读取照片数据并在 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)
4

4 回答 4

2

当用户使用表单编辑他的个人信息时,表单应该预先填充他当前的姓名和电话号码。

这样,如果他只更改了他的电话号码,他将不会触摸包含他的姓名的姓名输入字段,并且表单将提交他的当前姓名和他的新电话号码。您可以更新数据库中的所有字段。

这是一个 UI 问题,而不是数据库问题。

于 2012-09-26T10:25:52.960 回答
0

您可以使用两个 UPDATE 语句。一个用于个人信息,另一个用于文件。后者只会在用户实际上传新照片时执行(通过网络表单提交时很容易检查)。

或者,您可以有两个 UPDATE 语句,一个只更新个人信息,另一个更新个人信息和文件。和以前一样,后者将在用户实际上传新照片时执行。

于 2012-09-26T10:54:27.520 回答
0

作为编辑 2 的一部分,您得到的错误是该方法尚未实现。

尝试查看MySQL-BLOB-setBinaryStream

测试 3 正在传递流的长度,并且该方法似乎已实现。

我假设您使用这些测试中使用的 JDBC 3.0。

于 2012-09-26T11:20:10.730 回答
0

pst.setBinaryStream(4, rst.getBinaryStream(1), (int) rst.getString(1).length());成功了。

于 2012-09-26T12:46:31.477 回答