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);
}
}

 すみませんが、宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

こんにちは。



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

ちと、SQLServer・Javaについての知識が乏しいため、検討違いであれば
すいません。
imageってXMLファイルになるのかな。。。

この回答への補足

 urizakaです
 解答ありがとうございます。

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

補足日時:2002/01/18 10:52
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q"try{}catch(){}"文で"close()"はどのように書けばよいのでしょうか。

こんにちは、片岡と言います。

プログラム1は、Java言語で学ぶデザインパターン入門(結城浩さん著)の
433ページを参考にして書きました。

私は、プログラム1のclose()の書き方よりもプログラム2のようなclose()の書き方が、
良いと思っています。
なぜならば、プログラム1では、out.writeObject(memento)行の例外によって、
close()が実行されないからです。

私のこの考え方は正しいのでしょうか。
もっと良いclose()の書き方はあるのでしょうか。
ご存知の方はいらっしゃいませんか。

●プログラム1
public class Main {
public static void saveMemento(Memento memento) {
try {
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("game.dat"));
out.writeObject(memento);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
… //以下略
}

public class Memento implements Serializable {
… //以下略
}


●プログラム2
public class Main {
public static void saveMemento(Memento memento) {
try {
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("game.dat"));
out.writeObject(memento);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
… //以下略
}

public class Memento implements Serializable {
… //以下略
}


なお、私の環境は以下の通りです。
OS: Microsoft Windows XP Professional SP2
開発環境:Eclipse 3.2.2
java: java version "1.4.2_13"

こんにちは、片岡と言います。

プログラム1は、Java言語で学ぶデザインパターン入門(結城浩さん著)の
433ページを参考にして書きました。

私は、プログラム1のclose()の書き方よりもプログラム2のようなclose()の書き方が、
良いと思っています。
なぜならば、プログラム1では、out.writeObject(memento)行の例外によって、
close()が実行されないからです。

私のこの考え方は正しいのでしょうか。
もっと良いclose()の書き方はあるのでしょうか。
ご存知の方はいらっしゃいませんか。

●プロ...続きを読む

Aベストアンサー

>私のこの考え方は正しいのでしょうか。
正しいです。質問者さんが書かれているやり方が一般的です。
念のため書いておきますが、outをtryの外で宣言しないとコンパイルが通りません。

まぁ、あくまでデザインパターンを学ぶための本ですから、細かなコーディングについて気にする必要はないでしょう(疑問を持つことは良いことですが)。

QSystem.err. printlnとSystem.out.printlnはどう違うんでしょうか?

 初心者なので今までSystem.out.println文しか見たことがなかったのですが、テキストで急にIOExceptionのcatch文の中にSystem.err. println文が出てきました。
 errをoutに書き換えてもエクリプスではチェックされなかったのですが、どういう違いがあるのでしょうか?

Aベストアンサー

出力先が「標準出力」か「標準エラー出力」かの違いです。

Windows環境ですと、
標準出力はコンソール(コマンドプロンプト、もしくはDOS窓のこと)に出力されます。
標準エラー出力も同じくコンソールに出ます。

ただし、リダイレクト機能を使ったときに違いが表れます。
リダイレクトとは、
>program > a.txt
のように、標準出力をするプログラムの出力を、
テキストファイルに書き出すことです。
Javaでも、コンソールへのテキスト出力をするプログラムだったら、
>java nantoka > a.txt
で、a.txtにテキストが書き込まれると思います。
試してみてください。

それで、「標準エラー出力」の方は、
リダイレクトをしてもリダイレクトされず、
コンソールにテキストが書き出されます。
標準エラー出力は、通常、エラーが起こったときの
表示に使うもので、
これまでリダイレクトされてしまうと、
ユーザーがエラーを検知できなくなるからです。

ためしに
System.out.println("ABCD");
System.err.println("いろはに");
System.out.println("EFG");
System.err.println("ほへと");
と出力するtestプログラムを作って、

>java test

>java test > a.txt
として、動作の違いをたしかめてみてください。

(付記:どうしてもエラー出力をリダイレクトしたい場合、
>のかわりに2>を使うことによって可能です。
Linux系ではシェルによって違いがあります)

出力先が「標準出力」か「標準エラー出力」かの違いです。

Windows環境ですと、
標準出力はコンソール(コマンドプロンプト、もしくはDOS窓のこと)に出力されます。
標準エラー出力も同じくコンソールに出ます。

ただし、リダイレクト機能を使ったときに違いが表れます。
リダイレクトとは、
>program > a.txt
のように、標準出力をするプログラムの出力を、
テキストファイルに書き出すことです。
Javaでも、コンソールへのテキスト出力をするプログラムだったら、
>java nantoka > a.txt
で、a.tx...続きを読む

Aベストアンサー

LN=LINE

lineの略ではないでしょうか
begin a new line (行を改める)で
改行ではないかと

QSystem.out.println(new 文)て?

javaを勉強しています。カレンダーを作ろうと思い、以下のURLのカレンダーのコードを勉強していたのですが、タイトルのSystem.out.println(new文)の意味が分かりません。
下記のコードで言うと、;のつく文では一番下の文です。
よろしくお願いします。

http://www7a.biglobe.ne.jp/~java-master/samples/datetime/MonthlyCalendar.html

Aベストアンサー

>System.out.println(new文)の意味が分かりません。
System.out.println( (new MonthlyCalendar(currentYear, month)).toString() );
という意味。マニュアルくらい読もうぜ。

Qclass Test_A {  main(){}}の実行順序は?

public class Test_A {
public static void main(){

int a = 0;
int b = 1;

}
}
例えば上のようなサンプルで何故 main()がクラスTest_A の中に挟まっているのでしょうか?実行順序としては main()が終了したら、クラスTest_A の方はどうなるのでしょうか? main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。よろしくお願いします。 

Aベストアンサー

>main()がクラスTest_A の中に挟まっているのでしょうか

Javaは、全てのプロパティ、メソッドはどこかのクラスに属していないといけないからです。
mainメソッドであっても例外ではありません。

>main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。

これを考える上で最も重要なのはmainメソッドがstaticであることです。
staticなメソッドは、そのクラスのインスタンスを作らなくても、
つまり、new Test_A();としなくても実行することが可能です。
プログラム実行時には、Test_Aクラスのインスタンスは生成されません。
質問のコードでは変数a,bに値が代入され、それで終わりです。

Javaでは、(正確にはJavaVMは)実行するclassファイルにある、
String[]引数を持ったvoid mainメソッドを実行する仕様になっています。
しかし、mainメソッドを実行するときには何のインスタンスも生成されていないので、
何かのインスタンスのメソッドを実行することはできません。
なので、staticなメソッドでないとJavaVMが実行できないのです。
さらに、JavaVMからアクセス可能なスコープを与える必要があるので、
publicである必要もあるのです。

あとは、そのmainメソッドに指定されたコードを実行し、mainメソッドの最後まで処理が進んだら
そこでJavaVMが終了し、プログラムも終了します。

※細かい話ですが、main()からプログラムは始まりません。
正確に言うと、引数なしのmain()メソッドは他のメソッドと何ら代わりがありません。
プログラムを始めるには、
アクセススコープがpublicで、staticな戻り値のなく、引数にString配列を取るmainメソッド
であることが必要です。つまり、
public static void main(String[] args)
とするのが通常です。
試しに質問のコードをjavaコマンドで実行すると、NoClassDefFoundErrorが出るはずです。

>main()がクラスTest_A の中に挟まっているのでしょうか

Javaは、全てのプロパティ、メソッドはどこかのクラスに属していないといけないからです。
mainメソッドであっても例外ではありません。

>main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。

これを考える上で最も重要なのはmainメソッドがstaticであることです。
staticなメソッドは、そのクラスのインスタンスを作らなくても、
つまり、new Test_A();としなくても実行することが可能です。
プログラム実行時...続きを読む


人気Q&Aランキング

おすすめ情報