アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんばんわ。
いつもお世話になっております。

Insertの構文が分からず悩んでいます。
ご教授頂きたいと思います。

テーブルAはID,SOLD,NAMEの項目なのですが
このテーブルAにSOLDに「1」をNAMEはテーブルAの検索結果をそのままInsertしたいのですが、以外に調べても載っておらず
困っています。

stmt.setString(2,1);
stmt.setString(3,"NAME");

stmt.executeUpdate("INSERT INTO A values ('',?,?) WHERE id= "+Str);IDはオートナンバー型なのでテーブルの通番に従いたいと思います。
上記、記述でコンパイルするとエラーが出ます。

おかしい点をご教授下さい。
お願い致します!

A 回答 (11件中1~10件)

コンパイルエラーがでます→エラーの内容を質問に入れましょう。

エラーの内容がわからなければ答えようがありません。

まぁ、今回のケースはバインド変数使っているのにただのStatementを使っていることが原因だとは思いますが、違いますか?
バインド変数を使う場合はPreparedStatementを使用します。
で、その場合は
1・PreparedStatementをSQLをパラメータとして取得
2・PreparedStatementに値をセット
3・PreparedStatementを実行
となります。

参考URL:http://www.atmarkit.co.jp/fjava/rensai/jdbc04/jd …

この回答への補足

大変失礼致しました。

Servlet.java:39: シンボルを解決できません。
シンボル: メソッド setString (int,java.lang.String)
場所 : java.sql.Statement の インタフェース
stmt.setString(3,"NAME");
がエラーとなります。

難しい言葉が理解できる程のスキルがなく恐縮なのですが、一度PreparedStatementにて試してみます。

補足日時:2007/04/27 12:13
    • good
    • 0

>Servlet.java:39: シンボルを解決できません。


>シンボル: メソッド setString (int,java.lang.String)
>場所 : java.sql.Statement の インタフェース
>stmt.setString(3,"NAME");

ということですので、これは
「setStringというメソッドがjava.sql.Statementにないですよ」
というエラーです。
No.1の方でも書きましたが、通常のStatementではバインド変数は扱えませんので

>一度PreparedStatementにて試してみます。

とのこと、お試しください。

参考URLをJDK1.5のAPIドキュメントへのリンクとしていますので、
こちらでjava.sql.Statementとjava.sql.PreparedStatementを見て頂くと
どういったメソッドが定義されているのかわかるかと思います。

参考URL:http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/in …
    • good
    • 0

こんにちは、


DBが何を使用しているのかわからないので一般的な回答ですが、

insert into ・・・・ where ・・・って出来るのですか?
すみません。はじめてみました。

検索結果をinsertするには、insert into ・・ select ・・・・
見たいに書きます。
上の例で行くと
insert into A (SOLD,NAME) select 1,NAME from A where id=変数
オートナンバーのフィールドは何も指定しなくてよいかと思います。

以上です。

javaの方ですが、変数が2個でセットするのが2と3ですか?
やったこと無いけどいけるのかな??

この回答への補足

ありがとうございます!

whereできないんですか?
勉強不足ですみません。

変数ですが、2は1という数字を・3はテーブルの,"NAME"項目のレコードを追加したいのですが、、、

宜しくお願い致します☆

補足日時:2007/04/27 13:59
    • good
    • 0

UPDATE→何を更新するか知らなければいけないので条件指定可能


DELETE→何を削除するか知らなければいけないので条件指定可能
SELECT→何を取得するか知らなければいけないので条件指定可能
INSERT→レコードを追加するだけ

上記の通りですので、INSERTではWHERE句を指定できません。
No.3の回答者様が仰っているのは、SELECTで取得した結果をINSERTするので、そのSELECTではWHERE句が使用できますよといったことです。

>変数ですが、2は1という数字を・3はテーブルの,"NAME"項目のレコードを追加したいのですが、、、

"NAME"項目のレコードを追加したいというのは意味が通りません。
当該のSQL、およびJavaソースでは"NAME"という値をAテーブルの第3カラムにセットするの意味になります。
なお、バインド変数の使用方法は
setString(何個目の?か, セットする値)
となりますので
ご質問に記載されておりますSQLではsetStringの第1引数に指定できる(しなければならない)のは1と2のみになります。

なお、No.3の回答者様がSQLの例を書いてくださっていますが
テーブルのカラムを明示しなかった場合は
VALUES句でのセットは第1カラムから順番になります。
従って第1カラムがプライマリキーであり、オートナンバーであるならば
No.3の回答者様が書いてくださった様に列名を明示しなければ期待する動作になりません。

この回答への補足

とてもよく理解できました!

ありがとうございます☆

'NAME'の様に指定するとNMAEのレコードがACCESSでいう追加クエリの様な感じで
追加できると思っていたのが間違いだったんですね。。。

とても勉強になりましたありがとうございます!

改めて記述を変えてやってみました。

するとエラーがでました。。。
com.microsoft.sqlserver.jdbc.SQLServerException: '(1)' 付近に不適切な構文があります。

本番のプログラムでは電話番号(1)というのがあるのですがこれが原因の様な気がします。

res.setContentType("text/html; charset=Shift_JIS");では足りないのでしょうか??

補足日時:2007/04/27 16:32
    • good
    • 0

SQLServerは詳しくないのですが、思いつく範囲で。



電話番号(1)というのは列名ですか?
SQLServerでは半角括弧を列名に使えるのでしょうか?
そもそも、半角括弧は関数のくくりなど特別の意味を持つので使えるとしても使うべきではないと思います。

想定ですが、恐らく
電話番号(1)
の構文が、電話番号関数のパラメータが1という意味で解釈され
それは正しくないとエラーになっているのではないでしょうか。

この回答への補足

ありがとうございます。

すみません、電話番号(1)ではなくて電話番号(1)でした。

回避方法はあるのでしょうか?

宜しくお願い致します。

補足日時:2007/04/27 17:25
    • good
    • 0

>すみません、電話番号(1)ではなくて電話番号(1)でした。


どちらも同じに見えますが・・・・

とりあえず、同じMicrosoft製品ということでAccessで確認して見ました。
Accessでは()を列名に使えるので、SQLServerでも使えるのかもしれませんね。

で、その場合にSQLで発行するとなると電話番号(1)のままでは
やはり関数扱いされ上手く行きませんでした。
AccessのデザインビューでSQLを自動生成したところ、列名を[]でくくれば上手くいくことがわかりました。

↓みたいな感じで
SELECT [電話番号(1)] FROM テーブル名

SQLServerがAccess互換だとすると同じ方法でいけると思いますので
一度お試し頂けるでしょうか。

この回答への補足

ありがとうございます!!

[]で括った所、上手くいきました☆
お時間頂きありがとうございます!

SQLは実行された様ですがテーブルには追加されていませんでした。

前のJSPからPOSTで送ったデータがないのかとも考えたのですが、データの有無を確認する方法はございますでしょうか??

何度も恐縮なのですが宜しくお願い致します!

補足日時:2007/04/28 00:09
    • good
    • 0

INSERTがエラーしない以上、当該テーブルには必ずレコードが追加されます。



実はロールバックされているといったことはありませんか?
JDBCはデフォルトでオートコミットだったと思いますが、
コネクションプールなどを使っているとオートコミットでなくなっている可能性があります。

参考URLはPostgreSQLですが、トランザクションの考え方はSQLServerも同じですのでご一読ください。

参考URL:http://www.fireproject.jp/feature/postgresql/pro …

この回答への補足

ありがとうございます☆

月曜日になるのですが試してみます♪

補足日時:2007/04/28 19:33
    • good
    • 0
この回答へのお礼

以下のURLを拝見させて頂きました。
あまり問題はない様に思います。

ソースを添付致します。
プロの目からの意見をご教授頂ければと存じます。

import javax.servlet.http.*;
import java.sql.*;
import java.io.*;

public class EditingServlet extends HttpServlet {
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws IOException {

/*フィールドの宣言*/
Connection conn = null;

res.setContentType("text/html; charset=Windows-31J");
PrintWriter out = res.getWriter();

out.println("<html><head></head><body>");

String Str = req.getParameter("Str");
try {
String user = "ID", pwd="PW";

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String url="jdbc:sqlserver://10.121.67.247:1433;DatabaseName=Name"; /*JDBC URL*/
conn = DriverManager.getConnection(url,user,pwd);
Statement stmt = conn.createStatement();


stmt.executeUpdate("INSERT INTO A (氏名,[電話番号(1)],価格,) SELECT 氏名,[電話番号(1)],価格 FROM A where id= "+Str);

out.println("データを挿入しました!<br>");

} catch (ClassNotFoundException e) {
e.printStackTrace();
out.println("クラスが見つかりません。");
} catch (SQLException e) {
e.printStackTrace();
out.println("データの更新に失敗しました。");
} finally {
try {
if (conn != null) { conn.close(); }
} catch (SQLException e) {}
}
out.println("</body></html>");
out.close();
}
}

宜しくお願い致します☆

お礼日時:2007/04/30 08:58

>stmt.executeUpdate("INSERT INTO A (氏名,[電話番号(1)],価格,) >SELECT 氏名,[電話番号(1)],価格 FROM A where id= "+Str);



こちらですが、日本語に解釈すると

1・Aテーブルにレコードを追加します
2・セットする列は「氏名」「電話番号(1)」「価格」です
3・挿入するレコードはAテーブルからidで該当したレコードです

となっており、where idで該当するレコードが存在しない場合、
レコードは挿入されませんのでidをキーにレコードが取得できていないのだと思います。
まずは当該条件でレコードが取得できていることをご確認ください。
取得例)
↓みたいなのでカウントを取得して画面に出してみるとか
SELECT COUNT(*) FROM A where id= "+Str

この回答への補足

ARIA9さん

すみません。。。
このソースでInsertの際に本日の日付をyyyy/mm/ddの
形式で挿入する時はどの様にすれば宜しいのでしょうか?

import java.util*;くらいしか分からず。。。

改めて投稿するべきとは思うのですがお願い致します!

補足日時:2007/05/01 21:56
    • good
    • 0
この回答へのお礼

ARIA9さん

ありがとうございます。
カウントした所、0件でした。

よくソースを確認した所、前のJSPからPOSTでは送っていたのですがidを送信していない事が分かりました!

idを送信した所、成功致しました!!

お恥ずかしい限りです。。。

原因が分かったのもARIA9さんのおかげだと思っています☆

長期に渡るご指導心から感謝致しております。
本当にありがとうございました♪

お礼日時:2007/04/30 11:35

>このソースでInsertの際に本日の日付をyyyy/mm/ddの


>形式で挿入する時はどの様にすれば宜しいのでしょうか?

DBの列が日付型という解釈でよろしいですか?
だとしたら、java.utilではなくてjava.sql.Dateを調べてみましょう。
あとは、setStringと同じ要領でsetDateとかsetTimestampとかでいけると思いますよ。

この回答への補足

ありがとうございます。

DBの列は日付型からテキスト型に変えてしまいました。日付型ではないと追加できないのでしょうか?

投稿させて頂いてからjava.util.Dateやjava.sql.Dateやcalendar等を調べて試したのですが追加されなかったりエラーが出たりして分りませんでした。

もし宜しければ例の記述だけでもご教授頂けませんでしょうか?

ほんとに申し訳ありません。

補足日時:2007/05/03 00:36
    • good
    • 0

うーん。

テキスト型ならセットしたい文字列をそのまま入れればよいのでは?

ちょっと、今Javaを動かせる環境にないので確認ができないのですが、
java.util.Dateで現在時刻が取得できるので
java.text.SimpleDateFormatでyyyy/MM/dd形式の文字列に変換して
それをsetStringでセットすれば良いと思います。

上手く行かないようでしたら連休明けになってしまいますが、
私の方で動作確認して参考例をあげますのでお待ちください。

この回答への補足

ありがとうございます☆
色々試してみましたがうまく行きませんでした・・・

お手数ですがよろしくお願い致します!

現在のソースです。

import javax.servlet.http.*;
import java.sql.*;
import java.io.*;
import java.sql.Date;

public class EditingServlet extends HttpServlet {
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws IOException {

/*フィールドの宣言*/
Connection conn = null;

res.setContentType("text/html; charset=Windows-31J");
PrintWriter out = res.getWriter();

out.println("<html><head></head><body>");

String trans = req.getParameter("trans");

try {
String user = "ID", pwd="PW";

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String url="jdbc:sqlserver://localhost;DatabaseName=Name"; /*JDBC URL*/
conn = DriverManager.getConnection(url,user,pwd);
Statement stmt = conn.createStatement();

stmt.executeUpdate("INSERT INTO table (ファイル名,契約番号,[電話番号(1)],挿入日) SELECT ファイル名,契約番号,[電話番号(1)],挿入日 FROM table where id= "+trans);

out.println("<CENTER>");
out.println("<br><br>追加しました!<br>");
out.println("</CENTER>");

} catch (ClassNotFoundException e) {
e.printStackTrace();
out.println("クラスが見つかりません。<br>");
} catch (SQLException e) {
e.printStackTrace();
out.println("データの挿入に失敗しました。<br>");

} finally {
try {
if (conn != null) { conn.close(); }
} catch (SQLException e) {}
}
out.println("</body></html>");
out.close();
}
}

補足日時:2007/05/05 17:35
    • good
    • 0
この回答へのお礼

何度も申し訳ございません。。。

CONVERT(char,GETDATE(),111)でちゃんとできました☆

本当に長い間、何度もご教授頂きましてありがとうございます!
深く感謝致します。

お礼日時:2007/05/07 13:52

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