• 締切済み

JSPでデータベースにファイルを挿入するとエラー

urizakaです さて、現在SQL-ServerのimageフィールドにJSPで指定したデータを入力するというプログラムを組んでいるのですが、ストリームから出力したデータをデータベースに入力しようとすると以下のようなSQLExceptionが出てしまいます。 「End of InputStream reached before satisfying length specified when InputStream was set」  これって、いったいどういうエラーなのでしょうか?  自分でも調べてみたのですが、ファイルのアップロードのプログラムを今回始めてやるせいもあってちんぷんかんぷんです。  尚、ソースコードは以下のようになっております。  public void upFile(InputStream InSte){ String ufStmt = "insert into m_File (tempfile) values(?)"; int num; try{ open(); PreparedStatement stmt = con.prepareStatement (ufStmt); stmt.setBinaryStream(1,InSte,1024); num = stmt.executeUpdate(); stmt.close(); close(); } catch(SQLException ex){ System.out.println("upFileのSQLエラー" + ex); System.out.println(ufStmt); } catch(java.lang.Exception ex){ System.out.println("upFileのエラーB " + ex); } }  すみませんが、宜しくお願いします。

  • Java
  • 回答数1
  • ありがとう数1

みんなの回答

  • mkim
  • ベストアンサー率67% (25/37)
回答No.1

こんにちは。 ちょっとエラー内容については、なんとも言えませんが、 そして、予想ですが、setBinaryStreamがVARCHARと互換性はもつが imageだと駄目とか、そんな気がしたのですが。。。 もし、そうであれば逃げ道として、データ型をimageからVARCHARにする。 もしくは、マッピングするなどになるのかなぁ。。。 など、考えてみました。 ちと、SQLServer・Javaについての知識が乏しいため、検討違いであれば すいません。 imageってXMLファイルになるのかな。。。

urizaka
質問者

補足

 urizakaです  解答ありがとうございます。  ええと、setBinaryStreamを使ってimageフィールドにデータを挿入することはできます。というか、サーブレット部分でストリームの大きさを測るプログラムを組んで、それを引数として与えるようにプログラムを変えるとできました。  さて、今度の問題はダウンロードなのですが…これは違う問題になるので、別の質問を立てることにしますね。  それでは…

関連するQ&A

  • データベースへ接続

    JAVAを使ってMySQLへ接続して、テーブルにデータを挿入するプログラムを作ったのですが、エラーが出てしまいます。 環境変数は CLASSPATHは .;%JAVA_HOME%\lib\tools.jar;C:\mysql-connector-java-3.0.16-ga\mysql-connector-java-3.0.16-ga\mysql-connector-java-3.0.16-ga-bin.jar;. PATHは %JAVA_HOME%\bin;C:\Program Files\MySQL\MySQL Server 4.1\bin JAVA_HOMEは C:\Program Files\Java\jdk1.5.0_11 です。 プログラム内容は // InsertSample.java import java.sql.*; class InsertSample { public static void main(String args[]){ Connection con = null; Statement stmt = null; // 引数のチェック if(args.length != 6){ System.out.println("usage : java InsertSample<id> <name> <yomi> <yubin> <address> <tel>"); return; } try { // JDBCドライバの登録 String driver = "org.gjt.mm.mysql.Driver"; // データベースの指定 String url = "jdbc:mysql://localhost/sampledb?useUnicode=true&characterEncoding=Shift_JIS"; String user = "root"; // 環境に応じて設定 String password = ""; // 環境に応じて設定 Class.forName (driver); // データベースとの接続 con = DriverManager.getConnection(url, user, password); stmt = con.createStatement(); // SQL文の作成 String sql = "INSERT INTO members VALUES('" + args[0] + "','" + args[1] + "','" + args[2] + "','" + args[3] + "','" + args[4] + "','" + args[5] + "'" + ")"; // 更新の実行 int num = stmt.executeUpdate(sql); System.out.println(args[0] + "の" + num + "行を追加"); } catch (SQLException ex) { System.err.println("SQL failed."); ex.printStackTrace (); } catch (Exception ex) { ex.printStackTrace (); } finally { try{ // データベースのクローズ stmt.close(); con.close(); } catch (Exception ex) { ex.printStackTrace (); } } } } で、エラーの内容は java.sql.SQLEception : Invalid authorization specification massage from server : "Access denied for user 'root'@'localhost' (using password : NO)" とでてしまいます。どのように改善したらよいでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • Oracleに接続すると、それ以降の処理を素通りしてしまう

    下記のようなメソッドで<1><2>の後、すぐに<7>に処理をしてしまいます。 <1>~<7>と動くと思っていたのですが、<3>~<6>が全て無視されます。 どこか問題があるのでしょうか? ちなみに、<1>で無効なURLを指定するとSQLExceptionでcatchされます。 try { Class.forName("oracle.jdbc.OracleDriver"); try { //<1> conn = DriverManager.getConnection (URL, UID, PSW); //<3> System.out.println("Oracleと接続しました"); } catch (SQLException e) { System.out.println("oracle接続エラー"); } catch (Exception e) { System.out.println("oracle接続エラー"); } //<4> try { //<5> stmt = conn.createStatement(); //<6>sql文の作成 // select文の実行 //(略) } catch (Exception ex3) { System.out.println("なんかエラーです"); } } catch (Exception e){ System.out.println("その他エラーです"); //<2> } finally { //特になし } //<7> return list;

    • ベストアンサー
    • Java
  • 検索して持ってきた数値をfor文に使いたい

    urizakaです。 現在、ある組織に所属した人間の数と名前を調べ、その所属した人間がある業務に該当しているかどうかを調べるという処理を作っています。その際に調べてきた数理まで処理を行うという処理を作るためにfor文を使おうと思っているのですが、 調べてきた数値というのは、 String c_code_staff = new String(); public void searchFlag1(){ int num; String sf1Stmt = "select count(*) from m_staff where code_org='" + s_code_org +"'"; try{ open(); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(sf1Stmt); while (rs.next()){ c_code_staff = rs.getString(1); } rs.close(); stmt.close(); close(); } catch(SQLException ex){ System.out.println("searchFlag1のDBエラー : " + ex); System.out.println("searchFlag1のSQL" + sf1Stmt); } catch(java.lang.Exception ex){ System.out.println("searchFlag1のDB ErrorB : " + ex); } } という処理を使うため、STRING形になっているので、このままではfor文には 代入できない状態です。c_code_staffをintで宣言という手も考えたのですが、intでは宣言できなかったため、駄目でした…  すみませんが、javaでStringをintに変換する方法についてご存知の方宜しくお願いします。

    • ベストアンサー
    • Java
  • JDBC PostgreSQLで必要なファイルはあるのでしょうか?

    LinuxでPostgreSQLのデータベースをJDBCでアクセスしたいのですが、以下のソースで次のエラーが発生します。何か必要なファイルでもあるのでしょうか? java.lang.ClassNotFoundException:org.postgres.Driver また、LinuxのODBCも必要なファイルがあるのでしょうか? import java.sql.*; class jdbcSample2 { public static void main(String argv[]) { int a; String b; try { //Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver"); //String url = "jdbc:odbc:test"; Class.forName ("org.postgres.Driver"); String url = "jdbc:postgresql://127.0.0.1:5432/test"; String user = ""; String password = ""; Connection con = DriverManager.getConnection(url, user, password); Statement stmt = con.createStatement (); String query = "select * from member;"; ResultSet rs = stmt.executeQuery (query); while(rs.next()){ a = rs.getInt(1); b = rs.getString(2); System.out.println(a + ", " + b); } rs.close(); stmt.close(); con.close(); } catch (SQLException ex) { System.err.println("SQL failed."); ex.printStackTrace (); } catch (Exception ex) { ex.printStackTrace (); } } }

  • Javaで、TomCatプロジェクトを使用したJDBCを使用したデータベースのアクセスについて教えてください。

    すぐに回答を! TomCatプロジェクトでDBアクセスできず困っています。 ●Javaプロジェクトの場合(成功)  ・Javaプロジェクト作成 → 新規 → クラスを作成。  ・プロジェクト選択 → メニューバー「プロジェクト」 → プロパティー   → Javaのビルド・パス → ライブラリーの追加 → ユーザーライブラリー   → 新規 → MySQLドライバを追加  ・次のソースの実行にて、JDBC Dirverの接続を確認。 [JdbcSample.java] import java.sql.*; class JdbcSample { public static void main(String[] args) { try { // 1.JDBC Driver の登録 Class.forName("com.mysql.jdbc.Driver").newInstance(); // 2.データベースへの接続 Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/db1", "(ユーザー名)", "(パスワード)"); // 3.SQL ステートメント・オブジェクトの作成 Statement stmt = con.createStatement(); // 4.SQL ステートメントの発行 ResultSet rs = stmt.executeQuery("SELECT * from null_test_tbl"); // 5.結果の出力 while (rs.next()) { System.out.println(rs.getString("allow_null")); } // 6.データベースのクローズ rs.close(); stmt.close(); con.close(); } catch (SQLException e1) { System.out.println( "SQLException: " + e1.getMessage()); System.out.println( " SQLState: " + e1.getSQLState()); System.out.println( " VendorError: " + e1.getErrorCode()); } catch (Exception e2) { System.out.println( "Exception: " + e2.getMessage()); } } } ●TomCatプロジェクト作成の場合(失敗)  (1)TomCatプロジェクト作成 → 新規 → クラスを作成。  (2)プロジェクト選択 → メニューバー「プロジェクト」 → プロパティー   → Javaのビルド・パス → ライブラリーの追加 → ユーザーライブラリー   → 新規 → MySQLドライバを追加  (3)サーブレットからBeanの呼び出し。  「​http://localhost:8080/test_mvc/jdbcSample​」  (4)エラー「Exception: com.mysql.jdbc.Driver」 が発生。(ドライバーが見つかりません?) [servlet] package ne.jp; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class TestMvc extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { JdbcSample da = new JdbcSample(); try { da.dbAccessTest(); (※)←ここでBeanのデータベースアクセスメソッドを呼び出し } catch (Exception e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } // HTML出力の準備 response.setContentType("text/html;charset=Shift_JIS"); PrintWriter out = response.getWriter(); out.println("<html><body><p>こんにちわ!</p></body>"); } } [Bean] package ne.jp; import java.sql.*; class JdbcSample { //Beanコンストラクタ public JdbcSample(){ } //データベースアクセス確認 public void dbAccessTest(){ try { // 1.JDBC Driver の登録 Class.forName("com.mysql.jdbc.Driver").newInstance(); // 2.データベースへの接続 Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/db1", "***", "*****"); // 3.SQL ステートメント・オブジェクトの作成 Statement stmt = con.createStatement(); // 4.SQL ステートメントの発行 ResultSet rs = stmt.executeQuery("SELECT * from null_test_tbl"); // 5.結果の出力 while (rs.next()) { System.out.println(rs.getString("allow_null")); } // 6.データベースのクローズ rs.close(); stmt.close(); con.close(); } catch (SQLException e1) { System.out.println( "SQLException: " + e1.getMessage()); System.out.println( " SQLState: " + e1.getSQLState()); System.out.println( " VendorError: " + e1.getErrorCode()); } catch (Exception e2) { System.out.println( "Exception: " + e2.getMessage()); } } }

    • ベストアンサー
    • Java
  • データベースに接続できません。

    javaからDB2にアクセスしようとして下記のコードを書きましたが、全く動きません。 C言語ではSQL文でコネクトできるのですが、javadでは違うようです。 得られた画面表示は try error code 0 です。 DB2 Epress-C 10.5.0.420 Java SE Development Kit Update 40 (64-bit) import java.sql.*; import sqlj.runtime.*; import sqlj.runtime.ref.*; #sql iterator ItrPos (String, String); #sql context Myctx; class Test14{ public static void main(String[] args) { String col1 = ""; String col2 = ""; System.out.println("try"); try { Myctx myctx = new Myctx("jdbc:db2:sample","user1","",false); System.out.println("try2"); ItrPos itr; System.out.println("try3"); #sql [myctx] itr = { select col1, col2 from Test1 }; System.out.println("select"); while (itr.endFetch() == false){ #sql { fetch :itr into :col1, :col2 }; System.out.println("fetch"); if(itr.endFetch()){ System.out.println(col1 + col2); } } } catch(Exception e) { if (e instanceof java.sql.SQLException) { System.out.println("error code: " + ((java.sql.SQLException)(e)).getErrorCode()); } } } }

    • ベストアンサー
    • Java
  • 【ご依頼】Javaソースコードシンボルエラー

    Javaプログラミングから離れて年月が経ってしまったそんな時、 急遽、Java演習の依頼を受けてしまいました。 下記のソースコードはブラウザのパラメータを受け取り、 その値をDB(MySQL)上で検索して画面上に表示する簡単なJavaサーブレットです。 【action.java】 ========================================================================= import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.sql.ResultSet; public class action extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<html><head><title>Action!</title></head><body>"); out.println("<h1>Profuct name is " + getValue(request) + " </h1>" ); out.println("<h1>Price of " + getValue(request) + " is " + get_price( values2, out ) + " </h1>" ); out.println("<p><a href=\"./form.html\">Return to input form</a>"); out.println("</body></html>"); out.close(); } private String getValue( HttpServletRequest request ) { String values = request.getParameter( "name" ); // ブラウザから送られた値を受け取る if( values != null ) { return( values ); } return( "error occured!" ); } // Access sample_db and returns price private int get_price( String values2, PrintWriter out ) { Connection conn = null; Statement stmt = null; ResultSet rs = null; values2 = getValue(request); int price = 0; try { conn = DriverManager.getConnection( "jdbc:mysql://localhost/sample_db", // url form of db "admin", // user name "******" // password ); stmt = conn.createStatement(); rs = stmt.executeQuery( "SELECT price FROM product WHERE name = '" + values2 +"'" ); rs.first(); price = rs.getInt( "price" ); // get the value of the first column } catch ( SQLException ex ) { out.println( "SQLException: " + ex.getMessage() + "<br>" ); out.println( "SQLState: " + ex.getSQLState() + "<br>"); out.println( "VendorError: " + ex.getErrorCode() + "<br>"); } finally { if( rs != null ) { try { rs.close(); } catch (SQLException ex) {} rs = null; } if( stmt != null ) { try { stmt.close(); } catch (SQLException ex) {} rs = null; } } return( price ); } } ========================================================================= 上記ソースコードをコンパイル(javac)しても 以下のエラーが発生してしまいます。 【エラーメッセージ】 ========================================================================= action.java:25: エラー: シンボルを見つけられません out.println("<h1>Price of " + getValue(request) + " is " + get_price( values2, out ) + " </h1>" ); ^ シンボル: 変数 values2 場所: クラス action action.java:44: エラー: シンボルを見つけられません values2 = getValue(request); ^ シンボル: 変数 request 場所: クラス action エラー2個 ========================================================================= 何度も修正するも自身では解決に至りませんでしたので 皆様のお力をお借りしたく投稿致しました。 ご確認の程、宜しくお願い致します。

  • エラーの原因がわかりません。

    調べたのですが原因がいまいちわからないので 質問させていただきます。 sqlName = new String(name.getByte("Shift_JIS"),"JISAutoDetect"); sqlYear = new String(year.getByte("Shift_JIS"),"JISAutoDetect"); sqllanguage = new String(language.getByte("Shift_JIS"),"JISAutoDetect"); sqlsonota = new String(sonota.getByte("Shift_JIS"),"JISAutoDetect"); String sql = ""; sql += " insert into user "; sql += " (name, year, language, sonota)"; sql += " values ( "; sql += "'" + sqlName + "'"; sql += ",'" + sqlYear + "'"; sql += ",'" + sqllanguage + "'"; sql += ",'" + sqlsonota + "'"; sql += " ) "; System.out.println("SQL文"); stmt.executeUpdate(sql); System.out.println("SQL文を発行"); }catch(Exception e){ System.out.println("SQLエラーが発生しました : " + e.toStrin()); } stmt.executeUpdate(sql)で例外が発生します。 SQLエラーが発生しました : java.sql.SQLException: Duplicate entry '' for key 1 stmt.executeUpdate(sql)には問題がないと思うので sql文でのエラーじゃないかと思っているのですが 原因がわかりません。 もしお分かりになる方がいればよろしくお願いします

  • データベースへのアクセスエラーについて

    はじめまして!大学でデータベースを学んでいるのですが、以下のプログラムを実行した際、「式の型が一致しません」というエラーが出ます。またアクセスしているテーブルmeiboにはフィールドに,IDと名前shakai,eigoなどのテーブルには,IDと得点(それぞれの科目の名前)がフィールドにあります。 よろしければ、ご回答よろしくお願いいたします。 import java.io.*; import java.sql.*; public class Ex1 { public static void main(String[] args) { Connection conn = null; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); conn = DriverManager.getConnection("jdbc:odbc:ex1"); Statement stmt = conn.createStatement(); BufferedReader r = new BufferedReader(new InputStreamReader(System.in), 1); System.out.print("学籍番号を入力してください : "); System.out.flush(); String number = r.readLine(); String select = "SELECT * from meibo,kokugo,sansuu,shakai,rika,eigo " + "where meibo.ID=kokugo.ID=sansuu.ID=shakai.ID=rika.ID=eigo.ID"; ResultSet rs = stmt.executeQuery(select); while(rs.getString("ID")!=number) rs.next(); // System.out.printf("%s\t",rs.getString("name")); System.out.printf("%s\t"," 国語 "+rs.getString("kokugo")); System.out.printf("%s\t"," 算数 "+rs.getString("sansuu")); System.out.printf("%s\t"," 社会 "+rs.getString("shakai")); System.out.printf("%s\t"," 理科 "+rs.getString("rika")); System.out.printf("%s\n"," 英語 "+rs.getString("eigo")); stmt.close(); conn.close(); } catch (Exception e) { System.out.println(e); } } }

  • Javaでデータベースの内容をGUIで表示したい

    お世話になります。 SQL文で発行された内容をJListでリスト化して表示したいです。 コマンドライン上で内容を表示することは出来ていますが、上手くGUIで表示できません。 簡単に言えば、以下の2つのプログラムを組み合わせたいです。宜しくお願い致します。 // JListプログラム // import java.awt.*; import javax.swing.*; import javax.swing.event.*; class JListTest extends JFrame implements ListSelectionListener { JListTest() { getContentPane().setLayout(new FlowLayout()); String[] data = { "ListA", "ListB", "ListC", "ListD" }; JList lst = new JList(data); lst.addListSelectionListener(this); getContentPane().add(lst); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setTitle("JListTest"); setSize(200, 120); setVisible(true); } public void valueChanged(ListSelectionEvent e) { JList lst = (JList)e.getSource(); System.out.println(lst.getSelectedValue()); } public static void main(String[] args) { new JListTest(); } } // SQLプログラム // import java.sql.*; class DbTest { public static void main(String[] args) { int id; String name; try { // JDBCドライバの登録 String driver = "org.postgresql.Driver"; // データベースの指定 String server = "192.168.1.0"; // PostgreSQL サーバ ( IP または ホスト名 ) String dbname = "test"; // データベース名 String url = "jdbc:postgresql://" + server + "/" + dbname; String user = "test"; //データベース作成ユーザ名 String password = "xxxxxxxxxx"; //データベース作成ユーザパスワード Class.forName (driver); // データベースとの接続 Connection con = DriverManager.getConnection(url, user, password); // テーブル照会実行 Statement stmt = con.createStatement (); String sql = "SELECT * FROM test"; ResultSet rs = stmt.executeQuery (sql); // テーブル照会結果を出力 while(rs.next()){ id = rs.getInt("num"); name = rs.getString("name"); System.out.println(id); System.out.println(name); } // データベースのクローズ rs.close(); stmt.close(); con.close(); } catch (SQLException e) { System.err.println("SQL failed."); e.printStackTrace (); } catch (ClassNotFoundException ex) { ex.printStackTrace (); } } }

専門家に質問してみよう