あなたにとってのゴールデンタイムはいつですか?

VB.netについて質問です。
TableAdapter.InsertQueryについて質問になります。

・データセットに紐づいているDataGridViewからTableAdapter.InsertQueryを利用してDBに登録したい。
・DBに登録されているIDcodeデータとDataGridViewのIDcodeデータを比較し、DataGridViewのIDcode重複データは除いてDBに登録したい。
①現在のコードですと同じものを再度登録すると主キーエラーが出てしまいます。
DBではIDcodeを主キーにしております。
②SQLでWHERE NOT EXISTS文をいれている(重複ははじいているつもり)のですがダメです。
皆様のお知恵をお貸しください。


【DBのカラム】
date, IDcode

【現在のコード】
If TableDataGridView.RowCount = 1 Then
MsgBox("登録するデータがありません")
Else
For Each dr As DataRow In DataSet1.Tables(0).Rows
Me.TableTableAdapter.InsertQuery(dr("date"), dr("IDcode"))
Next
Me.Close()
End If

【InsertQuery(@date, @IDcode)の中身】
INSERT INTO [dbo].[Table] ([date], [IDcode]) VALUES (@date, @IDcode);
SELECT date, IDcode FROM [dbo].[Table]
WHERE NOT EXISTS(SELECT * FROM [dbo].[Table] WHERE [IDcode] = @IDcode)
order by IDcode


どうぞよろしくお願いいたします。

質問者からの補足コメント

  • うーん・・・

    INSERT INTO [dbo].[Table] ([date], [IDcode])
    SELECT @date,@IDcode
    WHERE NOT EXISTS(
    SELECT * FROM [dbo].[Table] WHERE [IDcode] = @IDcode
    )
    とインサート文のまちがいだったみたいです。

    このコードをTableAdapterを用いずにfor文で行うにはどのようなコードにたら良いでしょうか?
    まったく質問が変わってしまいますがどうぞよろしくお願いいたします。

      補足日時:2018/08/14 14:03

A 回答 (2件)

Insertしようとした時に既にデータがあるということは、Insertが誤りなのではなく、それに至る検証に誤りがあるということでは?



どういう場面での問題なのか分かりませんが、Insert限定なら、DataRowオブジェクトのRowStateがAddedの行について、事前に存在検証することで解決しませんか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
インサート文が誤っておりました。
こちらのプログラムをfor文にしたときのコードを教えていただけたら幸いでございます。

お礼日時:2018/08/14 14:07

よくわかんないけど、アダプター使ってるならupdate()じゃダメなんですか?

    • good
    • 0
この回答へのお礼

update()ではできているのですが、DBの主キーエラーを回避して(重複データは除く)登録処理を行いたいです。

Try
Me.TableTableAdapter.Update(Me.DataSet1.Table)
Me.Close()
End If
Catch ex As Exception
'IDcodeが既に登録されている場合
If CType(ex, SqlException).Number = 2627 Then
End If
End Try

お礼日時:2018/08/14 13:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報