VB.NET SQL语句

VB.NET SQL语句,sql,vb.net,ms-access,Sql,Vb.net,Ms Access,我对VB编程比较陌生 目前,我有一个登录页面,工作正常。成功登录后,我的用户被引导到另一个表单,该表单连接回MS Access表,并在屏幕上为他们显示数据 我将登录的用户视为第二个表单上的标签(在他们登录后)。基本上,我希望有一个SQL select语句,用于判断access db中的Username列是否等于该标签,然后为该唯一用户提取数据。这是我目前的代码: lblUsername.Text = login.txtUsername.Text DbProvider = "PRO

我对VB编程比较陌生

目前,我有一个登录页面,工作正常。成功登录后,我的用户被引导到另一个表单,该表单连接回MS Access表,并在屏幕上为他们显示数据

我将登录的用户视为第二个表单上的标签(在他们登录后)。基本上,我希望有一个SQL select语句,用于判断access db中的Username列是否等于该标签,然后为该唯一用户提取数据。这是我目前的代码:

    lblUsername.Text = login.txtUsername.Text
    DbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;"
    DbSource = "Data Source = C:\loginprogram\studentclasslist.mdb"

    con.ConnectionString = DbProvider & DbSource

    con.Open()

    strSQL = "SELECT * FROM Table1 WHERE Username = '" + Label1.Text + "'""
    da = New OleDb.OleDbDataAdapter(strSQL, con)
    da.Fill(ds, "studentclasslist")
    con.Close()
它不起作用。当我取出where语句并只执行“Select*FROMTABLE1”时,它工作得很好,但不会给我一个唯一的登录用户,这是我的目标


请帮忙

它不起作用,因为,
误用了双引号

可能是这样的

但这将导致SQL注入攻击。使用
参数化
查询将输入视为SQL查询中的值

lblUsername.Text = login.txtUsername.Text
DbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;"
DbSource = "Data Source = C:\loginprogram\studentclasslist.mdb"

con.ConnectionString = DbProvider & DbSource

con.Open()

strSQL = "SELECT * FROM Table1 WHERE Username = @UserName"
da = New OleDb.OleDbDataAdapter(strSQL, con)
da.SelectCommand.Parameters.Add("@UserName",SqlDbType.nvarchar,50).Value = Label1.Text
da.Fill(ds, "studentclasslist")
con.Close()

当用户成功登录时,您应该在会话中存储登录用户id

//In your login page
Session["myUser"] = txtUsername.Text
然后,您可以在应用程序中的任何位置使用
会话
中的用户id

//In your other page.
Dim Cmd As OleDbCommand = connection.CreateCommand()
Cmd.CommandText = "SELECT * FROM Table1 WHERE Username=?"
Cmd.Parameters.Add("@Username",OleDbType.Text,50).Value = Session["myUser"]
Dim da As New OleDbDataAdapter(Cmd)
Dim dt As New DataTable()
da.Fill(dt)

防止SQL注入成为已广泛建议的参数。此外,您还可以使用
Using
for your connection在使用连接后立即处理该连接,如:

Using con As New OleDbConnection(DbProvider & DbSource)
      con.Open()
      strSQL = "SELECT * FROM Table1 WHERE Username = @UserName"
      da = New OleDb.OleDbDataAdapter(strSQL, con)
      da.SelectCommand.Parameters.Add("@UserName",SqlDbType.nvarchar,50).Value = Label1.Text
      da.Fill(ds, "studentclasslist")
End Using 
其次,您可以将数据放在
DataTable

Dim dt as new DataTable 
dt = ds.Tables(0)
假设您有一条记录匹配,您可以通过检查
记录。计数
,并将其保存到
数据行
,然后检查
文本框
,来检查是否有记录

If (dt.Rows.Count > 0) Then
    Dim dr as DataRow = dt.Rows(0)
    'Field names and Textbox names below are just mine
    txtUserName.Text = dr.Item("Username")
    txtPassword.Text = dr.Item("Password")
    txtUserlevel.Text = dr.Item("UserLevel")
End If
所以,总的来说,它可能是这样的:

lblUsername.Text = login.txtUsername.Text
DbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;"
DbSource = "Data Source = C:\loginprogram\studentclasslist.mdb"


Using con As New OleDbConnection(DbProvider & DbSource)

      Dim dt as new DataTable 

      con.Open()
      strSQL = "SELECT * FROM Table1 WHERE Username = @UserName"
      da = New OleDb.OleDbDataAdapter(strSQL, con)
      da.SelectCommand.Parameters.Add("@UserName",SqlDbType.nvarchar,50).Value = Label1.Text
      da.Fill(ds, "studentclasslist")
      dt = ds.Tables(0)

      If (dt.Rows.Count > 0) Then
         Dim dr as DataRow = dt.Rows(0)
         'Field names and Textbox names below are just mine
         txtUserName.Text = dr.Item("Username")
         txtPassword.Text = dr.Item("Password")
         txtUserlevel.Text = dr.Item("UserLevel")
      End If

End Using 

谢谢大家。这是双引号。现在可以了,但下一步就是让它成为sql注入的证明,我将学习如何使用参数化查询来防止sql注入

请注意,您的代码很容易受到SQL注入攻击。永远不要将输入视为可执行的SQL代码。相反,使用参数化查询将输入作为SQL查询中的值处理。请展开“不工作”。注意:在
strSQL
定义的末尾似乎有一个额外的双引号。
Username
列的数据类型是什么?除非Username必须是唯一的,并且他们不能更改登录,并且你的应用程序强制执行这些规则,否则更好的方法是将UserID存储为变量,并将其用于数据限制。我同意@electrillama。由于额外的双引号,甚至stackoverflow的代码highlighter也将一些VB代码解释为字符串。这可能是当您“取出where语句”时它工作的原因。问题可能是您正在将
lblUsername.Text
设置为登录用户的值,但您在查询中使用的是
Label1.Text
Label1.Text
中有什么?
lblUsername.Text = login.txtUsername.Text
DbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;"
DbSource = "Data Source = C:\loginprogram\studentclasslist.mdb"


Using con As New OleDbConnection(DbProvider & DbSource)

      Dim dt as new DataTable 

      con.Open()
      strSQL = "SELECT * FROM Table1 WHERE Username = @UserName"
      da = New OleDb.OleDbDataAdapter(strSQL, con)
      da.SelectCommand.Parameters.Add("@UserName",SqlDbType.nvarchar,50).Value = Label1.Text
      da.Fill(ds, "studentclasslist")
      dt = ds.Tables(0)

      If (dt.Rows.Count > 0) Then
         Dim dr as DataRow = dt.Rows(0)
         'Field names and Textbox names below are just mine
         txtUserName.Text = dr.Item("Username")
         txtPassword.Text = dr.Item("Password")
         txtUserlevel.Text = dr.Item("UserLevel")
      End If

End Using