ページ 11

C#でSQLiteDBを操作するプログラムについて

Posted: 2015年4月16日(木) 17:48
by フルトン
C#でSQLiteDBを操作するプログラムについて質問があり投稿させていただきます。
下記サイトを参考にSystem.Data.SQLite.dllを導入し同サイトのサンプルを実行したところ、データ追加の処理で「SQLiteExceptionはハンドルされませんでした。unable to open database file」と言う例外が発生し、解決方法が分からず困っています。

参考URL:http://dangoya.jp/?p=116
プロジェクトtestのソース

コード:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SQLite;
using System.Diagnostics;

namespace test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // データ接続
        private void button1_Click(object sender, EventArgs e)
        {
            string dbConnectionString = "Data Source=E:\\Sample.db";
            using (SQLiteConnection cn = new SQLiteConnection(dbConnectionString))
            {
                try
                {
                    cn.Open();
                    MessageBox.Show("接続できました。", "タイトル", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                catch (Exception exception)
                {
                    MessageBox.Show(exception.Message, "タイトル", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        // データの追加
        private void button2_Click(object sender, EventArgs e)
        {
            string dbConnectionString = "Data Source=E:\\Sample.db";
            using (SQLiteConnection cn = new SQLiteConnection(dbConnectionString))
            {
                cn.Open(); //←ここで例外発生(?)
                using (SQLiteTransaction trans = cn.BeginTransaction())
                {
                    SQLiteCommand cmd = cn.CreateCommand();

                    // インサート文
                    cmd.CommandText = "INSERT INTO Sample (Name, Age) VALUES (@Name, @Age)";

                    // パラメータのセット
                    cmd.Parameters.Add("Name", System.Data.DbType.String);
                    cmd.Parameters.Add("Age", System.Data.DbType.Int64);

                    // データの追加
                    cmd.Parameters["Name"].Value = "田中";
                    cmd.Parameters["Age"].Value = 25;
                    cmd.ExecuteNonQuery();

                    cmd.Parameters["Name"].Value = "高橋";
                    cmd.Parameters["Age"].Value = 30;
                    cmd.ExecuteNonQuery();

                    // コミット
                    trans.Commit();
                }
            }
        }

        // データの取得
        private void button3_Click(object sender, EventArgs e)
        {
            string dbConnectionString = "Data Source=E:\\Sample.db";
            using (SQLiteConnection cn = new SQLiteConnection(dbConnectionString))
            {
                cn.Open();
                SQLiteCommand cmd = cn.CreateCommand();
                cmd.CommandText = "SELECT * FROM Sample";
                using (SQLiteDataReader reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        Debug.WriteLine("名前:" + reader["Name"].ToString());
                        Debug.WriteLine("年齢:" + reader["Age"].ToString());
                    }
                }
                cn.Close();
            }
        }
    }
}
C#(というかプログラム)は全くの初心者なので手も足も出ない状況なのですが、このソースコードのどこがダメなのかアドバイスをいただきたいです。

また初歩的な質問になりますが、接続先のDBを指定する際のURL的な記述("Data Source=E:\\Sample.db")について、「"DataSource=./Sample.db"」のようにファイルを指定する書き方ではダメなのでしょうか?
E:ドライブにDBがある訳では無いのですが、どのように記述すればいいのか分かりません。
このURL(?)の書き方もご教授してもらえると幸いです。
以下に環境を列挙します、よろしくお願いします。

<開発環境>
●Microsoft Visual C# 2010 Express
●.Net Framework 4.0
●System.Data.SQLite x86-2010.1.0.96.0(.Net Framework 4.0用)
●Sample.dbはDB Browser for SQLiteを使用して作成したものです、レコードはありません。
●DBのディレクトリ
画像
●DBの内容
画像

ちなみに"Data Source=./Sample.db"として実行した場合、接続は出来ましたがデータ追加のボタンをクリックすると「SQLiteExceptionはハンドルされませんでした。」となり処理が止まってしまいました。
また"Data Source=E:\\Sample.db";と指定して実行するとデータベースへ接続する時点でunable to open database fileとエラーが表示されました。
何故かはわかりません。。。

Re: C#でSQLiteDBを操作するプログラムについて

Posted: 2015年4月16日(木) 19:35
by sleep
>「Sample.dbファイルを置く場所」について
ソリューション構成は Debug で実行されてますかね?(プロジェクト(P)⇒ビルド⇒構成(C)「アクティブ(Debug)」)
「"DataSource=./Sample.db"」の場合、Sample.dbファイルを置く場所は ●DBのディレクトリ(画像上のパス)/bin/Debugです。
自分のプログラムが、どこをカレントディレクトリとして実行されているのかを確認してください。

>「接続は成功するが、追加でエラーが出る」について
接続は成功、とは出ていますが、実際は空のSample.dbファイルが ●DBのディレクトリ(画像上のパス)/bin/Debugに作成されているだけです。
テーブルは未作成の状態なので、カラムの追加処理は失敗します。

>「unable to open database file」について
PC上に存在しない場所である「"E:\\Sample.db"」を指定したため、作成できなかった空のSample.dbファイルをopenしようとして失敗しています。

Re: C#でSQLiteDBを操作するプログラムについて

Posted: 2015年4月16日(木) 19:43
by sleep
×:カラム ○:レコード

Re: C#でSQLiteDBを操作するプログラムについて

Posted: 2015年4月16日(木) 20:18
by フルトン
返信ありがとうございます
DBをbin/Debug内に移動させたところ無事レコードの追加が処理されました!
sleep さんが書きました:>「Sample.dbファイルを置く場所」について
ソリューション構成は Debug で実行されてますかね?(プロジェクト(P)⇒ビルド⇒構成(C)「アクティブ(Debug)」)
「"DataSource=./Sample.db"」の場合、Sample.dbファイルを置く場所は ●DBのディレクトリ(画像上のパス)/bin/Debugです。
自分のプログラムが、どこをカレントディレクトリとして実行されているのかを確認してください。
構成はDebugになっておりました。またカレントディレクトリは実行ファイルが置いてある場所(Debugフォルダ)になっていました。
sleep さんが書きました:>「接続は成功するが、追加でエラーが出る」について
接続は成功、とは出ていますが、実際は空のSample.dbファイルが ●DBのディレクトリ(画像上のパス)/bin/Debugに作成されているだけです。
テーブルは未作成の状態なので、カラムの追加処理は失敗します。
Debugフォルダを見たところ0KBのSample.dbが存在していました。
そういう事だったんですね・・・

>「unable to open database file」について
PC上に存在しない場所である「"E:\\Sample.db"」を指定したため、作成できなかった空のSample.dbファイルをopenしようとして失敗しています。
なるほど、やはり参考にさせていただいたサイトではE:ドライブ内のSample.dbを指定していると言うことですかね
と言うかURLと捉えていた記述もよくよく考えてみれば「¥¥」と記述しないと「E:\Sample.db」を指定できませんね
ただのパス指定なのに「http://~」と同類だと勘違いしていました。。。

何はともあれ解決へ導いてくださりありがとうございました。
超初歩的な質問でトピックを立ててしまい恐縮です。。。もう少し勉強したいと思います。