将SQL命令返回的值分配给变量

时间:2014-02-23 14:15:36

标签: sql vb.net visual-studio-2013

我正在尝试将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

这很有效。但是我不确定如何将级别分配给可视基本变量。任何帮助都很受欢迎。

3 个答案:

答案 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。

More info