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

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

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

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

SQL Server

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

Windows Forms

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

Q&A

解決済

3回答

2530閲覧

Windowsformを使ったマスタメンテ画面の作成

kawanoonigiri

総合スコア14

C#

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

SQL Server

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

Windows Forms

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

0グッド

0クリップ

投稿2022/02/14 01:09

前提・実現したいこと

C#初学者です。
windowsformとSQLserver、C#を使ったユーザーマスタメンテの画面を作成しています。
下記③番の条件にて入力された、ユーザーIDとサーバーに登録されたIDを比較するコード書けず止まっています。

①ユーザーID(6桁の整数)を入力し、
②「入力完了(btnFinish_Click)」をクリックすると、
③サーバーにそのIDが登録されていなければ
④ユーザー名、パスワードを入力し登録する。
という流れです。

お力添えいただけますと幸いです。

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

該当のソースコード

SQLserver

1USER_ID USER_NAME PASSWORD ADMIN_FLAG CRT_DAY CRT_TIME 21 tanaka aaa NULL NULL NULL 32 yamada bbb NULL NULL NULL

C#

1 2using System; 3using System.ComponentModel; 4using System.Data.SqlClient; 5using System.Text; 6using System.Windows.Forms; 7 8namespace user_registration 9{ 10 public partial class Form1 : Form 11 { 12 public Form1() 13 { 14 InitializeComponent(); 15 timer1.Start(); 16 ActiveControl = textBox1; 17 MessageBox.Show("ORG0001 START"); 18 19 20 } 21 22 private void Form1_KeyDown(object sender, KeyEventArgs e) 23 { 24 switch (e.KeyCode) 25 { 26 27 case Keys.F9: 28 btnRevocation.Focus(); 29 btnRevocation.PerformClick(); 30 break; 31 32 case Keys.F10: 33 btnClosing.Focus(); 34 btnClosing.PerformClick(); 35 break; 36 37 case Keys.F12: 38 btnFinish.Focus(); 39 btnFinish.PerformClick(); 40 break; 41 42 default: 43 return; 44 } 45 } 46 47 private void checkBox1_CheckedChanged(object sender, EventArgs e) 48 { 49 50 } 51 52 private void Form1_Load(object sender, EventArgs e) 53 { 54 KeyPreview = true; 55 } 56 57 private void label1_Click(object sender, EventArgs e) 58 { 59 60 } 61 62 private void textBox1_TextChanged(object sender, EventArgs e) 63 { 64 65 66 } 67 68 private void timer1_Tick(object sender, EventArgs e) 69 { 70 DateTime datetime = DateTime.Now; 71 lblDate.Text = datetime.ToString("yyyy/MM/dd HH:mm:ss"); 72 } 73 74 75 76 private void textBox3_TextChanged(object sender, EventArgs e) 77 { 78 79 } 80 81 private void groupBox2_Enter(object sender, EventArgs e) 82 { 83 84 } 85 86 private void groupBox1_Enter(object sender, EventArgs e) 87 { 88 89 } 90 91 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 92 { 93 94 } 95 96 private void btnDeletion_Click(object sender, EventArgs e) 97 { 98 if (body.Enabled == false) 99 { 100 textBox1.Clear(); 101 } 102 103 if (header.Enabled == false) 104 { 105 106 if (!String.IsNullOrEmpty(textBox2.Text)|| !String.IsNullOrEmpty(textBox3.Text)) 107 { 108 textBox2.Clear(); 109 textBox3.Clear(); 110 checkBox1.Checked = false; 111 } 112 else 113 { 114 checkBox1.Checked = false; 115 header.Enabled = true; 116 body.Enabled = false; 117 } 118 } 119 120 121 } 122 123 124 private void btnClosing_Click(object sender, EventArgs e) 125 { 126 if (String.IsNullOrEmpty(textBox1.Text) && String.IsNullOrEmpty(textBox2.Text) && String.IsNullOrEmpty(textBox3.Text)) 127 { 128 Application.Exit(); 129 } 130 else 131 { 132 DialogResult result = MessageBox.Show("入力中の内容は破棄されます。\nよろしいですか?", 133 "確認", 134 MessageBoxButtons.YesNo, 135 MessageBoxIcon.Exclamation); 136 137 if (result == DialogResult.Yes) 138 { 139 MessageBox.Show("ORG0001 END"); 140 Application.Exit(); 141 } 142 } 143 144 } 145 146 private void btnFinish_Click(object sender, EventArgs e) 147 { 148 149 try 150 { 151 if (header.Enabled == true) 152 { 153 if (String.IsNullOrEmpty(textBox1.Text)) 154 { 155 MessageBox.Show("ユーザーコードを入力してください。"); 156 ActiveControl = textBox1; 157 return; 158 } 159 } 160 161 if (textBox1.Text.IndexOf(' ') > -1 && this.ActiveControl != null) 162 { 163 MessageBox.Show("不正な文字列が含まれています"); 164 ActiveControl = textBox1; 165 return; 166 } 167 168 body.Enabled = true; 169 header.Enabled = false; 170 171        // ここから下のコードがSQL文の記載箇所です。 172 173 SqlConnection connection = new SqlConnection(Properties.Settings.Default.sqlServer); 174 connection.Open(); 175 MessageBox.Show("接続に成功しました"); 176 177 178 StringBuilder sql = new StringBuilder(); 179 sql.AppendLine("SELECT USER_ID"); 180 sql.AppendLine("FROM USER_REGISTRATION"); 181 sql.AppendLine("WHERE USER_ID = 1"); 182 183 SqlCommand command = new SqlCommand(sql.ToString(), connection); 184 SqlDataReader dr = command.ExecuteReader(); 185 186 187 188 //while (dr.Read()) 189 //{ 190 // for (int i = 0; i < dr.FieldCount; i++) 191 // { 192 // MessageBox.Show(dr[i].ToString()); 193 // } 194 //} 195 196 //builder.DataSource = "localhost\\SQLEXPRESS"; 197 //builder.UserID = "test"; 198 //builder.Password = "test"; 199 //builder.InitialCatalog = "master"; 200 //builder.IntegratedSecurity = true; 201 202 //using (SqlConnection connection = new SqlConnection(builder.ConnectionString)) 203 //{ 204 // connection.Open(); 205 // MessageBox.Show("接続に成功しました"); 206 207 // SqlCommand command = new SqlCommand(); 208 209 210 //} 211 212 213 214 } 215 catch (SqlException ex) 216 { 217 MessageBox.Show(ex.Message); 218 } 219 220 catch (Exception ex) 221 { 222 MessageBox.Show(ex.Message); 223 } 224 } 225 } 226}

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

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

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

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

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

Zuishin

2022/02/14 01:33 編集

> 下記③番の条件にて入力された、ユーザーIDとサーバーに登録されたIDを比較するコード書けず止まっています。 C# ではなく SQL で解決すべき問題です。
退会済みユーザー

退会済みユーザー

2022/02/15 01:11

質問者さん、無言ですが、回答したのでそれに対するフィードバックを返してください。役に立った / 立たなかったぐらいはすぐ返せるのでは? 役に立たなかったならどこがダメだっらかを書くとより期待に近い回答が出てくるかも。とにかく無言は NG です。
kawanoonigiri

2022/02/15 03:02

SurFerOnWww様 回答ありがとうございます。 こちらの説明に不足していた部分があり、いただいた回答は使用しませんでしたが、他の機会にいかそうと思います。 また、上記コード解決済みです。 後ほど解決コードを記載の上、本質問を閉じさせていただきます。 ご回答並びにご指摘ありがとうございました。
退会済みユーザー

退会済みユーザー

2022/02/16 03:40

> 後ほど解決コードを記載の上、本質問を閉じさせていただきます。 忙しいのかもしれませんが早めにそれをお願いします。自分が関わったスレッドがオープン状態のままなのは自分的にかなり気になりますので。
guest

回答3

0

ご指摘いただいた点など踏まえ、コードの修正をしました。
以下コードです。
途中エラーチェックなどの記載は省略してあります。

C#

1SqlConnection con = null; 2 3try 4{ 5 // サーバーに接続 6 con = new SqlConnection(Properties.Settings.Default.sqlServer); 7 con.Open(); 8 9 //SQLを作成 10 StringBuilder sbSql = new StringBuilder(); 11 sbSql.AppendLine(" SELECT "); 12 sbSql.AppendLine(" COUNT(USER_ID) "); 13 sbSql.AppendLine(" FROM "); 14 sbSql.AppendLine(" USER_REGISTRATION "); 15 sbSql.AppendLine(" WHERE "); 16 sbSql.AppendLine(" USER_ID = @USER_ID "); 17 SqlCommand command = new SqlCommand(sbSql.ToString(), con); 18 19 command.Parameters.Add(new SqlParameter("@USER_ID", strUserId)); 20 21 //SQLの実行(ユーザー件数の取得) 22 int nCount = (int)command.ExecuteScalar(); 23 24 //データの存在確認 25 bool bRet = false; 26 if (nCount == 0) 27 { 28 bRet = true; 29 } 30 31 command.Dispose(); 32 33 return bRet; 34} 35catch (Exception ex) 36{ 37 throw(ex); 38} 39finally 40{ 41 con.Close(); 42}

投稿2022/02/22 07:56

kawanoonigiri

総合スコア14

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

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

退会済みユーザー

退会済みユーザー

2022/02/22 09:00

無駄に回答欄を増やさないでください。訳が分からなくなります。 それではダメですよ。 int nCount = (int)command.ExecuteScalar(); でその時は nCount はゼロだったとしても、その後で誰か他の人が INSERT できるわけなので、ダブる可能性があるってことが分かりませんか?
guest

0

自己解決

自己解決しました。
以下コードです。
途中エラーチェックなどの記載は省略してあります。

C#

1 2 try 3 { 4 if (header.Enabled == true) 5 { 6 ///SQLserverに接続 7 SqlConnection connection = new SqlConnection(Properties.Settings.Default.sqlServer); 8 connection.Open(); 9 10 ///SQL文を記載 11 StringBuilder sbSql = new StringBuilder(); 12 sbSql.AppendLine(" SELECT "); 13 sbSql.AppendLine(" COUNT(USER_ID) "); 14 sbSql.AppendLine(" FROM "); 15 sbSql.AppendLine(" USER_REGISTRATION "); 16 sbSql.AppendLine(" WHERE "); 17 sbSql.AppendLine(" USER_ID = @USER_ID "); 18 SqlCommand command = new SqlCommand(sbSql.ToString(), connection) 19 20        ///TextBoxから取得した値(userId.Text)をパラメーターに追加 21 command.Parameters.Add(new SqlParameter("@USER_ID", userId.Text)); 22        23        ///command.ExecuteScalar()を使い戻り値の確認をしつつSQL文を実行 24 int nCount = (int)command.ExecuteScalar(); 25 26        ///SQLserverとの接続を終了 27 connection.Close(); 28 return; 29 } 30 } 31 32

投稿2022/02/18 02:15

kawanoonigiri

総合スコア14

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

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

退会済みユーザー

退会済みユーザー

2022/02/18 02:30

私の回答にも書きましたが、それでは質問にあった、 > ③サーバーにそのIDが登録されていなければ > ④ユーザー名、パスワードを入力し登録する。 で、③ と ④ の間に誰か他の人が新たな「ユーザーID」を登録して、それとダブってしまう(その場合 SELECT クエリで確認した意味がない)という可能性があります。SQL Server を使うということは、そういう可能性がある環境だと思ったのですが、違うのですか? あと、本題とは関係ない話ですが、connection.Close(); の仕方が不適切です。finally 句の中に入れるか、接続に using 句を使うなど、必ず Close されるようにしましょう。
kawanoonigiri

2022/02/22 07:50

ご指摘ありがとうございます。 仰る通り、ダブりの可能性があります。 データのINSERTをする際、他の人が先に同一IDで登録した場合はエラーになるよう別メソッドに記載してあります。 言葉足らずで申し訳ございません。 また、Close();の件回答に反映いたしました。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2022/02/22 08:58

> 仰る通り、ダブりの可能性があります。 > データのINSERTをする際、他の人が先に同一IDで登録した場合はエラーになるよう別メソッドに記載してあります。 新たに作った回答欄のコードのことを言っているのでしょうが、それではダメですよ。 int nCount = (int)command.ExecuteScalar(); でその時は nCount はゼロだったとしても、その後で誰か他の人が INSERT できるわけなので、ダブる可能性があるってことが分かりませんか?
guest

0

①ユーザーID(6桁の整数)を入力し、
②「入力完了(btnFinish_Click)」をクリックすると、
③サーバーにそのIDが登録されていなければ
④ユーザー名、パスワードを入力し登録する。

SELECT クエリを投げて ③ を確認しているようですがそんなことはしないで、「ユーザーID」を主キーにするかまたはユニーク制約を付ければ、SELECT で確認などする必要はなく、即 INSERT 操作をすれば未登録なら登録されるし、登録済みなら Primary / Unique キー制約違反例外が出るので、それを catch してユーザーに知らせて訂正と再入力を促すようにしていかがですか?

そうすれば、③ と ④ の間に誰か他の人が登録した「ユーザーID」とダブってしまうというような問題も避けられます。

PK 制約違反を catch するサンプルコードを載せておきます。ユニーク制約違反の場合は sqle.Number == 2601 になります。

public bool InsertAuthors() { var connection = new SqlConnection("接続文字列"); var command = new SqlCommand("INSERT INTO authors VALUES ('172-32-1176', 'White', ...)", connection); try { connection.Open(); try { command.ExecuteNonQuery(); } catch(SqlException sqle) { if (sqle.Number == 2627) { return false; } else { throw; } } } finally { connection.Close(); } return true; }

投稿2022/02/14 02:10

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問