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

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

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

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

SQLite

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

2回答

2639閲覧

テキストボックスにテキストとDBのデータを比べる方法について

mimi3103

総合スコア8

C#

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

SQLite

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

1クリップ

投稿2018/10/18 13:03

前提・実現したいこと

Visual Studio2017のWindows Formアプリケーションにて,アプリを作成中です.
Form画面には,ボタンが2つと,テキストボックスが1つ,DataGridViewが1つ配置されています.
また,SQLiteにてDBを作成しました.テキストボックスに入力された文字列や数字が
DBの中にあるかどうかを判別するプログラムを書きたいです.ボタン1がクリックされると
DBに接続し,テーブルの作成やデータの追加などを行います.そしてボタン2が押されると
それらをDataGridViewに表示します. このボタン2をクリックしたときに,テキストボックスに入力された
テキストと,DBの中のデータと1つでも一致したら,OKとLabelに表示するプログラムを作成したいです.

発生している問題・エラーメッセージ

TextBoxのテキストを変数に格納して,SELECT FROM WHERE INの中で検索しようとしたのですが,
変数が認識されません.
ソースコードいろいろと変更した結果中途半端な内容ですが
貼っておきます.

該当のソースコード

C#

1sing System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10using System.Data.SQLite; 11using System.IO; 12 13namespace Database_1018 14{ 15 public partial class Form1 : Form 16 { 17 public Form1() 18 { 19 InitializeComponent(); 20 } 21 string path = "test.db"; 22 23 private void button1_Click(object sender, EventArgs e) 24 { 25 // テーブルを作成 (test.dbを新規で作成する場合のみ) 26 if (File.Exists(path) == false) 27 { 28 using (SQLiteConnection con = new SQLiteConnection("Data Source=" + path)) 29 { 30 // DataBase接続開始 31 con.Open(); 32 using (SQLiteCommand cmd = con.CreateCommand()) 33 { 34 cmd.CommandText = "CREATE TABLE Lesson (社員ID INTEGER, name NVARCHAR(10), 年齢 INTEGER, 部署名 NVARCHAR(10), パスワード INTEGER)"; 35 cmd.ExecuteNonQuery(); 36 } 37 } 38 39 } 40 41 using (SQLiteConnection con = new SQLiteConnection("Data Source=" + path)) 42 { 43 con.Open(); 44 using (SQLiteCommand cmd = con.CreateCommand()) 45 { 46 con.Open(); 47 cmd.CommandText = "INSERT INTO Lesson (社員ID,name,年齢,部署名,パスワード) VALUES(1000,'TOM',23,'開発技術部',11111111)"; 48 cmd.ExecuteNonQuery(); 49 cmd.CommandText = "INSERT INTO Lesson (社員ID,name,年齢,部署名,パスワード) VALUES(2000,'MIKE',23,'開発技術部',22222222)"; 50 cmd.ExecuteNonQuery(); 51 cmd.CommandText = "INSERT INTO Lesson (社員ID,name,年齢,部署名,パスワード) VALUES(3000,'JOHN',25,'開発技術部',33333333)"; 52 cmd.ExecuteNonQuery(); 53 cmd.CommandText = "INSERT INTO Lesson (社員ID,name,年齢,部署名,パスワード) VALUES(4000,'EMI',23,'開発技術部',44444444)"; 54 cmd.ExecuteNonQuery(); 55 } 56 } 57 } 58 private DataTable dataTable = new DataTable(); 59 60 protected override void OnLoad(EventArgs e) 61 { 62 dataGridView1.DataSource = dataTable; 63 base.OnLoad(e); 64 } 65 66 private void button2_Click(object sender, EventArgs e) 67 { 68 string text1; 69 text1 = textBox1.Text; 70 71 using (SQLiteConnection con = new SQLiteConnection("Data Source=" + path)) 72 { 73 con.Open(); 74 using (SQLiteDataAdapter adapter = new SQLiteDataAdapter("SELECT * FROM Lesson", con)) 75 adapter.Fill(dataTable); 76 77 try 78 { 79 string sql = "select * from lesson where text1"; 80 81 SQLiteCommand com = new SQLiteCommand(sql, con); 82 SQLiteDataReader sdr = com.ExecuteReader(); 83 } 84 finally 85 { 86 con.Close(); 87 } 88 } 89 } 90 } 91} 92 93 94 95

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

Visual Studio 2017 C# Windows Form アプリケーション SQLite

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

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

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

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

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

guest

回答2

0

C#

1string sql = "select * from lesson where text1";

上記の書き方が意図しているものと違っている気がします。以下のように変更して試してみたらいかがでしょうか。
name列で検索する前提ですが・・・

c#

1string sql = "select * from lesson where name =" + text1;

ダブルクォーテーション内の文字列は、特別な場合をのぞいてただの文字列として扱われます。
変数として扱いたい場合は、上記の通り文字列と連結するなどしてやらないといけません。

投稿2018/10/18 14:01

shun_kuwa

総合スコア187

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

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

mimi3103

2018/10/22 05:27

回答ありがとうございます. さっそくアドバイスいただいたことを実践してみたのですが 以下のようなエラーが発生してしまいました. ①using (SQLiteConnection con = new SQLiteConnection("Data Source=" + path)) using (SQLiteDataAdapter adapter = new SQLiteDataAdapter("SELECT * FROM Lesson WHERE name =" + text1, con)) { adapter.Fill(dataTable); } にて実行した結果adapter.Fill(dataTable); の部分でSystem.Data.SQLite.SQLiteException: 'SQL logic error incomplete input' というエラーが発生してしまいました.
mimi3103

2018/10/22 05:32

②string text1; text1 = textBox1.Text; try { string sql = "select * from lesson where name =" + text1; SQLiteCommand com = new SQLiteCommand(sql, con); SQLiteDataReader sdr = com.ExecuteReader(); if (sdr.Read() == true) { this.label1.Text = "ok"; } } finally { con.Close(); } にて実行をした結果SQLiteDataReader sdr = com.ExecuteReader();の部分でSystem.Data.SQLite.SQLiteException: 'SQL logic error incomplete input'というエラーが発生してしまいました. そもそもDB自体がうまく作成されてないということなのでしょうか? アドバイスお願いしたいです.
YAmaGNZ

2018/10/22 05:37

実行するSQLを確認しましょう。 SQLiteで文字列を比較するときはシングルクォーテーションで囲まないといけません。 DBが絡む処理のデバッグを行う場合、実行されるSQLがどうなっているかは意識しないとできませんので 確認する癖をつけましょう。
shun_kuwa

2018/10/22 06:14

YAmaGNZさんのおっしゃる通りで、私のサンプルにシングルクォーテーションが抜けておりました。 正しくは以下ですね。 string sql = "select * from lesson where name ='" + text1 + "'"; 本来はstring.Format()等使ってもう少し見やすく書きたいところですが、問題の本質とは異なるのでここでは割愛させていただきます。
mimi3103

2018/10/25 14:13

お二方,回答ありがとうございました. そうですね...知識不足でした.これから勉強を進めてまいります. シングルクォーテーションで囲んだところ,無事,求めていた機能を実現することができました. みなさんありがとうございました!
guest

0

ボタン2押したときに、DBからdatagridviewにデータを表示後、テキストの内容とDBを比較とのことですが、DBは他のユーザーから変更されていることは考えないのでしょうか?もし、変更されているとしたら
okとなっても、datagridviewには存在しないデータで合致する現象が発生すると思います。
この場合、DBと比較するのではく、datagridviewの内容と比較するほうが確実なのではないでしょうか?

投稿2018/10/20 04:58

akirafudo6

総合スコア341

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

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

mimi3103

2018/10/25 14:12

回答ありがとうございます! 今回は他のユーザからの変更は考慮しなくて問題ありませんでした. すみません,記載しておくべきでした...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問