🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

SQL Server

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

Windows Forms

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

ADO.NET

ADO.NETは.NET Frameworkで各種データベースへの統一された接続機能を提供するソフトウェアコンポーネントの集合です。

Q&A

解決済

2回答

2489閲覧

ADO.NETでINSERT時の重複回避について

kswdfr

総合スコア21

C#

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

SQL Server

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

Windows Forms

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

ADO.NET

ADO.NETは.NET Frameworkで各種データベースへの統一された接続機能を提供するソフトウェアコンポーネントの集合です。

0グッド

0クリップ

投稿2019/12/06 00:36

編集2019/12/06 01:41

質問

Visual StudioでWindowsFormをADO.NETを使ったデータベース(SqlServer)プログラミングでボタンを押すと名前をINSERTするサンプルプログラムを作りました。しかしデータベースに重複した名前があってもINSERTできてしまいます。
なのでボタンを押したとき重複した名前がデータベースにあったらメッセージボックスを表示してINSERTさせないようにしたあともう一回INSERTできるようにしたいです。しかし書き方がわからないので質問しました。

SELECT

1using 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.SqlClient; 11 12namespace WindowsFormsApp2 13{ 14 public partial class Form1 : Form 15 { 16 private SqlConnection cn = new SqlConnection(); 17 private SqlCommand cmd = new SqlCommand(); 18 private SqlDataReader rd; 19 private string cnstr = 20 @"・・・"; 21 22 public Form1() 23 { 24 InitializeComponent(); 25 } 26 27 private void button1_Click(object sender, EventArgs e) 28 { 29 cn.ConnectionString = cnstr; 30 cn.Open(); 31 cmd.Connection = cn; 32 cmd.CommandType = CommandType.Text; 33 cmd.CommandText = "INSERT INTO [dbo].[Table] (Name) VALUES(" + 34 "N'" + textBox1.Text + "')"; 35 MessageBox.Show("名前を追加しました"); 36 rd = cmd.ExecuteReader(); 37 rd.Close(); 38 cn.Close(); 39 }

Table

1CREATE TABLE [dbo].[Table] ( 2 [Id] INT IDENTITY (1, 1) NOT NULL, 3 [Name] NVARCHAR (50) NULL, 4 PRIMARY KEY CLUSTERED ([Id] ASC) 5);

制作物

WindowsForm

検索

初心者で検索キーワードがわからなかったので検索していません

開発環境

Visual Sutaudio2017,C#,.NET Framework4.7,SQL Server Express2017,Windows10

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

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

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

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

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

guest

回答2

0

まず、テーブルにPRIMARY KEY を追加

以下、コードはイメージで、
INSERTする前に

SQL

1SELECT NAME FROM [dbo].[Table] 2WHERE Name = textBox1.Text

で NAME が存在したら「既に同じNAMEが登録されているからエラーだよ」ってメッセージを返し、
NAME が存在しなかった INSERT

投稿2019/12/06 01:05

Orlofsky

総合スコア16417

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

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

kswdfr

2019/12/06 01:50

PRIMARY KEYは1つのテ-ブルに2つや3つあっても問題はないんですか?
Orlofsky

2019/12/06 02:08

SQL入門で習うことですが、ひとつのテーブルにPRIMARY KEYは1つしか設定できません。既に PRIMARY KEY がある場合は UNIQUE KEY を追加します。 SQL入門レベルのスキルがあるなら、最初から質問にCREATE TABLEやCREATE INDEX を提示できた方が良いです。
kswdfr

2019/12/06 02:21

UNIQUE KEYを追加してしまうとあいまい検索をするときに制限がかかってしまう(%A%ができない)のでUNIQUE KEY以外をつけたいですが何良いかわからないので教えてください。
Orlofsky

2019/12/06 02:26

質問にUNIQUE KEYを追加してあいまい検索ができなくなる現象を再現できるだけの情報を追記してください。
Orlofsky

2019/12/06 03:18

あいまい検索 %A% はインデックスは使われないでテーブルのデータを全件走査するのでNAME列にインデックスを追加しても無意味ですし、データ量が多いと極端に遅くなります。 テーブル設計から考え直しては? SQL入門レベルの勉強をしないと使い物にならないコード作ったり、どんどん作業が遅れます。
Orlofsky

2019/12/06 03:20

ちなみに、質問に複合インデックスなんて書いてないです。
kswdfr

2019/12/06 03:33 編集

インデックスとは何かわからないのでインデックスは使っていません。 なのでテーブルは変える予定はありません。 インデックスを使っていない場合%a%は使えますか?
Orlofsky

2019/12/06 03:33

だから、 >SQL Server SQL入門 の勉強をしない。 わたしのコメントはこれで終わります。
kswdfr

2019/12/06 04:42 編集

僕が提示したサイトにはユニークキーについては書いていません。誠に申し訳ございません。b
kswdfr

2019/12/06 04:42

テーブルのNameにユニークキー制約をつける方法と、例外をハンドリングしてやりたい(メッセージ出すとか)処理を出す方法がわからないので教えてください。
guest

0

ベストアンサー

Nameに対してユニークキーなりプライマリキーなりの制約つけて、例外をハンドリングしてやりたい(メッセージ出すとか)処理すればよいのではないでしょうか。

投稿2019/12/06 01:03

workaholist

総合スコア559

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

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

kswdfr

2019/12/06 02:00

ユニークキーをつけた場合検索するとき "SELECT * FROM [dbo].[table]"+ "WHERE Name Like N'%" + textBox2.Text +"%'"; というあいまい検索ができないと検索したら出てきました。 あいまい検索をしたい場合ユニークキーとプライマリーキー以外で重複したのを登録させない制約があれば教えてください。
workaholist

2019/12/06 02:34

その検索して出てきたページを教えていただけますか?
workaholist

2019/12/06 02:59

SQL Server じゃなくて MySQL の記事ですが。 ちなみにどの部分の記載が「ユニークキーはあいまい検索できない」という部分でしょうか。
kswdfr

2019/12/06 03:31 編集

スライドの10ページ目に書いてありSqlServerでも同じかなと思いました。
kswdfr

2019/12/06 03:58 編集

テーブルのNameにユニークキー制約をつける方法と、例外をハンドリングしてやりたい(メッセージ出すとか)処理を出す方法がわからないので教えてください。
workaholist

2019/12/06 04:24

10ページ目には複合インデックスとインデックスマージについて記載がありますが、ユニークキーについて記載がありません。 再度確認をお願いします。
workaholist

2019/12/06 04:25

例外ハンドリングは、ユニークキーが使える前提に立って話しているのでユニークキーが使えないのではという現状で話す意味はないと思います。
kswdfr

2019/12/06 04:38

僕が載せたサイトにはユニークキーについては書いてあなかったです。よく読んでなく早とちりしてしまい申し訳ございません。
kswdfr

2019/12/06 04:40

ユニークキーの使い方を教えてください。その後に例外をハンドリングしてやりたい(メッセージ出すとか)処理を出す方法を教えてください。
workaholist

2019/12/06 04:57

キー制約つけて重複発生したら例外発生するので、tryーcatchで例外ハンドリングしてハンドリングした先のロジックは、あなたがやりたい処理を書いたら良いのではないでしょうか。
kswdfr

2019/12/06 05:10 編集

Nameにユニークインデックスキーをつけたいんですがどのようにつけたらいいか教えてください。
workaholist

2019/12/06 05:13

Googleで「SQL Server ユニークキー 付け方」とかで適当に検索してみて下さい。
kswdfr

2019/12/06 05:39

UNIQUE ( Name )を追加したのと private void button1_Click(object sender, EventArgs e) { try { cn.ConnectionString = cnstr; cn.Open(); cmd.Connection = cn; cmd.CommandType = CommandType.Text; cmd.CommandText = "INSERT INTO [dbo].[Table] (Name) VALUES(" + "N'" + textBox1.Text + "')"; rd = cmd.ExecuteReader(); } catch { MessageBox.Show("名前を追加できませんでした。"); } rd.Close(); cn.Close(); } で出来ました。 しかしMessageBox.Show("名前を追加しました"); をtryの中やcatch{}に付け実行しAさんをINSERTしたとき MessageBox.Show("名前を追加できませんでした。");と MessageBox.Show("名前を追加しました"); が表示されてしまいます。 なのでAさんをinsertしたときは MessageBox.Show("名前を追加できませんでした。"); Sさんをinsertしたときは MessageBox.Show("名前を追加しました"); だけを表示させるにはどうしたらよいか教えてください。
kswdfr

2019/12/06 06:16

UNIQUE ( Name )を追加したのと private void button1_Click(object sender, EventArgs e) { try { cn.ConnectionString = cnstr; cn.Open(); cmd.Connection = cn; cmd.CommandType = CommandType.Text; cmd.CommandText = "INSERT INTO [dbo].[Table] (Name) VALUES(" + "N'" + textBox1.Text + "')"; rd = cmd.ExecuteReader(); MessageBox.Show("名前を追加しました"); rd.Close(); cn.Close(); } catch { MessageBox.Show("名前を追加できませんでした。"); textBox1.Text = " "; } } で出来ました。 丁寧に教えてくださりありがとうございます。 そして間違った情報を提示してしまい申し訳ございませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問