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

pst.setBinaryStream(4, rst.getBinaryStream(1), (int) rst.getString(1).length());トリックをしました。

于 2012-09-26T12:46:31.477 に答える
0

編集 2 の一部として表示されるエラーは、メソッドが実装されていないことを示しています。

MySQL-BLOB-setBinaryStreamを見てみてください

テスト 3 はストリームの長さで渡されており、このメソッドは実装されているようです。

これらのテストで使用されている JDBC 3.0 を使用していると想定しています。

于 2012-09-26T11:20:10.730 に答える
0

2 つの UPDATE ステートメントを使用できます。1 つは個人情報用、もう 1 つはファイル用です。後者は、ユーザーが実際に新しい写真をアップロードしたときにのみ実行されます (Web フォーム経由で送信されたときは簡単に確認できます)。

または、2 つの UPDATE ステートメントを使用することもできます。1 つは個人情報のみを更新し、もう 1 つは個人情報とファイルを更新します。以前と同様に、後者はユーザーが実際に新しい写真をアップロードしたときに実行されます。

于 2012-09-26T10:54:27.520 に答える