VB.NETでComboBoxを使って社員番号を取得する方法|SQLとの連携とエラー解決

Visual Basic

VB.NETでComboBoxを使用して社員名を選択し、対応する社員番号を表示するアプリケーションを作成する際に、よくあるエラーに関する解決方法を解説します。特に、SQLの実行時に発生する「列名 ‘Combo2で選択した社員名’ が無効です」といったエラーについて、原因と修正方法を詳しく説明します。

エラーの原因と問題点

質問者のコードでは、ComboBoxで選択された社員名をSQLクエリに組み込んでいますが、SQLクエリ内で変数をそのまま文字列として使用していることが問題です。VB.NETでは、SQLクエリに変数を組み込む際、適切な構文で文字列を連結する必要があります。

具体的には、SQLクエリ内で変数を文字列として扱う場合、値が文字列の場合はシングルクォート(’)で囲む必要があります。また、SQLインジェクションを避けるため、パラメータ化クエリを使用するのが望ましいです。

修正方法

まず、SQLクエリの構文を修正し、パラメータ化クエリを使用して安全かつ正確にデータを取得する方法に変更します。

修正後のコードは以下の通りです。

Private Sub Combo2_Changed(ByVal sender As Object, ByVal e As EventArgs)
    Dim Cn As New OleDb.OleDbConnection
    Dim Cmd As New OleDb.OleDbCommand
    Dim Da As New OleDb.OleDbDataAdapter
    Dim Ds As New DataSet
    Dim y As String

    y = Combo2.Text

    Cn.ConnectionString = "Provider=SQLOLEDB;" &
                         "Data Source=DESKTOP-3ACKOMV\RIKUTO;" &
                         "Initial Catalog=DataBase;User ID=sa;Password=rikuto;"
    Cmd.Connection = Cn
    Cmd.CommandText = "SELECT * FROM 社員マスタ WHERE 社員名 = ?"
    Cmd.Parameters.AddWithValue("@社員名", y)

    Da.SelectCommand = Cmd
    Da.Fill(Ds)

    Cn.Open()

    For Each dr As DataRow In Ds.Tables(0).Rows
        Text4.Text = dr.Item("社員番号")
    Next
End Sub

パラメータ化クエリのメリット

パラメータ化クエリを使用することのメリットは以下の通りです。

  • SQLインジェクションの防止:ユーザーから入力された値を直接SQLクエリに組み込むことなく、パラメータを使って安全にデータを処理できます。
  • コードの可読性向上:SQLクエリがより明確になり、クエリ内の変数の扱いが直感的に理解しやすくなります。
  • データ型の整合性維持:パラメータのデータ型を指定することで、適切な型でデータが処理され、型の不一致によるエラーを防げます。

まとめ

VB.NETでComboBoxを使って社員番号を取得する際、SQLクエリ内で変数を直接文字列として組み込むことはエラーを引き起こす原因となります。適切な方法として、パラメータ化クエリを使用することで、安全かつ効率的にデータを取得できます。このアプローチを採用することで、SQLインジェクションなどのセキュリティリスクも防止でき、より安定したアプリケーションを開発できます。

コメント

タイトルとURLをコピーしました