Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

jspでMySQLからのデータ取得がうまくいかない

私はTomcat8.0とjsp、MySQL5.6などでWebアプリを作って
ます。
今、データベースからデータを取り出して表示させようと
しているのですが、ResultSet#nextでfalseが返ってきま
す。
sqlを直接実行させるとデータが表示されるので、sqlは問
題ないと思います。

以下がそのコードの一部です。
Connection conn = null;
String url = "jdbc:mysql://localhost:3306/body";
String user = "root";
String password = "パスワード";
try {
    Class.forName("com.mysql.jdbc.Driver").newIn
stance();
} catch (InstantiationException | 
IllegalAccessException
        | ClassNotFoundException e) {
    // TODO 自動生成された catch ブロック
    e.printStackTrace();
}
try {
    conn = DriverManager.getConnection(url, 
user, password);
    Statement stmt;
    stmt = conn.createStatement();
    String sql = "SELECT * FROM Info WHERE 
name='太郎'";
    ResultSet rs;
    rs = stmt.executeQuery(sql);
    if(rs.next()){ //ここでfalseが出ます。

何が間違っているのでしょうか?

13

回答

4552

閲覧

13件の回答

評価

0

文字コード。

評価

0

今は適当に太郎にしていますが本当は英数字が入ります。

評価

0

DBMS側のログを見てみなよ。

最初のクラスロードはClass.forName()だけで良く、
newInstance()は要らない。
あと、JDK6以降対応のjdbcドライバなら、これ自体不要なは
ず。

評価

0

DBMS側のログの場所がわかりません。

jdbcドライバはコレを使っています。
mysql-connector-java-5.1.36-bin.jar
newInstance()を消しても変わりませんでした。

>あと、JDK6以降対応のjdbcドライバなら、これ自体不要
なはず。
これ自体とはどこのことですか?

ためしにClass.forName()らへんを消したが以下のエラー
が出ました。
java.sql.SQLException: No suitable driver found for 
jdbc:mysql://localhost:3306/body

評価

0

>DBMS側のログの場所がわかりません
それが分からなければ、今後も色々つまづくぞ。
多くの場合、SQLの問題はJava側では分からない。

>newInstance()を消しても変わりませんでした。
それが期待値。newInstance()の有無は単に書き方の話で、今
回の事象の原因ではない。

>ためしにClass.forName()らへんを消したが以下のエラー
JVM起動時に読み込まれるフォルダにjarを置かない場合は、
相変わらず必要なようだ。

http://d.hatena.ne.jp/thk/touch/20090318

評価

0

  String sql = "SELECT * FROM Info";

だけで実行したらどうなりますか?

評価

0

返信が遅くなりました。

C:\ProgramData\MySQL\MySQL Server 5.6\data\
にログがあるらしいので見てみたのですが、logファイル
が見当たりませんでした。
エラーファイルっぽいSHIHO-PC.errorを見てみると、
InnoDBのワーニングなどがあるだけで実行時のエラーは記
録されていないようでした。
見ている場所が違うのでしょうか?

While以降を消してみましたが変化がありませんでした。

評価

0

すみません。
書き忘れたことがありました。

ログの場所を探していて以下のページを見た時に
いろいろ設定の方法があったのでそれも試しました。
http://pentan.info/sql/mysql/log_files.html

評価

0

再びすみません。
MySQLを再起動したらlogファイルが作られました。
内容はこんな感じでした。

C:\Program Files (x86)\Canon\Easy-WebPrint 
EX\bin\mysqld.exe, Version: 5.6.26-log (MySQL 
Community Server (GPL)). started with:
TCP Port: 3306, Named Pipe: (null)
Time                 Id Command    Argument
151003 18:59:58        1 Connect    root@localhost on 
body
            1 Query    /* mysql-connector-
java-5.1.36 ( Revision: 
4fc1f969f740409a4e03750316df2c0e429f3dc8 ) */SELECT 
@@session.auto_increment_increment, 
@@character_set_client, @@character_set_connection, 
@@character_set_results, @@character_set_server, 
@@init_connect, @@interactive_timeout, @@license, 
@@lower_case_table_names, @@max_allowed_packet, 
@@net_buffer_length, @@net_write_timeout, 
@@query_cache_size, @@query_cache_type, @@sql_mode, 
@@system_time_zone, @@time_zone, @@tx_isolation, 
@@wait_timeout
            1 Query    SET 
character_set_results = NULL
            1 Query    SET autocommit=1
            1 Query    SELECT * FROM Info

なんかCannonのEasy-WebPrint EXが関係あるようです。
そのプログラムはいらないので消してみたのですが、
内容は以下の通りでした。

151003 19:05:39        2 Connect    root@localhost on 
body
            2 Query    /* mysql-connector-
java-5.1.36 ( Revision: 
4fc1f969f740409a4e03750316df2c0e429f3dc8 ) */SELECT 
@@session.auto_increment_increment, 
@@character_set_client, @@character_set_connection, 
@@character_set_results, @@character_set_server, 
@@init_connect, @@interactive_timeout, @@license, 
@@lower_case_table_names, @@max_allowed_packet, 
@@net_buffer_length, @@net_write_timeout, 
@@query_cache_size, @@query_cache_type, @@sql_mode, 
@@system_time_zone, @@time_zone, @@tx_isolation, 
@@wait_timeout
            2 Query    SET 
character_set_results = NULL
            2 Query    SET autocommit=1
            2 Query    SELECT * FROM Info

内容についてはこれから調べてみます。

評価

0

ログの内容からエラー内容を読み取ることはできませんで
した。
なにか設定が違うのでしょうか?

ためしにrs.getMetaData()を出力させてみたところ、以下
の結果が得られました。

com.mysql.jdbc.ResultSetMetaData@101e819 - Field 
level information: 
    com.mysql.jdbc.Field@3603f2[catalog=body,tab
leName=info,originalTableName=info,columnName=name,o
riginalColumnName=name,mysqlType=254(FIELD_TYPE_STRI
NG),flags=, charsetIndex=33, charsetName=UTF-8]
    com.mysql.jdbc.Field@1b5cb04[catalog=body,ta
bleName=info,originalTableName=info,columnName=tv,or
iginalColumnName=tv,mysqlType=253(FIELD_TYPE_VAR_STR
ING),flags= BLOB, charsetIndex=33, charsetName=UTF-
8]
    com.mysql.jdbc.Field@1a011ee[catalog=body,ta
bleName=info,originalTableName=info,columnName=radio
,originalColumnName=radio,mysqlType=253(FIELD_TYPE_V
AR_STRING),flags= BLOB, charsetIndex=33, 
charsetName=UTF-8]
    com.mysql.jdbc.Field@1597d23[catalog=body,ta
bleName=info,originalTableName=info,columnName=movie
,originalColumnName=movie,mysqlType=253(FIELD_TYPE_V
AR_STRING),flags= BLOB, charsetIndex=33, 
charsetName=UTF-8]
    com.mysql.jdbc.Field@13adda9[catalog=body,ta
bleName=info,originalTableName=info,columnName=cm,or
iginalColumnName=cm,mysqlType=253(FIELD_TYPE_VAR_STR
ING),flags= BLOB, charsetIndex=33, charsetName=UTF-
8]
    com.mysql.jdbc.Field@c8c8e1[catalog=body,tab
leName=info,originalTableName=info,columnName=magazi
ne,originalColumnName=magazine,mysqlType=253(FIELD_T
YPE_VAR_STRING),flags= BLOB, charsetIndex=33, 
charsetName=UTF-8]

テーブルにあるカラム名の出力がされているので、少なく
ともテーブル絵のアクセスはできていると思います。

評価

0

実はスキーマ違いで同じ名前のテーブルがあるなんて話は
ないよな。
と思ったら、そもそもMYSQLにスキーマはないんだった。

評価

0

MySQLにスキーマ所有者はないみたいですが、スキーマはあり
ます。
別スキーマこのテーブルと同じ名前のものはありません。
その別スキーマのテーブルならうまくいっているのですが、
やっていることは同じようなことなのでなぜうまくいかない
のかわからないんです。

評価

0

いや、MySQLのスキーマは、データベースと同義だったなっ
て意味。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。