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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQLite

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

Q&A

解決済

3回答

16141閲覧

SQLiteエラーが解決できない

yamaguti

総合スコア185

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQLite

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

0グッド

0クリップ

投稿2016/12/27 07:49

お世話になります。

C#とSqliteでタスク管理を行うシステムを作成しております。

テスト的にまずはプログラム側で固定値をDBにインサートしようとしているのですが、下記エラーが発生してしまいます。

SQL logic error or missing database
no such table: jgpdb

どなたか解決法をご教示頂けますでしょうか。
よろしくお願い致します。

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; namespace JGP対応管理 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { } private void button1_Click(object sender, EventArgs e) { string dbConnectionString = "Data Source= C:\\jgpdb"; 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= C:\\jgpdb"; using (SQLiteConnection cn = new SQLiteConnection(dbConnectionString)) { cn.Open(); using (SQLiteTransaction trans = cn.BeginTransaction()) { SQLiteCommand cmd = cn.CreateCommand(); // インサート文 //cmd.CommandText = "INSERT INTO jgpdb (NO,Overview,System,Requester,Contents,person,Duedate,StatusKBN)VALUES(@NO,@Overview,@System,@Requester,@Contents,@person,@Duedate,@StatusKBN)"; cmd.CommandText = "INSERT INTO jgpdb (NO,Overview,System)VALUES(@NO,@Overview)"; // パラメータのセット cmd.Parameters.Add("NO", System.Data.DbType.Int64); cmd.Parameters.Add("Overview", System.Data.DbType.String); // データの追加 cmd.Parameters["NO"].Value = 1; cmd.Parameters["Overview"].Value = "あ"; cmd.ExecuteNonQuery(); cmd.Parameters["NO"].Value = 1; cmd.Parameters["Overview"].Value = "あ"; cmd.ExecuteNonQuery(); // コミット trans.Commit(); } } // using (SQLiteTransaction trans = cn.BeginTransaction()) // { // SQLiteCommand cmd = cn.CreateCommand(); // System.Data.SQLite.SQLiteParameter text1 = textBox1.Text; // //インサート文 // cmd.CommandText = "INSERT INTO jgpdb (NO,Overview,System,Requester,Contents,person,Duedate,StatusKBN)VALUES(@NO,@Overview,@System,@Requester,@Contents,@person,@Duedate,@StatusKBN)"; // ////パラメータセット // //cmd.Parameters.Add("No", System.Data.DbType.Int64); // //cmd.Parameters.Add("Overview", System.Data.DbType.String); // //cmd.Parameters.Add("System", System.Data.DbType.String); // //cmd.Parameters.Add("Requester", System.Data.DbType.String); // //cmd.Parameters.Add("Contents", System.Data.DbType.String); // //cmd.Parameters.Add("person", System.Data.DbType.String); // //cmd.Parameters.Add("Duedate", System.Data.DbType.VarNumeric); // //cmd.Parameters.Add("StatusKBN", System.Data.DbType.UInt64); // //データ追加 // cmd.Parameters["No"] = text1; // } //} } } }

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

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

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

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

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

ozwk

2016/12/27 07:59

データベース:jgpdbにテーブル:jgpdbがそもそも存在してますか?
yamaguti

2016/12/27 08:09

select * from jgpdbを流しカラムが表示されるので、存在しています
A.Ichi

2016/12/27 09:58

jgpdbの物理名称は、jgpdb.dbって事は無い?
yamaguti

2016/12/27 11:31

こちらを確認してみたのですが、問題ございませんでした。
A.Ichi

2016/12/27 11:58

エクスプローラでのドット以下が隠れていたのでと考えてしまいました。失礼しました。
guest

回答3

0

ベストアンサー

質問文の以下の部分ですが、

// インサート文 //cmd.CommandText = "INSERT INTO jgpdb (NO,Overview,System,Requester,Contents,person,Duedate,StatusKBN)VALUES(@NO,@Overview,@System,@Requester,@Contents,@person,@Duedate,@StatusKBN)"; cmd.CommandText = "INSERT INTO jgpdb (NO,Overview,System)VALUES(@NO,@Overview)"; // パラメータのセット cmd.Parameters.Add("NO", System.Data.DbType.Int64); cmd.Parameters.Add("Overview", System.Data.DbType.String); // データの追加 cmd.Parameters["NO"].Value = 1; cmd.Parameters["Overview"].Value = "あ"; cmd.ExecuteNonQuery(); cmd.Parameters["NO"].Value = 1; cmd.Parameters["Overview"].Value = "あ"; cmd.ExecuteNonQuery();

次のように書き換えたらどうなりますか?
※テーブルの"System"フィールドは無視します。

cmd.CommandText = "INSERT INTO jgpdb (NO,Overview)VALUES(@NO,@Overview)"; cmd.Parameters.Add(new SQLiteParameter("@NO", 1)); cmd.Parameters.Add(new SQLiteParameter("@Overview", "あ")); cmd.ExecuteNonQuery();

もしかしたら最初の"cmd.Parameters.Add"文の値の1はダブルクォートが必要かもしれないです。

「データの追加」部分で同じ値を2度セットしているのがちょっと???だったのですがそれは置いといて・・・
yamagutiさんが参考にされた(であろうと私が勝手に思っている)サイトの記述は私も最初引用、というかパクろうとしたのですが上手くいかず、上記のように書いたら動いた次第です。

あと、"cmd.Parameters.Add"文の"@"はtypoではないです。

投稿2016/12/27 11:49

編集2016/12/27 11:50
ynakano

総合スコア1894

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

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

ynakano

2016/12/27 12:01

あと、jgpdbテーブルは存在していますでしょうか。 もしくはDBがオープンできていないとか。 メッセージを素直に読むと「そんなテーブルない」なので。
guest

0

C:\jgpdbと書かれているのですがwindowsなのでしたら
C:\jgpdb
で記載しないとだめですよ

投稿2016/12/27 09:42

NAZA

総合スコア11

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

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

yamaguti

2016/12/27 11:12

そうなのですか。ありがとうございます修正します。
ynakano

2016/12/27 11:19

いや、ダブルクォーテーションで囲まれているので、\(円マーク)を2つ重ねてエスケープする、で いいんですよ。 円マークを一つにするのなら以下のような書き方にする必要があります。 string dbConnectionString = @"Data Source= C:\jgpdb"; 「C# クォートストリング」で検索してみてください。
yamaguti

2016/12/27 11:21

ありがとうございます。 調べてみます。
guest

0

SQLite がすぐに用意できないのであてずっぽうですが、

cmd.CommandText = "INSERT INTO jgpdb (NO,Overview,System)VALUES(@NO,@Overview)";

この列名のリスト(3個)と、値のリスト(2個)の個数が違っているのはいいのでしょうか?
また、列名のリストの列名がテーブル定義と正確に一致していますか?

投稿2016/12/27 08:22

mit0223

総合スコア3401

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

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

yamaguti

2016/12/27 11:11

>この列名のリスト(3個)と、値のリスト(2個)の個数が違っているのはいいのでしょうか? 見落としてました修正致しました。 >また、列名のリストの列名がテーブル定義と正確に一致していますか? 確認しましたが一致しています。 エラーがこちらです {"SQL logic error or missing database\r\nno such table: jgpdb"}
mit0223

2016/12/29 01:06

ググってみてると、sqlite でこのエラーにハマる理由は、データベースファイルがオンデマンドに作られてしまい、エラーならないので、意図せず新しいデータベースファイルで動作してしまうことのようです。たとえば、「select * from jgpdbを流しカラムが表示されるので、存在しています」で確認したデータベースファイルとプログラムが接続しているデータベースファイルがちがうということはないでしょうか? c:\jgpdb , c:\jgpdb.db , c:\jgpdb.db.db みたいにたくさんファイルができてたりしませんでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問