Visual Basic 中学校 掲示板 投稿内容
タグのない投稿を抽出 統計 RSS

Visual Basic 中学校 > 投稿一覧 >

VBでのSQLへの接続とSELECT分に関して 解決済み

タグの編集...

投稿者 青の水   (学生)   投稿日時 2022/5/30 11:31:35
現在フォームにて商品情報登録ページを作成しており、商品番号を入力するテキストボックスであったり、産地を入力するものがあるといった感じです。ここに入力されたものをデータベースに登録するというのがゴールです。
質問といたしましては、もし商品番号が既に登録されていれば、その商品番号の情報の項目に対してUPDATE文を、登録されていなければINSERT文をというような分岐をしたいです。
その条件分岐のやり方がわからなくて困っています。(SELECT文で検索したものが存在しなかった場合何が返ってくるのか等)


現在以下のようなコードを書き、データベースに接続しています。
この先の条件分岐の方法をご教授いただけると嬉しいです。

   Dim Con As New SqlConnection
   Dim St As String
   Dim SQL As SqlCommand
   
   St = 接続文字列

   Con.ConnectionString = St

   SQL = Con.CreateCommand

   Dim adapter As New SqlDataAdapter(SQL)

   SQL.CommandText = $"SELECT EMP_NO FROM 商品マスタ WHERE PRO_NO  = {商品番号のテキストボックス.Text}"


ご回答のほどよろしくお願いいたします。

投稿者 魔界の仮面弁士   (社会人)   投稿日時 2022/5/30 11:59:11
SqlDataAdapter ということは、SQL Server でしょうか。
その場合は、MERGE 文を試してみてください。
https://www.fenet.jp/dotnet/column/language/4233/
https://docs.microsoft.com/ja-jp/sql/t-sql/statements/merge-transact-sql?view=sql-server-ver16


> その商品番号の情報の項目に対してUPDATE文を、登録されていなければINSERT文をというような分岐をしたいです。
SQL を見た限りでは、商品マスタ にあるのは「PRO_NO」と「EMP_NO」のようですが、
実際には産地など、他にも項目があるわけですよね。それらも合わせて渡すようにします。

投稿者 青の水   (学生)   投稿日時 2022/5/30 13:29:22
ご回答ありがとうございます。


空のテーブルを用意していて、そこに商品情報である

商品番号(プライマリーキー)、商品名、産地、価格を登録していくというのがゴールです。

MERGE分を使用するとテーブルが最初から2つ必要のように思えますが、ソーステーブルとターゲットテーブルを同じもの指定すればよいとのことでしょうか?

>SQL を見た限りでは、商品マスタ にあるのは「PRO_NO」と「EMP_NO」のようですが、実際には産地など、他にも項目があるわけですよね。それらも合わせて渡すようにします。

商品マスタにあるのは以上の4つとしてください、本当はもう少しありますが省略いたします。

投稿者 魔界の仮面弁士   (社会人)   投稿日時 2022/5/30 14:13:54
> ソーステーブルとターゲットテーブルを同じもの指定すればよいとのことでしょうか?
いえ、ソース側は画面から取得した値の固定値で構いません。
SELECT 句だけでFROM 句のない 副問い合わせをソースにします。

具体的なサンプルを幾つか紹介しますね。
https://www.ipentec.com/document/sql-transact-sql-merge
https://matutak.hatenablog.com/entry/20100124/1264361540


もしくは、「UPDATE してみて、影響を受けた行数が 0 だった時には、INSERT を試みる」という
やり方もありますが、手順的には MERGE を使った方がスマートでしょう。

投稿者 青の水   (学生)   投稿日時 2022/5/31 09:10:43
>いえ、ソース側は画面から取得した値の固定値で構いません。
SELECT 句だけでFROM 句のない 副問い合わせをソースにします。

そういうやり方もできるのですね、覚えておきたいと思います。

>もしくは、「UPDATE してみて、影響を受けた行数が 0 だった時には、INSERT を試みる」という
やり方もありますが、手順的には MERGE を使った方がスマートでしょう。

こちらの考え方を参考にさせていただきました。


質問させていただきましたが、結局入力された商品番号をSELECT分で取得し、DataTableに格納。
次にIf分で、DataTableのRawをCountするという方法で場合分けをし、INSERTとUPDATEを行いました。

今回はMERGE文というものを知ることができてよかったです、ご回答ありがとうございました。