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

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

ただいまの
回答率

90.61%

  • Java

    13518questions

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

  • SQLite

    605questions

    SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

  • JDBC

    91questions

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

SQLite3.20のデータファイル内容をJDBCからのアクセスで更新できない。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 480

honnbuhinn

score 2

前提・実現したいこと

JavaからJDBCドライバ(sqlite3.20Driver)を用いてsqlite3.20上のデータベースを触ろうとしています。接続は完了し、結果も返ってきているのですがなぜかデータベース上のデータが更新されません。
DBviererを用いても、やはり更新されていないようです。
何が原因かわかりません。

もしよろしければ、DBに結果が反映されない原因を推測していただきたいです。

ちなみに、コマンドライン上で行ったものはデータが更新されています。

該当のソースコード

package test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class testJDBC

{
public static void main(String[] args) throws ClassNotFoundException
{
// load the sqlite-JDBC driver using the current class loader
Class.forName("org.sqlite.JDBC");

Connection connection = null;
Statement statement=null;

try
{
// create a database connection
connection = DriverManager.getConnection("jdbc:sqlite:test.sqlite");

connection.setAutoCommit(false);

statement = connection.createStatement();
statement.setQueryTimeout(30);  // set timeout to 30 sec.

statement.executeUpdate("drop table if exists person");
statement.executeUpdate("create table person (id integer, name string)");
statement.executeUpdate("insert into person values(1, 'leo')");
statement.executeUpdate("insert into person values(2, 'yui')");
statement.executeUpdate("insert into person values(3, 'kyoko')");

ResultSet rs = statement.executeQuery("select * from person");

while(rs.next())
{
// read the result set
System.out.println("name = " + rs.getString("name"));
System.out.println("id = " + rs.getInt("id"));
}

connection.commit();

}
catch(SQLException e)
{
// if the error message is "out of memory",
// it probably means no database file is found
System.err.println(e.getMessage());
}
finally
{
try
{
if(connection != null)
connection.close();
}
catch(SQLException e)
{
// connection close failed.
System.err.println(e);
}
}
}
}

試したこと

Autocommitを変更してみる。

補足情報(言語/FW/ツール等のバージョンなど)

sqlite3.20
Java
Eclipse 4.70

当方プログラム経験はかなり浅いです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

確認しているファイルが間違っている可能性はありませんでしょうか。testJDBC を
実行した時のカレントディレクトリ上にファイル名「test.sqlite」で保存されているはずです。

当方の確認環境は以下ですが、3件のデータがpersonテーブルへ正しくINSERTされていました。
Windows 7
Java 1.8.0_131
sqlite-jdbc-3.20.0.jar
Eclipse 4.7.0

参考に、ファイルの存在確認をするコードを示します。
import java.io.File; を追加して、
connection = DriverManager.getConnection("jdbc:sqlite:test.sqlite");
の行の後に入れてみて、確認してみてください。

connection = DriverManager.getConnection("jdbc:sqlite:test.sqlite");
// getConnection() 実行後にファイル「test.sqlite」が作成される

// プログラム実行時のカレントディレクトリPATHを取得
String path = new File(".").getAbsoluteFile().getParent();
System.out.println("current directory: " + path);

// test.sqlite がカレントディレクトリ上に存在するか確認
File dbfile = new File(path, "test.sqlite");
if (dbfile.isFile()) {
    // ここに来るはず
    System.out.println("dbfile: " + dbfile.getAbsolutePath() + " exists.");
} else {
    System.out.println("dbfile: " + dbfile.getAbsolutePath() + " does NOT exist.");
}

あと、唯一、思い当たりそうな箇所といえばfinally節でstatement を
close()していないところですが、connectionとは関係無い部分でかつ、
connectionはcommit()されてテーブルの更新は確定するので関係なさそうです。

試したところではcloseしてもしなくてもテーブルは更新されていました。

でも、プログラミングとしてはclose()しといた方がよさそうです。
他の環境では挙動に影響があるかもしれません。(そういうことが実際にあるかは未確認です)

} finally {
  try {
    // statement のclose()を追加
    if (statement != null) {
      statement.close();
    }

    if (connection != null) {
      connection.close();
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/02 20:57

    カレントディレクトリのファイルパスが間違っていました。
    本当に有難うございます。
    とても勉強になりました。
    また、自分の勉強不足も身にしみました。

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13518questions

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

  • SQLite

    605questions

    SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

  • JDBC

    91questions

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