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

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

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

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

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

853閲覧

WPF、データベース接続を用いたログイン認証の方法作成方法がわからない

rirityowa

総合スコア2

C#

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

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2024/05/14 12:16

編集2024/05/14 14:13

実現したいこと

初めて質問するので読みにくかったら申し訳ございません。
現在WPFでの学習を行っています。
【実現したいこと】
・WPFアプリケーションにてログイン画面を作成し、ログイン認証を行いたい
・ログインユーザー情報はデータベース(SQLServer)に保存しておき、ユーザーが入力した内容に対しselectクエリを投げ、照合を行いたい

発生している問題・分からないこと

・ユーザーが入力した情報をどうやってSQLServerに送るのかがいまいち理解できていません。
・とりあえず入力チェックなどは行わず、ただ情報があるかどうかだけを照合したいです。

該当のソースコード

XAML

1<Window x:Class = "DB_Login_Test.MainWindow" 2xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3xmlns="http://schemas.microsft.com/winfx/2006/xaml" 4Title="MainWindow"> 5<Grid> 6<!--ユーザーID--> 7<TextBox x:Name="txt_User" Content="" /> 8<PasswordBox x:Name="txt_Pass" Content="" /> 9 <Button x:Name="btn_login" Content="ログインする" Click="Button_Click" /> 10</Grid> 11</Window>
using System; using System.Windows; using ViewModel //メインウィンドウ namespace DB_Login_Test { //プロパティ public string Read_userId{get; set;} //ユーザー情報保持する public string Read_Password{get; set;} //パスワード情報保持する public class MainWindow : Window { InitiallizeCompornent(); } //ユーザーの入力した情報をプロパティに保持するメソッド public void GetLoginInfo() { Read_userID = txt_User.Text; //ID Read_Password = txt_Pass.Text; //パスワード } public void Button_click(object sender, RoutedEventArgs e) { //ボタンが押されたときの処理 //情報保持メソッド呼び出し    GetLoginInfo();     //接続クラスインスタンス化 DB_Connection Connect = new DB_Connection();     Connect.Connection(); //メソッド呼び出し      //DBと照合を行ってTrueならOK,falseならエラー!と出るメッセージウィンドウを出す    if( パスワード == select文。。? //ここわからない ) {       MassageBox("ログインできました!")    }else{ MassageBox.show("エラーです。。。") } }

DB_Connection.cs

1using System.Data.SqlClient; 2using System.Data; 3 4//DBと接続するclass 5public void DB_Connection 6{ 7 8public void Connection(){ 9 //接続用ストリーム 10 string connectionString = "Data Source=サーバー名;Initial Catalog=データベース名;Security=True;" 11 12 using (SqlConnection connection = new SqlConnection(connectionString)) 13 { 14 connection.Open(); 15 16 using (SqlCommand command = new SqlCommand("SELECT * FROM USR.LoginTable", connection)) 17 { 18 using (SqlDataReader reader = command.ExecuteReader()) 19 { 20 while (reader.Read()) 21 { 22 //とりあえず読みだしたものを表示 23 Console.WriteLine($"Name: {name}, Age: {age}"); 24 } 25 26     //接続閉じる 27     Connnection.Close(); 28 29 } 30 } 31 } 32} 33

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

色々なところを調べたり、確認してみたのですが、どうしてもわかりませんでした。
浅学でご迷惑をおかけすると思いますが、ご助力いただけると恐縮です。
また、このコード内でおかしなところがあればご指摘ありますと大変うれしいです。
何卒宜しくお願い致します。

参考サイト:https://csharp.keicode.com/topics/database-select.php
https://plaza.rakuten.co.jp/mathmati/diary/202404070004/?scid=wi_blg_amp_diary_next
https://qiita.com/homan05872/items/787909b297f150a4d22e

理想の形(本当はVMMVを意識したかったのですが、難しかったのでとりあえずVMを呼び出す形をとりました):https://qiita.com/ara-bot/items/36946bb10ef25261e814

補足

1.テーブル定義
ローカル下のSQLServerに作成していたので、こちらにテーブル情報失礼します。

使用テーブル:[USR].[LoginTable]
カラム情報
①id(int 非NULL IDENTITY PK) ②userid(varchar(10) 非NULL UK) ③password(varchar(10) 非NULL) ④Name(varchar(20) 非NULL)

④Nameについては今後グリッドビューにこのテーブルを表示したいと考えているので追加しています(今回聞きたい情報としては違うかもしれないですが、一応記載させてください)

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

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

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

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

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

hqf00342

2024/05/14 13:51

ログインユーザー情報があるテーブルの定義を記載したほうが回答が出ると思います。 また、DB_Connectionがコピペミスなのかクラスではなくメソッドになっているようです。
rirityowa

2024/05/14 14:11

hqf00342さん、ご指摘ありがとうございます! 1.テーブル定義 ローカル下のSQLServerに作成していたので、以下にテーブル定義記載させてください。 使用テーブル:[USR].[LoginTable] カラム情報 ①id(int 非NULL IDENTITY PK) ②userid(varchar(10) 非NULL UK) ③password(varchar(10) 非NULL) ④Name(varchar(20) 非NULL) ④Nameについては今後グリッドビューにこのテーブルを表示したいと考えているので追加しています(今回聞きたい情報としては違うかもしれないですが、一応記載させてください) 2.クラス名がメソッドになっている 大変失礼失礼しました…!()消して修正しました。 何卒よろしくお願いします。
guest

回答1

0

ベストアンサー

ユーザ名とパスワードでDBに問い合わせする関数Check()を作ります。
SQLでユーザ名、パスワードが一致するデータを探し、1行でもあればtrueを返すようにします。

csharp

1public class DB_Connection : IDisposable 2{ 3 private readonly string connStr = @"接続文字列"; 4 private readonly SqlConnection _conn; 5 6 public DB_Connection() 7 { 8 //DBに接続 9 _conn = new SqlConnection(connStr); 10 _conn.Open(); 11 } 12 13 //ユーザ名、パスワードをチェックする。あればtrueを返す。 14 public bool Check(string username, string password) 15 { 16 var cmd = _conn.CreateCommand(); 17 cmd.CommandText = "SELECT * FROM USR.LoginTable WHERE userid=@name AND password=@pass"; 18 cmd.Parameters.AddWithValue("@name", username); 19 cmd.Parameters.AddWithValue("@pass", password); 20 using var reader = cmd.ExecuteReader(); 21 //SQLの結果が1行でもあればマッチしたと考える 22 return reader.HasRows; 23 } 24 25 //参考:ユーザ一覧を取得する 26 public IEnumerable<User> GetAllUsers() 27 { 28 var cmd = _conn.CreateCommand(); 29 cmd.CommandText = "SELECT * FROM LoginTable"; 30 using var reader = cmd.ExecuteReader(); 31 if(reader.HasRows) { 32 while (reader.Read()) { 33 yield return new User() { 34 Id = (int)reader["id"], 35 Name = (string)reader["Name"], 36 UserId = (string)reader["userid"], 37 Password = (string)reader["password"] 38 }; 39 } 40 } 41 } 42 43 public void Dispose() 44 { 45 _conn?.Dispose(); 46 } 47} 48 49//ユーザ一覧用のPOCOクラス 50public class User 51{ 52 public int Id { get; set; } 53 public string UserId { get; set; } 54 public string Name { get; set; } 55 public string Password { get; set; } 56}

使う側は

csharp

1using var db = new DB_Connection(); 2if(db.Check("ユーザ名", "パスワード") 3{ 4 //成功 5}

エラーチェックは省いてますので必要に応じて入れてください。

蛇足(重要)ですが生パスワードをDBに直接保存する設計はセキュリティ上問題ですのでハッシュ化することをお勧めします。

投稿2024/05/14 16:12

hqf00342

総合スコア394

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

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

rirityowa

2024/05/15 08:55

返信遅くなってしまい申し訳ございません。 ご回答ありがとうございます…! 頂いた通り作成したところ作りたかった部分がしっかり作れて、ログインの有無確認できました…! メソッド使う側の処理としても書いてくださってとても有難かったです。 普段if文使う時(変数 == hogehoge)みたいな形で書いていたので、メソッドの中に引数として書くことで使えることも学ぶことができました。 プロパティも必要なIDとPASSWORD のみでいいのかな?と思っていたのですが、必要ですね… もう少し学習します。 また、アドバイスもありがとうございます!ハッシュ化しないで生で作ってました…作り直してやってみます。 丁寧に回答してくださったり、アドバイスくださって本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問