Imports System.Data.SqlClient Public Class Form1 Inherits System.Windows.Forms.Form ' -------------------------------------------------------- ' 商品IDが重複していた場合に追加できないようフラグを設ける ' -------------------------------------------------------- Dim IsOverlap As Boolean ' 商品IDが重複していればTrue       : (システムが自動生成したコードは省略)       : ' ---------------------------------------------------------- ' 商品IDの重複検査 ' ---------------------------------------------------------- Private Sub btnIdCheck_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIdCheck.Click Dim strSql As String ' 検索用の接続文字列を設定 strSql = _ "SELECT 商品ID, 品名 FROM 商品_dmy " & _ "WHERE 商品ID = " ' テキストボックスの未入力チェック If Me.txtItemId.Text = "" Then MessageBox.Show("商品IDを入力してください。", _ "入力エラー", MessageBoxButtons.OK) Else ' パラメータを付け足して検索を実行 strSql = strSql & txtItemId.Text Search(strSql) End If End Sub ' ------------------------------------------------ ' 商品IDの重複検査(引数はSQL文字列) ' ------------------------------------------------ Private Sub Search(ByVal strSql As String) Dim objConnect As New SqlConnection Dim objCommand As New SqlCommand Dim objDataReader As SqlDataReader Dim strMessage As String Try ' 接続文字列の設定 objConnect.ConnectionString = _ "Persist Security Info=False;Integrated Security=SSPI;database=db1001ya;server=localhost" ' コネクションの設定 objCommand.Connection = objConnect ' 接続を開く objConnect.Open() ' SQLの設定 objCommand.CommandText = strSql ' 検索処理(結果をデータリーダに受け取る) ' 取得するレコードは常に1件なので、パラメータにCommandBehavior.SingleRowを指定 objDataReader = objCommand.ExecuteReader(CommandBehavior.SingleRow) If objDataReader.Read() Then ' 商品IDが重複しているとき txtItemName.Text = objDataReader("品名") strMessage = "商品ID:" & txtItemId.Text & vbCrLf & _ "品名 : " & objDataReader("品名") & vbCrLf & _ "この商品IDは既に存在しています。" ' エラーメッセージを表示 MsgBox(strMessage, MsgBoxStyle.OKOnly, "IDの重複") ' フラグをセット(実際には次のInitFormでTrueにセットされるので、この処理は不要) IsOverlap = True InitForm() Exit Sub Else ' 追加処理を続行 MsgBox("この商品IDは未登録です。", MsgBoxStyle.OKOnly, "追加可能") IsOverlap = False ' フラグがFalseの場合だけ追加可能となる End If Catch objExcept As Exception ' 例外処理 MessageBox.Show(objExcept.ToString, "DBエラー", MessageBoxButtons.OK) Finally ' データリーダを閉じる If Not objDataReader Is Nothing Then objDataReader.Close() End If ' 接続を閉じる If Not objConnect Is Nothing Then objConnect.Close() End If End Try End Sub ' ------------------------------------------------ ' 商品の追加処理 ' ------------------------------------------------ Private Sub btnInsert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnInsert.Click Dim objConnect As New SqlConnection Dim objCommand As New SqlCommand Dim strMessage As String Dim strSql As String ' 追加用の接続文字列を設定(「品名」のみ''で囲むので注意!) strSql = _ "INSERT INTO 商品_dmy " & _ "(商品ID, 品名, 販売単価, 仕入単価, 仕入先ID) " & _ "VALUES(" & _ txtItemId.Text & ", " & _ "'" & txtItemName.Text & "', " & _ txtBuyPrice.Text & ", " & _ txtSalePrice.Text & ", " & _ txtSupplierId.Text & ")" ' ユーザー宛の確認メッセージ strMessage = "商品ID:" & txtItemId.Text & vbCrLf & _ "品名:" & txtItemName.Text & vbCrLf & _ "を追加します。よろしいですか?" ' 重複検査がまだの場合は処理を行わない If (IsOverlap = True) Or (txtItemId.Text = "") Then MsgBox("先に商品IDの重複検査を行ってください。", MsgBoxStyle.OKOnly, "追加エラー") Exit Sub End If ' ユーザーに更新の確認を求める If MsgBox(strMessage, MsgBoxStyle.YesNo, "追加の確認") = MsgBoxResult.No Then Exit Sub End If Try ' 接続文字列の設定 objConnect.ConnectionString = _ "Persist Security Info=False;Integrated Security=SSPI;database=db1001ya;server=localhost" ' コネクションの設定 objCommand.Connection = objConnect ' 接続を開く objConnect.Open() ' SQLの設定 objCommand.CommandText = strSql If objCommand.ExecuteNonQuery >= 1 Then ' 追加実行 MsgBox("商品を追加しました。", MsgBoxStyle.OKOnly, "追加完了") InitForm() ' 再実行に備えてテキストボックスとグローバル変数を初期化 Else ' 追加失敗 MsgBox("商品を追加できませんでした", MsgBoxStyle.OKOnly, "追加エラー") Exit Sub End If Catch objExcept As Exception ' 例外処理 MsgBox(objExcept.ToString, MsgBoxStyle.OKOnly, "DBエラー") Finally ' 接続を閉じる If Not objConnect Is Nothing Then objConnect.Close() End If End Try End Sub ' ------------------------------------------------ ' 仕入先の確認と表示(仕入先IDの入力後に実行) ' ------------------------------------------------ Private Sub txtSupplierId_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtSupplierId.LostFocus Dim objConnect As New SqlConnection Dim objCommand As New SqlCommand Dim objDataReader As SqlDataReader Dim strMessage As String Dim strSql As String ' 検索用の接続文字列を設定 strSql = _ "SELECT 仕入先ID, 仕入先名 FROM 仕入先_mr " & _ "WHERE 仕入先ID = " & txtSupplierId.Text Try ' 接続文字列の設定 objConnect.ConnectionString = _ "Persist Security Info=False;Integrated Security=SSPI;database=db1001ya;server=localhost" ' コネクションの設定 objCommand.Connection = objConnect ' 接続を開く objConnect.Open() ' SQLの設定 objCommand.CommandText = strSql ' 検索処理(結果をデータリーダに受け取る) ' 取得するレコードは常に1件なので、パラメータにCommandBehavior.SingleRowを指定 objDataReader = objCommand.ExecuteReader(CommandBehavior.SingleRow) If objDataReader.Read() Then ' 仕入先が存在すればラベルに表示 lblSupplier.Text = objDataReader("仕入先名") Else ' 仕入先が存在しないとき lblSupplier.Text = "???" ' フォーカスを「仕入先ID」に戻す txtSupplierId.Focus() txtSupplierId.Select(0, Len(txtSupplierId.Text)) End If Catch objExcept As Exception ' 例外処理 MessageBox.Show(objExcept.ToString, "DBエラー", MessageBoxButtons.OK) Finally ' データリーダを閉じる If Not objDataReader Is Nothing Then objDataReader.Close() End If ' 接続を閉じる If Not objConnect Is Nothing Then objConnect.Close() End If End Try End Sub ' ------------------------------------------------ ' フォームとグローバル変数の初期化 ' ------------------------------------------------ Private Sub InitForm() IsOverlap = True ' フラグはTrueで初期化 txtItemId.Text = "" txtItemName.Text = "" txtSupplierId.Text = "" lblSupplier.Text = "?" txtBuyPrice.Text = "0" txtSalePrice.Text = "0" End Sub ' ------------------------------------------------ ' フォームの初期化 ' ------------------------------------------------ Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load InitForm() End Sub ' ------------------------------------------------ ' 処理を終了 ' ------------------------------------------------ Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click Me.Close() End Sub End Class -----------------------------------------------------------------------