C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: IF文重複した値を回避


(過去ログ 47 を表示中)

[トピック内 14 記事 (1 - 14 表示)]  << 0 >>

■25747 / inTopicNo.1)  IF文重複した値を回避
  
□投稿者/ 初心者 (147回)-(2008/09/25(Thu) 14:21:13)

分類:[VB.NET/VB2005 以降] 

お世話になっております
現在アクセス+VB2005勉強中
デザイン、テキストボックス1、ボタン1、グリッド1。(新規登録システム作成)数字のみ入力可能
ボタン1クリック→"登録"、重複された場合"エラー"
やりたいこととしましては、重複した値を回避するIF文を作成したいのですが。
この説明でわかる方教えていただけないでしょうか?
よろしくお願いいたします。

引用返信 編集キー/
■25750 / inTopicNo.2)  Re[1]: IF文重複した値を回避
□投稿者/ 片桐 (113回)-(2008/09/25(Thu) 14:32:46)
初心者さん自身は、なんとなくでもよいのですが、どうやったらできそうだとおもってますか?
プログラムコードでなくて、日本語で。

引用返信 編集キー/
■25751 / inTopicNo.3)  Re[1]: IF文重複した値を回避
□投稿者/ επιστημη (1338回)-(2008/09/25(Thu) 14:34:14)
επιστημη さんの Web サイト
> やりたいこととしましては、重複した値を回避するIF文を作成したいのですが。
> この説明でわかる方教えていただけないでしょうか?

"ユーザ入力データ"と同じものが"これまでに登録されたデータ集合"の中に
あるか否かを判断するんですよね? なにがわからんですか?

Dim duplicated As Boolean = False
For I = 0 To 登録データ総数-1
If 登録データ(I) と 入力データ が一致した Then
duplicated = True
Exit For
End If
Next

引用返信 編集キー/
■25752 / inTopicNo.4)  Re[2]: IF文重複した値を回避
□投稿者/ 初心者 (148回)-(2008/09/25(Thu) 14:35:01)
No25750 (片桐 さん) に返信
> 初心者さん自身は、なんとなくでもよいのですが、どうやったらできそうだとおもってますか?
> プログラムコードでなくて、日本語で。
>
お返事ありがとうございます
日本語ではなんとなくわかります。
グリッドとテキストボックスを比較すればできるかとおもうんですが。
ちがっていたら申し訳ないです。
引用返信 編集キー/
■25757 / inTopicNo.5)  Re[3]: IF文重複した値を回避
□投稿者/ 初心者 (149回)-(2008/09/25(Thu) 15:05:23)
ソース付け足します
すみません、質問とかなりちがっていますがもともとやりたかったことはこれです。
追加、グリッド自体はフォーム2にあります。
SQL文の結果を判定するIF文を作成したいのですが
SQLCm.CommandText = "INSERT INTO HORIBE(BANGOU) VALUES (" & TextBox1.Text & ")"
Cn.Open()
SQLCm.ExecuteNonQuery()
Cn.Close()
TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""
Visible = False
Dim frmForm2 As New Form2
frmForm2.ShowDialog()
End Sub
End Class

引用返信 編集キー/
■25763 / inTopicNo.6)  Re[4]: IF文重複した値を回避
□投稿者/ επιστημη (1339回)-(2008/09/25(Thu) 15:58:59)
επιστημη さんの Web サイト
> SQL文の結果を判定するIF文を作成したいのですが

SQLCm.ExecuteNonQuery() が返す値で判定するんじゃないですか?
# マニュアル(MSDN)を読んでください。

引用返信 編集キー/
■25777 / inTopicNo.7)  Re[5]: IF文重複した値を回避
□投稿者/ 片桐 (114回)-(2008/09/25(Thu) 19:10:11)
んー、まだ前提となる情報がたりないなぁ、と思うですです

テーブル HORIBEの構造です。 BANGOUってどんな型ですか? HORIBEにキーやインデックスはありますか?
どのデータベースシステムに、どうやって作りましたか?

ここも私たちに伝えてください。お願いします。

>グリッドとテキストボックスを比較すればできるかとおもうんです
考え方はあってます。
なら、後は、「値をグリッドから探してくる」ところ、つまり、
もう少し突っ込んで何と何を比較すればよいのか、が判ればOK?



引用返信 編集キー/
■25783 / inTopicNo.8)  Re[4]: IF文重複した値を回避
□投稿者/ Jitta (514回)-(2008/09/25(Thu) 21:35:50)
Jitta さんの Web サイト
No25757 (初心者 さん) に返信
> SQLCm.CommandText = "INSERT INTO HORIBE(BANGOU) VALUES (" & TextBox1.Text & ")"
 SQL Injection の脆弱性ですね。


> Cn.Open()
> SQLCm.ExecuteNonQuery()
> Cn.Close()
 このあたり、例外が発生する可能性があります。
 で、挿入先の HORIBE(BANGOU) ですが、ユニークにしてあるのでしょうか。してあるのなら、例外が発生しますから、そいつを捕まえればいいでしょう。

 例外を発生させたくない、ユニークにしていない場合、ちと面倒です。
まず、テーブルをロックします。
次に、入力された番号が存在しているか、SELECT 文で検査します。
存在していない場合、INSERT 文を発行します。
最後に、ロックを解除します。

 具体的な方法は、ご使用になっているデータベースを調べてください。

引用返信 編集キー/
■25791 / inTopicNo.9)  Re[5]: IF文重複した値を回避
□投稿者/ 初心者 (150回)-(2008/09/26(Fri) 09:27:30)
お返事遅れてしまい申し訳ございません。
データベースはアクセスを元に作成しました。
番号は数値型でインデックは、はい(重複なし)です
主キーになってます。
自分なりにSQL文を使用してオートナンバーを取得して解決したのですが・・・・どーも納得いかなくて・・・。
> SQLCm.CommandText = "INSERT INTO HORIBE(BANGOU) VALUES (" & TextBox1.Text & ")"
>Cn.Open()
> SQLCm.ExecuteNonQuery()
> Cn.Close()
の前にSQL文で判断しなければグリッドに表示されてしまうので
その前にSQL文を作成してIF文でSQL文とテキストボックス1を判断しればできるかなとおもってるんですがどおでしょうか?

すみませんまだ未熟なものでユニークがわかりません、聞いたことはあるのですが・・・・お恥ずかしい・・・。
引用返信 編集キー/
■25795 / inTopicNo.10)  Re[6]: IF文重複した値を回避
□投稿者/ επιστημη (1341回)-(2008/09/26(Fri) 09:48:24)
επιστημη さんの Web サイト
> その前にSQL文を作成してIF文でSQL文とテキストボックス1を判断しればできるかなとおもってるんですがどおでしょうか?

ユーザ入力と同じものがデータベースに入っているか、
お伺いをたてるSQL書いて叩き込めばいぃぢゃん。

引用返信 編集キー/
■25797 / inTopicNo.11)  Re[6]: IF文重複した値を回避
□投稿者/ やじゅ (668回)-(2008/09/26(Fri) 09:55:00)
やじゅ さんの Web サイト
No25791 (初心者 さん) に返信
>
> すみませんまだ未熟なものでユニークがわかりません、聞いたことはあるのですが・・・・お恥ずかしい・・・。
>

別にあえて書かなくても調べればいいよね。ユニークは、他に同一のものが無いことです。
引用返信 編集キー/
■25804 / inTopicNo.12)  Re[7]: IF文重複した値を回避
□投稿者/ ロック (109回)-(2008/09/26(Fri) 10:10:53)
まず、やりたい事を確認したいのですが
INSERTした際に重複した場合、その重複エラーを検出したいというのと
重複するか否かをINSERTの前にif文でチェックしたいという事であっていますか?

INSERTの重複は例外で処理するのが良いと思いますが、単純に
int i = SQLCm.ExecuteNonQuery()
if(i != 1){
※エラー?
}
っで、出来るような気がします。(試してないですけど)

あとグリッドを何に使っているのか分かりません
グリッドに既存データを読み込み、新規データを追加したらグリッドにも
追加するという仕様で、重複していた場合グリッドに重複データが表示されて
しまうという事かな?

であれば、グリッド=DataGridViewでDataTableとバインドと仮定して
DataTableにPrimaryKeyを指定して、先にグリッドにデータを追加して成功したら
重複なしというのが判定できるかと


>番号は数値型でインデックは、はい(重複なし)です
これがIDENTITY制約の事なら、番号を指定しないでINSERTすれば
勝手に重複しない番号が振られるので問題ない気がするので違うのかな?

>その前にSQL文を作成してIF文でSQL文とテキストボックス1を判断しればできるかなとおもってるんですがどおでしょうか?
というのが、Jittaさんが書かれている内容になると思います。

ちょっと状況が把握できないですね。。。

引用返信 編集キー/
■25835 / inTopicNo.13)  Re[8]: IF文重複した値を回避
□投稿者/ nori (17回)-(2008/09/26(Fri) 12:31:29)
SQLCm.CommandText = "INSERT INTO HORIBE(BANGOU) SELECT " & TextBox1.Text & " FROM HORIBE WHERE BANGOU != " & TextBox1.Text
     :
if(SQLCm.ExecuteNonQuery==0){
    重複エラー
}

引用返信 編集キー/
■25837 / inTopicNo.14)  Re[9]: IF文重複した値を回避
□投稿者/ nori (18回)-(2008/09/26(Fri) 12:51:03)
No25835 (nori さん) に返信
> SQLCm.CommandText = "INSERT INTO HORIBE(BANGOU) SELECT " & TextBox1.Text & " FROM HORIBE WHERE BANGOU != " & TextBox1.Text
> :
> if(SQLCm.ExecuteNonQuery==0){
> 重複エラー
> }
駄目でした。

>番号は数値型でインデックは、はい(重複なし)です
>主キーになってます。
主キーなのだから、重複した場合プライマリーキー違反になります

Try

SQLCm.CommandText = "INSERT INTO HORIBE(BANGOU) VALUES (" & TextBox1.Text & ")"
Cn.Open()
SQLCm.ExecuteNonQuery()
Cn.Close()
TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""
Visible = False
Dim frmForm2 As New Form2
frmForm2.ShowDialog()
End Sub
End Class

Catch ex As SqlException
If ex.Number = 2627 Then
' 重複エラー
End If
End Try



引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -