2014-07-06 54 views
-1

我在VB中编程比较新。VB.NET SQL语句

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

我将登录的用户等同于辅助表单上的标签(登录后)。基本上,如果我的访问数据库中的用户名列等于该标签,然后为该唯一用户撤回数据,我希望拥有一个SQL select语句。这是我现在的代码:

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 * From Table1”时,它可以正常工作,但不会给我一个唯一的登录用户,这是我的目标。

请帮忙!

+4

请注意,您的代码对于SQL注入攻击***开放***。你不应该把输入视为*可执行的SQL代码*。相反,使用参数化查询在SQL查询中将输入视为* values *。 – David

+3

请扩大“不起作用”。注意你在'strSQL'定义的末尾看起来有一个额外的双引号。 “用户名”列的数据类型是什么? –

+0

除非用户名必须是唯一的,并且他们不能改变他们的登录并且你的应用强制执行这些规则,更好的方法是将用户ID存储为变量并将其用于数据限制。 – Plutonix

回答

0

由于misused double quotation而没有工作。

可能是这样的

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() 

但是,这会导致你SQL injection attacks。使用parameterized查询将输入视为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() 
1

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

//In your login page 
Session["myUser"] = txtUsername.Text 

然后,您可以在应用程序的任何位置使用来自Session的用户标识。

//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) 
0

SQL注入防止作为参数已经得到了广泛的建议。此外,您还可以使用Using为你连接马上连接处理它正在使用等之后:

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) 

的数据,并假设你有一个记录匹配,您可以通过检查Records.Count来检查是否有记录,并且如果将它保存到DataRow然后Textboxes

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 
0

感谢大家。这是双引号。现在可以工作,但接下来是让它注入sql注入证明,我将学习如何使用参数化查询来防止。