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

Vb.net 使用Provider=Microsoft.Jet.OLEDB.4.0在vb net中使用准备好的语句的简单示例是什么,vb.net,Vb.net,大家好,堆栈溢出。 出于某些原因,我想继续使用ms Access作为数据库使用vb net 我的代码运行良好,但前提是我直接使用用户输入。这使得我的系统易于sql注入 我在google上看到了一些例子,显示了如何使用vbn.et在准备好的语句中绑定参数 不幸的是,这些示例不支持ms Access表的连接字符串中的“Provider”关键字 了解这一点的人能否帮助我修改下面的vb代码,以使用Provider=Microsoft.Jet.OLEDB.4.0作为连接字符串绑定参数 我不想说“where

大家好,堆栈溢出。 出于某些原因,我想继续使用ms Access作为数据库使用vb net

我的代码运行良好,但前提是我直接使用用户输入。这使得我的系统易于sql注入

我在google上看到了一些例子,显示了如何使用vbn.et在准备好的语句中绑定参数

不幸的是,这些示例不支持ms Access表的连接字符串中的“Provider”关键字

了解这一点的人能否帮助我修改下面的vb代码,以使用Provider=Microsoft.Jet.OLEDB.4.0作为连接字符串绑定参数

我不想说“where password=”&supplier\u password 但是说“where password=@supplier\u 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

非常感谢

这是一个包含参数和正确使用一次性对象的代码版本

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
确保在使用完每个一次性对象(此上下文中的连接和命令)后正确地处置它们

插入参数占位符@pass以代替实际值,并向命令参数集合添加一个参数,该参数具有字段预期的匹配数据类型和正确的值


请注意,在OleDb中,参数占位符通常由问号
表示,但Access也接受用
@xxxx
格式表示的参数占位符。但是,参数应按照其占位符在命令文本中的显示顺序添加到参数集合中。

这是一个包含参数和正确使用一次性对象的代码版本

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
确保在使用完每个一次性对象(此上下文中的连接和命令)后正确地处置它们

插入参数占位符@pass以代替实际值,并向命令参数集合添加一个参数,该参数具有字段预期的匹配数据类型和正确的值


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

OleDb
用于访问,
SqlClient
用于SqlServer。你通常不需要两者兼而有之。如果他们只需要猜测密码而不是特定用户ID使用的密码,那么这是一种相当粗糙的登录机制。此外,密码永远不应存储为明文,而应存储为hash.hi puropoix。这只是一个简单的例子,不会变得复杂。另外,我现在已经了解了SqlClient在做什么。感谢您的回复除了Steve的精彩回答之外,另请参见:
OleDb
用于访问,
SqlClient
用于SqlServer。你通常不需要两者兼而有之。如果他们只需要猜测密码而不是特定用户ID使用的密码,那么这是一种相当粗糙的登录机制。此外,密码永远不应存储为明文,而应存储为hash.hi puropoix。这只是一个简单的例子,不会变得复杂。另外,我现在已经了解了SqlClient在做什么。感谢您的回复除了Steve的精彩回答外,还请参见:太好了。正是我在看的。非常感谢,我明白了。还有很多东西要学。我对stack over flow在短时间内给出的高质量答案感到惊讶,而且通常都有简单适用的解决方案。任何一天都胜过百科全书。。。。除了刺耳的声音,别胡说八道moderators@webzy这是一个非常多的社区,它是由对质量的追求驱动的。如果主持人有时不“严厉”,那么一个完全无政府主义的大型论坛将立即垮台。关于规则的解释有数千页。当然,在教学中强加给他们是一回事,不加解释又是另一回事。再见,太好了。正是我在看的。非常感谢,我明白了。还有很多东西要学。我对stack over flow在短时间内给出的高质量答案感到惊讶,而且通常都有简单适用的解决方案。任何一天都胜过百科全书。。。。除了刺耳的声音,别胡说八道moderators@webzy这是一个非常多的社区,它是由对质量的追求驱动的。如果主持人有时不“严厉”,那么一个完全无政府主义的大型论坛将立即垮台。关于规则的解释有数千页。当然,在教学中强加给他们是一回事,不加解释又是另一回事。今天再见