プロが教えるわが家の防犯対策術!

VB.netの重複データ数カウントについて
下記コードを行ったときに
重複データ数のカウントを行いたいです。
テーブルアダプタを使っているためVB側でのカウントの仕方がわからないです。
メッセージで「●件中▲件登録しました」と表示したいです。

【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

INSERT INTO [dbo].[Table] ([date], [IDcode])
SELECT @date, @IDcode
WHERE NOT EXISTS(SELECT * FROM [dbo].[Table] WHERE [IDcode] = @IDcode);

お知恵をお貸しください。
どうぞよろしくお願いいたします。

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

  • つらい・・・

    >ウィザードでInsertQuery()を作成したんですよね?
    データセットのクエリにてInsertQuery()を作成しました。

    >InsertQuery()で生成されるコードの最終的な実行は以下になります。
    >returnValue = command.ExecuteNonQuery();
    ExecuteNonQuery()がImports System.Data.SqlClientでは使用できないみたいなのですが原因はありますでしょうか?


    >よって、For Each()およびInsertQuery()で処理させるならば、
    >『n件中m件』のnは、ループ回数、mはInsertQuery()の実行結果を加算したもの
    >となります。
    mはInsertQuery()の実行結果を加算したものとありますが、補足方法が知識不足なためできません。
    詳しく教えていただけましたら幸いです。

    No.1の回答に寄せられた補足コメントです。 補足日時:2018/08/17 10:55
  • へこむわー

    >今回の場合、NOT EXISTS()しているので、INSERTが実施されなければ0が返り、INSERTされれば>1が返りますよね。
    INSERTされても1が返ってきません。なにか原因があるのでしょうか?

    No.2の回答に寄せられた補足コメントです。 補足日時:2018/08/20 19:01

A 回答 (2件)

> データセットのクエリにてInsertQuery()を作成しました。


データセットのデザイナを開いて、『テーブル名TableAdapter』を右クリックして『コードの表示』を実施してみてください。
そうすると、ソリューションエクスプローラー上で、データセット内に、『データセット名.vb』が出現します。
そのvbファイル内を掘り下げていくと、『InsertQuery』が存在します。

ツリーで説明すると以下のようになります。
ソリューション
 └プロジェクト
   └HogeDataSet.xsd
     └HogeDataSet.vb
       └FugaTableAdapter
         └InsertQuery()

このInsertQuery()が、実際に呼び出した時に処理されるコードです。
そのコードの中で、
returnValue = command.ExecuteNonQuery();
を実施しています。

SqliClient.SqlCommand::ExecuteNonQuery()の説明は以下にあります。
https://msdn.microsoft.com/ja-jp/library/system. …

> ExecuteNonQuery()がImports System.Data.SqlClientでは使用できないみたいなのですが原因はあ
> りますでしょうか?
データセットでInsertQuery()を用意しているわけですから、現在の課題において、自前でExecuteNonQuery()を発行することは必要ではありません。

> mはInsertQuery()の実行結果を加算したものとありますが、補足方法が知識不足なためできません。
InsertQuery()の戻り値はIntegerです。
上述したExecuteNonQuery()の説明にもありますが、ExecuteNonQuery()は、実行した結果、影響を受けたレコード数を返却します。
つまり、ExeCuteNonQuery()は、以下のような結果を返します。
・INSERT INTO (...) VALUES (...)
  必ず1
・INSERT INTO SELECT FROM ...
  INSERTされた件数(=SELECTされた件数)
・UPDATE SET WHERE ...
  UPDATEされた件数
・DELETE FROM WHERE ...
  DELETEされた件数

当然、クエリが正しく発行されなかった時は戻り値云々ではなく例外処理になります。

そして、先述していますが、InsertQuery()は、内部でExecuteNonQuery()が実施されています。
ですから、InsertQuery()の戻り値は、上記で説明した通りの値が返却されます。

よって、何件INSERTされたかは、InsertQuery()の戻り値を合算すれば求められます。
For Eachして、1件ずつINSERTしているわけですから。
今回の場合、NOT EXISTS()しているので、INSERTが実施されなければ0が返り、INSERTされれば1が返りますよね。
それを全部足せば、INSERTした件数になります。


お話を聞いている限りだと、InsertQuery()云々より、データセットとかそういうのを使わないで、まずラッピングされていない具体的なデータベース操作を理解された方が、つまづくことはないのかなと思います。
この回答への補足あり
    • good
    • 0
この回答へのお礼

今現在できていないです。
詳しく説明していただいたのにありがとうございます。
時間をかけてみます!

お礼日時:2018/08/19 10:53

ウィザードでInsertQuery()を作成したんですよね?



InsertQuery()で生成されるコードの最終的な実行は以下になります。
returnValue = command.ExecuteNonQuery();

これは、InsertQuery()の実行結果が、DBに影響を与えたレコード数であることを表します。

よって、For Each()およびInsertQuery()で処理させるならば、
『n件中m件』のnは、ループ回数、mはInsertQuery()の実行結果を加算したもの
となります。
この回答への補足あり
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています