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

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

ただいまの
回答率

90.35%

  • C#

    7653questions

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

  • SQLite

    664questions

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

  • ASP.NET

    553questions

    ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

型のキャスト

解決済

回答 1

投稿

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

yamaguti

score 99

お世話になります。

パスワードを管理するシステムのログイン画面を実装しております。
そこで、DBから取ったデータをテキストボックスの入力値と比較したいのですがうまくいきません。
ご教示の程のよろしくお願い致します。

コメントの                        //SELECT文結果取得(ID)部分です。

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

namespace WindowsFormsApplication4
{
    public partial class Login : Form
    {
        public Login()
        {
            InitializeComponent();
        }

        public void buttonLogin_Click(object sender, EventArgs e)
        {
            string dbConnectionString = "Data Source = C:\\Users/myfriend.sqlite3";
            using (SQLiteConnection cn = new SQLiteConnection(dbConnectionString))
            {
                cn.Open();
                using (SQLiteTransaction trans = cn.BeginTransaction())
                {
                    SQLiteCommand cmd = cn.CreateCommand();
                    //ログインマスターSELECT
                    cmd.CommandText = "select ID from LOGIN";
                    using (SQLiteDataReader reader = cmd.ExecuteReader())
                    {
                        //SELECT文結果取得(ID)
                        var a = reader;
                        var b = a.ToString();
                        //IDの一致判断
                        if (textLogin.Text == b) {

                        }
                    }
                    cmd.CommandText = "select PW from LOGIN";
                    using (SQLiteDataReader reader = cmd.ExecuteReader())
                    {
                        //SELECT文結果取得(PW)
                        var PW = reader;

                    }
                    cn.Close();
                }
            }

            //登録画面に遷移
            Touroku Touroku = new Touroku();

            Touroku.Show();
            //ログイン画面を閉じる
            this.Visible = false;
        }

        private void buttonMaster_Click(object sender, EventArgs e)
        {
            Master Master = new Master();
            Master.Show();
            this.Visible = false;
        }

        private void Login_Load(object sender, EventArgs e)
        {
            this.ActiveControl = this.textLogin;
        }

        private void textLogin_TextChanged(object sender, EventArgs e)
        {

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2017/01/16 21:07

    ASP.NET のタグがついていますが、コードを見ると Login : Form と Windows Forms アプリのように見えます。どっちなんですか?

    キャンセル

回答 1

checkベストアンサー

+3

System.Data.SQLiteをご使用ですね。
SQLiteに限らず、ADO.NETはどのDBでもだいたい同じ書き方になるので
基本を覚えておきましょう。

簡単に書き直してみました。
同じテーブルからIDとパスワードを取るのであれば、1回のSQLでまとめて読むのが良いと思います。

//ここの変数に値を取ってくることにします
string id = null;
string pw = null;

//※ \ と / が混ざっているのがすごく気になる…。
// Windows環境なら通常は \ を使います
//string dbConnectionString = "Data Source = C:\\Users/myfriend.sqlite3";
string dbConnectionString = @"Data Source = C:\Users\myfriend.sqlite3";

//※usingをぬける際にConnectionは勝手にCloseされます
using (SQLiteConnection cn = new SQLiteConnection(dbConnectionString))
{
    cn.Open();

    //これだけの処理ならわざわざBeginTransactionする必要はないかも…
    using (SQLiteTransaction trans = cn.BeginTransaction())
    using (var cmd = cn.CreateCommand())    //コマンドも usingしたほうがいいでしょう
    {
        cmd.CommandText = "select ID, PW from LOGIN";
        using (SQLiteDataReader reader = cmd.ExecuteReader())
        {
            //レコードが複数件取得される場合は
            // while (reader.Read()){...} とやってループさせるなど
            if (reader.Read())
            {
                //何列目のカラムかわかっているときは
                //直接 reader.GetString(0) と数字で指定しても良い
                id = reader.GetString(reader.GetOrdinal("id"));
                pw = reader.GetString(reader.GetOrdinal("pw"));
            }
        }
    }
}

//取ってきた情報と一致判定
if (textLogin.Text == id) {...}

なお、上記の例だとテーブルには1レコードしか入っていないことが前提です。
複数ユーザー分のログインIDレコードが格納される想定でしたら、

  • SQL分にWHERE句を追加して取得されるレコードを絞り込む
  • while (reader.Read()){...} とやって一致するレコードが見つかるまでループさせる

等の処理が必要になると思います。

また、試してみてうまくいかない場合は、

  1. DataSourceで指定した場所のファイルをちゃんと見に行けているか
  2. テーブルレコードの値が正しくとれているか
  3. TextBoxに入力された値との一致判定が思ったとおりに機能しているか

というように、1つずつ順を追って確認してみてください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • C#

    7653questions

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

  • SQLite

    664questions

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

  • ASP.NET

    553questions

    ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。