使用Provider = Microsoft.Jet.OLEDB.4.0在vb net中使用预准备语句的简单示例是什么

时间:2016-01-28 22:18:53

标签: vb.net

你好堆栈溢出的好人。 出于某种原因,我想继续使用vb net继续使用ms Access作为数据库。

我的代码运行良好但只有我直接使用用户输入。这使我的系统容易进行sql注入。

我在google上看到过一些使用vbn.et显示在预准备语句中使用参数绑定的示例。

不幸的是,这些例子不支持"提供商" ms访问表的连接字符串中的关键字。

理解这一点的人可以帮我修改下面的vb代码,使用Provider = Microsoft.Jet.OLEDB.4.0作为连接字符串来处理参数绑定吗?

我想避免说"密码=" &安培; supplier_password 但是说"其中密码= @supplier_password" 然后提供提供的密码文本。

这是我的vb网络代码。

    Private Sub test_password()


    Dim myConnection As OleDbConnection = New OleDbConnection
    myConnection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source =C:\books\author.mdb"

    Dim counter As Int16

    myConnection.Open()
    Dim str As String
    str = "SELECT * FROM users where password =  '" & pass.Text & "'"


    Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)

    counter = cmd.ExecuteScalar
    myConnection.Close()

    If counter > 0 Then
        MsgBox("password was found")
    Else
        MsgBox("password was NOT found")

    End If

End Sub

我使用了相应的

          Imports System.Data.OleDb
          Imports System.Data.SqlClient

非常感谢

1 个答案:

答案 0 :(得分:4)

这是带有参数和正确使用一次性对象的代码版本

Private Sub test_password()
    ' Do not return all the fields, just count....'
    ' ...and password is a reserved keyword in access...'
    ' need square brackets around it otherwise ...syntax error...'
    Dim str = "SELECT COUNT(*) FROM users where [password] =  @pass"
    Using myConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;....")
    Using cmd = New OleDbCommand(str, myConnection)

        myConnection.Open()
        cmd.Parameters.Add("@pass", OleDbType.VarWChar).Value = pass.Text
        ' ExecuteScalar returns the first column of the first row from your query'
        Dim counter = Convert.ToInt32(cmd.ExecuteScalar)
        If counter > 0 Then
             MsgBox("password was found")
        Else
             MsgBox("password was NOT found")
        End If
    End Using 
    End Using    
End Sub

Using Statement确保完成使用后,每个一次性对象(此上下文中的连接和命令)都已正确处理。

插入参数占位符 @pass 代替实际值,并将参数添加到命令参数集合中,并使用字段期望的匹配数据类型和正确的值。

请注意,在OleDb中,参数占位符通常由问号?表示,但Access也接受以@xxxx格式表示的参数占位符。但是,参数集应按照与占位符在命令文本中出现的顺序相同的顺序添加参数。