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