投稿者 魔界の仮面弁士  (社会人) 投稿日時 2018/5/24 13:12:51
>> Connection / Command / DataReader に関しては、Using ブロックで囲った方が良いかも知れませ.ん。
> Usingブロックに関して調べて囲ったほうがいいということはわかったのですがどのように囲えばいいでしょうか?
Dim cn As New SqlConnection(cnstr)
  :
cn.Close()
の部分を
Using cn As New SqlConnection(cnstr)
  :
 cn.Close()  'Close は呼んでも呼ばなくても良い 
End Using
のようにします。SqlCommand / SqlDataReader も同様にして
「Using cmd As New SqlCommand(sqlQuery, cn)」などとします。

もしくは Using ブロックの代わりに Try~Finally を使うこともできます。


> ・指摘されたとこを修正後
Password.Text を空欄( "" ) にしておき、Id に「存在しない値」が指定された場合、
今の実装だと、Dim Pass As String の内容は Nothing のままなので、
 If Password.Text = Pass Then
のチェックを通過してしまいます。これだと認証をすり抜けてしまいませんか?

なので前回のコードでは、Read メソッドの呼び出しに対する Else 句を用意していたわけで。



> Dim sqlQuery As String = "SELECT Password, 権限 FROM [dbo].[Table] WHERE ID = @Id.Text"

ID 値は Id という名の TextBox から入力するのでしょうか。
だとしたらこんな感じ。

Dim sqlQuery As String = "SELECT Password, 権限 FROM [dbo].[Table] WHERE ID = @Id"
Using cmd As New SqlCommand(sqlQuery, cn)
    cmd.Parameters.Add("@Id", SqlDbType.VarChar, 8).Value = Id.Text
    Using rd = cmd.ExecuteReader()
  '  : 
    End Using
End Using


上記は、ID 列が VACHAR(8) 型のフィールドだった場合のコードなので、
適宜、実際のデータベース定義にあわせて修正してみてください。