質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

2239閲覧

JDBCでSQLのSyntaxエラーが起きてしまいます。

Yakusugi

総合スコア123

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2021/12/14 10:29

編集2021/12/15 07:19

JDBCを使ってCUIベースのデータベースアプリを作成しております。
下記、86,87行目で記述しているInsert文でSyntaxエラーが起きているのですが、DBeaverで同じSQLを実行するとデータを入れることは出来ました。
何故JDBCではエラーが起きるのか、ヒントがあればご教示頂けますと幸いです。
String sql = "INSERT INTO budget_table(id,Date,StoreName, ProductName, ProductType, Price) " + "VALUE (?,?,?,?,?,?)";

エラー内容 2021/12/15 15:49

Exception in thread "main" java.lang.Error: Unresolved compilation problem: The method setDate(int, java.sql.Date) in the type PreparedStatement is not applicable for the arguments (int, java.util.Date) at BudgetTrackerCui/com.jdbc.budgettracker.dao.BudgetTrackerDao.insertIntoTable(BudgetTrackerDao.java:93) at BudgetTrackerCui/com.jdbc.budgettracker.main.BudgetTrackerMain.main(BudgetTrackerMain.java:130)

BudgetTrackerDao.java

package com.jdbc.budgettracker.dao; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Time; import java.util.Date; import java.util.ArrayList; import java.util.List; import java.util.Properties; import com.jdbc.budgettracker.core.BudgetTrackerDto; public class BudgetTrackerDao { BudgetTrackerDto btd; private Connection myConn; private PreparedStatement mySmt; private static final String SELECTALL = "select * from budget_table;"; // private static final String SELECTBYSTORENAME = "select * from budget_table where store name = ?;"; private static Connection getConnection() { try { // get db properties Properties props = new Properties(); props.load(new FileInputStream( "/home/yosuke/git/BudgetTrackerCui/BudgetTrackerCui/sql/config_budgettracker.properties")); String user = props.getProperty("user"); String password = props.getProperty("password"); String dburl = props.getProperty("dburl"); // Class.forName(RDB_DRIVE); Connection con = DriverManager.getConnection(dburl, user, password); return con; } catch (Exception e) { throw new IllegalStateException(e); } } // select all public List<BudgetTrackerDto> selectAll() throws FileNotFoundException, IOException { List<BudgetTrackerDto> budgetList = new ArrayList<>(); try (Connection conn = BudgetTrackerDao.getConnection(); PreparedStatement ps = conn.prepareStatement(SELECTALL)) { try (ResultSet rs = ps.executeQuery()) { while (rs.next()) { btd = new BudgetTrackerDto(); btd.setId(rs.getInt("ID")); btd.setDate(rs.getDate("Date")); btd.setStoreName(rs.getString("StoreName")); btd.setProductName(rs.getString("ProductName")); btd.setProductType(rs.getString("ProductType")); btd.setPrice(rs.getInt("Price")); budgetList.add(btd); } } } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { } return budgetList; } public int insertIntoTable(BudgetTrackerDto btd) throws SQLException { int rowsCount = 0; PreparedStatement pstmt; try { // DBに接続 myConn = BudgetTrackerDao.getConnection(); // pstmt = (PreparedStatement) myConn.createStatement(); // String sql = "INSERT INTO budget_table(id,Date,StoreName, ProductName, ProductType, Price) " + "VALUE('" // + btd.getId() + "','" + btd.getDate() + "','" + btd.getStoreName() + "','" + btd.getProductName() + "','" + btd.getProductType() // + "','" + btd.getPrice() + "')"; String sql = "INSERT INTO budget_table(id,Date,StoreName, ProductName, ProductType, Price) " + "VALUE (?,?,?,?,?,?)"; pstmt = myConn.prepareStatement(sql); pstmt.setInt(1, btd.getId()); Date date = btd.getDate(); long timeInMilliSeconds = date.getTime(); java.sql.Date date1 = new java.sql.Date(timeInMilliSeconds); pstmt.setDate(2, date1); pstmt.setString(3, btd.getStoreName()); pstmt.setString(4, btd.getProductName()); pstmt.setString(5, btd.getProductType()); pstmt.setInt(6, btd.getPrice()); // SQL文発行 pstmt.executeUpdate(); System.out.println("Suucessfully added"); pstmt.close(); //rowsCount = pstmt.executeUpdate(sql); } catch (SQLException e) { System.out.println("Errorが発生しました!\n" + e + "\n"); } finally { // リソースの開放 if (mySmt != null) { try { mySmt.close(); } catch (SQLException ignore) { } } if (myConn != null) { try { myConn.close(); } catch (SQLException ignore) { } } } return 0; } }

BudgetTrackerDto.java

package com.jdbc.budgettracker.core; import java.util.Date; public class BudgetTrackerDto { private int id; private Date date; private String storeName; private String productName; private String productType; private int price; public BudgetTrackerDto() { } public BudgetTrackerDto(int id, Date date, String storeName, String productName, String productType, int price) { super(); this.id = id; this.date = date; this.storeName = storeName; this.productName = productName; this.productType = productType; this.price = price; } public int getId() { return id; } public void setId(int id) { this.id = id; } public Date getDate() { return date; } public void setDate(Date insertDate) { this.date = insertDate; } public String getStoreName() { return storeName; } public void setStoreName(String storeName) { this.storeName = storeName; } public String getProductName() { return productName; } public void setProductName(String productName) { this.productName = productName; } public String getProductType() { return productType; } public void setProductType(String productType) { this.productType = productType; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } }

BudgetTrackerMain.java

package com.jdbc.budgettracker.main; import java.io.FileNotFoundException; import java.io.IOException; import java.sql.SQLException; import java.util.Date; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Scanner; import com.jdbc.budgettracker.core.BudgetTrackerDto; import com.jdbc.budgettracker.dao.BudgetTrackerDao; public class BudgetTrackerMain { 一部省略 switch (initialNumInt) { case 2: // Insert int insertcannerInt = 0; System.out.println("You chose " + initialSwitchMap.get(2)); budgetTrackerDto = new BudgetTrackerDto(); Scanner insertScanner = new Scanner(System.in); System.out.print("Input an ID: "); int insertScannerInt = insertScanner.nextInt(); budgetTrackerDto.setId(insertScannerInt); System.out.print("Input Date (yyyy-MM-dd): "); String insertScannerStr = insertScanner.next(); Date insertDate=(Date) new SimpleDateFormat("yyyy-MM-dd").parse(insertScannerStr); budgetTrackerDto.setDate(insertDate); System.out.print("Input a store name: "); insertScannerStr = insertScanner.next(); budgetTrackerDto.setStoreName(insertScannerStr); System.out.print("Input a product name: "); insertScannerStr = insertScanner.next(); budgetTrackerDto.setProductName(insertScannerStr); System.out.print("Input a product type: "); insertScannerStr = insertScanner.next(); budgetTrackerDto.setProductType(insertScannerStr); System.out.print("Input price: "); insertScannerStr = insertScanner.next(); insertcannerInt = Integer.parseInt(insertScannerStr); budgetTrackerDto.setPrice(insertcannerInt); budgetTrackerDao = new BudgetTrackerDao(); budgetTrackerDao.insertIntoTable(budgetTrackerDto); } } }

画像 2021/12/15/11:49
イメージ説明

画像 2021/12/15/12:21
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/12/14 10:56

本当にこの通りならエラーにならないような。 MySQLは構文上 VALUESもVALUEも使えるようですし。 バージョン幾つですか?
Yakusugi

2021/12/14 10:58

バージョンは8.0.27です。
m.ts10806

2021/12/14 10:58

ただ、コード内は良いのですが、質問文内の String sql = "INSERT INTO budget_table(id,Date,StoreName, ProductName, ProductType, Price) " + "VALUE (?,?,?,?,?,?)"; これ、全角スペース入ってます。
Yakusugi

2021/12/14 11:27

ご指摘ありがとうございます。 全角スペースが入ってるとの事ですが、どこに入っていますでしょうか。 私の方でもう一度確認し、スペースを全て半角にして再トライみましたが、Syntaxエラーが出てしまいます。
jimbe

2021/12/14 13:34 編集

SQL を指定した executeUpdate が 2 回もありますけど、 prepareStatement("~") したのでしたら executeUpdate にはパラメータは要らないはずでは。 コメントアウトしてあるデータベタ書きの INSERT 文のコードそのままにパラメータを使うコードを入れたせいでしょうか。
m.ts10806

2021/12/14 19:42

コードブロック内ではなく文章上の String sql = "INSERT INTO budget_table(id,Date,StoreName, ProductName, ProductType, Price) " + "VALUE (?,?,?,?,?,?)"; [ ]+ ↑ここ
guest

回答2

0

ベストアンサー

pstmt.executeUpdate(sql);

ここの引数が不要では。PreparedStatementでセットしてset~で値がバインドされていっているので実行するだけです。
ただexecuteUpdateって引数は実行可能な生SQLだけのはずです。(親であるStatementのの機能)
PreparedStatementのみで構成すべきで、キャストは本来必要ありません。

しかも
executeUpdate

close

executeUpdate

と実行されていて、何がしたいのか良く分からなくなっています。
2回目はcloseされてるので実行されない気がします。

投稿2021/12/14 19:46

編集2021/12/15 02:13
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yakusugi

2021/12/15 01:23

ご回答ありがとうございます。 pstmt.executeUpdate(sql); ↓ pstmt.executeUpdate(); 上記の様にすると、エラーになってしまうので、恐縮ではございますが、引数は必要では無いかと考えております。 また、ご指摘の通り、2回目のexecuteUpdateは不要でしたので削除しました。
m.ts10806

2021/12/15 01:40

ドキュメントに提示した通りです。そのまま実行できるようなSQLでないなら引数入れてはいけません(そのためのもともとのエラー内容) プリペアドステートメント構成して、値をsetでバインドされてるのでexecuteUpdate()そのままで良いはずです。私もこの形式で引数渡したことありません。 どのようなエラーとなりましたか?
Yakusugi

2021/12/15 01:47

pstmt.executeUpdate();としたところ、下記の様なエラーになります。 The method executeUpdate(String) in the type Statement is not applicable for the arguments ()
m.ts10806

2021/12/15 02:08

確かに継承してるのでPreparedStatementインスタンスからでもexecuteUpdate(String)は呼べますね。ただ、executeUpdate()はPreparedStatementにしかないようなので、別の問題が発生してるように思います。
m.ts10806

2021/12/15 02:09

ひとまずimport java.sql.Statement;を削除かな。
m.ts10806

2021/12/15 02:11

キャストがずっと謎だったのがようやく意味がわかりました。やはりStatementは一通り不要です。PreparedStatementに統一
Yakusugi

2021/12/15 02:29

ご指摘頂きありがとうございます。 Statementは一通り削除し、PreparedStatementに統一しました。 そうすろと、今度は上記エラー(エラー内容 2021/12/15)が発生してしまいました。 ※エラー内容は上記をご参照下さい。 私の方でも確認してみたのですが、78行目で「PreparedStatement pstmt;」で設定いるのに、 82行目では何故か「pstmt = (PreparedStatement) myConn.createStatement();」でキャストしなくてはならない状態になっております。 今回のエラーの原因は82行目にあるようで、キャストを外すと、エラーが表示され(PreparedStatement) にキャストするか、Statementに型変換するよう求められます。
Yakusugi

2021/12/15 02:36

追記します。 先程の82行目をコメントアウトし、実行した所、 先ほどと同じ様に、SQLのSyntaxエラーになってしまいます。 java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?,?,?,?,?,?)' at line 1
Yakusugi

2021/12/15 02:43

90行目から96行目を更新したところ、今度はエラー内容が下記のように変わりました。 java.sql.SQLIntegrityConstraintViolationException: Column 'StoreName' cannot be null
m.ts10806

2021/12/15 02:45

進んだようですね。本要件自体は解決してます。 >Column 'StoreName' cannot be null エラーの通り、not nullのカラムにnull値をセットされたのでしょう。
Yakusugi

2021/12/15 02:51

デバッグモードで確認してみたのですが、 上記に画像を添付下通り、 StoreNameには値は入っているようです。 何故、ここでNULLになっているのかが、原因がつかめておりません。
jimbe

2021/12/15 03:02 編集

パラメータのオブジェクトを使わず、 > btd = new BudgetTrackerDto(); が入っているからでしょう。 デバッグモード等使う前に、コードを上から下へ読めば分かることです。 行き当たりばったりの切り貼りに終始してしまっていて、"どこで" "何を" しているのかを把握されていないように感じられます。
m.ts10806

2021/12/15 03:14

バインドしているのはbtd.getStoreName()なのでこいつを確認しないと意味がないです。
Yakusugi

2021/12/15 03:26

ご指摘頂きありがとうございます。 >バインドしているのはbtd.getStoreName()なのでこいつを確認しないと意味がないです。 こちらについて、StoreNameに「Amazon」と入力し、デバッグモードで実行した所、文字列は入っておりました。 >パラメータのオブジェクトを使わず、btd = new BudgetTrackerDto();が入っているからでしょう。 可能であれば、もう少し詳しくご教示いただく事は可能でしょうか。 「パラメータのオブジェクト」というのが理解できず。。。
m.ts10806

2021/12/15 03:29

いえ、提示されたコード上はnew したBudgetTrackerDtoのインスタンス変数btdは何もセットしてないので全て初期値(null)です。 jimbeさん指摘はinsertIntoTable()の引数を使えばいいじゃない、という意味です。
jimbe

2021/12/15 04:46

> パラメータのオブジェクト すいません、 m.ts10806 さんの仰る通り「 (insertIntoTable メソッドの ) パラメータ ( として渡されてくる budgetTrackerDto 変数 ) のオブジェクト」のつもりでした。 より具体的に(簡単に)は、 insertIntoTable メソッドの 2 行目にある btd = new BudgetTrackerDto(); を削除し、 insertIntoTable メソッドの宣言を public int insertIntoTable(BudgetTrackerDto budgetTrackerDto) throws SQLException { から public int insertIntoTable(BudgetTrackerDto btd) throws SQLException { と変えてみては如何でしょうか。
Yakusugi

2021/12/15 06:34

ご回答頂きありがとうございます。 public int insertIntoTable(BudgetTrackerDto btd) throws SQLException { に変更してみた所、確かに先程のエラーは消えました。 今度は、Date(日付)関連のエラーが起きてしまいました。 エラー内容は「エラー内容 2021/12/15 15:31」を更新しました。 93行目のpstmt.setDate(2, (java.sql.Date) btd.getDate());でエラーが起きており、先程元々の記述から変更してみたのですが、解決に至っておりません。 大変お手数ではございますが、ご助力頂けますと幸いです。
Yakusugi

2021/12/15 06:38

また、追記になりますが、DTOクラスのソースコードも念の為、記載しました。
Yakusugi

2021/12/15 06:47

元々のユーザ入力値を受け取るBudgetTrackerMain.javaの内容も一部記載しました。
Yakusugi

2021/12/15 07:20 編集

皆様、ご協力頂きありがとうございました。 DAOクラスの94行目から96行目でutil.Dateをsql.Dateに変換したところ、無事Insertが出来ました。
m.ts10806

2021/12/15 08:30

jimbeさんが最初に指摘されたようにひとつひとつ何をやっているのか理解されることを強くすすめます。 結局は書いたとおりにしか動かないので、どこかから持ってきたものを理解せずにそのまま使えるわけではないです。
guest

0

VALUEではなくVALUESです。
MySQLでは許されるそうなので、誤りです。
失礼しました。

投稿2021/12/14 11:13

編集2021/12/14 11:20
YT0014

総合スコア1708

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問