我正在尝试将Visual Studio中的SQL命令返回的值赋给变量。 这将允许我有一个分层登录系统。
我目前的代码是:`
Imports System.Data.SqlClient
Imports System.Data.OleDb
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles cmdLogin.Click
Dim Con As SqlConnection
Dim cmd As New OleDbCommand
Dim sqlstring As String
Dim connstring As String
Dim ds As DataSet
Dim da As SqlDataAdapter
Dim inc As Integer = 0
Dim userlevel As Integer
connstring = "Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\Assignment.mdf;Integrated Security=True;Connect Timeout=30"
Con = New SqlConnection(connstring)
Con.Open()
sqlstring = ("SELECT level FROM Users WHERE Id='" & _txtUsername.Text & "' and pass='" & _txtPassword.Text & "'")
da = New SqlDataAdapter(sqlstring, Con)
ds = New DataSet
da.Fill(ds, "Users")
If ds.Tables(0).Rows.Count > 0 Then
MsgBox("Username Correct. Welcome!")
Else
MsgBox("Hackers are not welcome! Shoooo")
End If
End Sub
这很有效。但是我不确定如何将级别分配给可视基本变量。任何帮助都很受欢迎。
答案 0 :(得分:1)
你已经在表格中找到了它:
MessageBox.Show("Level = " & ds.Tables(0).Rows(0)("level"))
不过,即使你不欢迎黑客,黑客也会非常欢迎你的代码。
阅读SQL注入,然后使用参数。
尝试
0'; UPDATE Users SET pass='welcomeHackers'; --
在用户名字段中。
答案 1 :(得分:1)
你可以做到
If ds.Tables(0).Rows.Count > 0
userlevel = CInt(ds.Tables(0).Rows(0)("level"))
但是,由于您的查询返回单个值,我会使用ExecuteScalar
而不是填充数据集。
但请注意,您的查询容易受到Sql Injection攻击。您应该用parameterized approach替换绑定。
答案 2 :(得分:0)
如果您只想从SQL查询返回单个数据,那么您应该考虑使用SqlCommand,然后调用其ExecuteScalar方法来获取值,而不是使用SqlDataAdapter和DataSet。
有关使用ExecuteScalar的详细信息,请参阅MSDN。