【问题标题】:vb.net OleDbDataAdapter not working with Select From Wherevb.net OleDbDataAdapter 不能与 Select From Where 一起使用
【发布时间】:2016-07-19 05:33:39
【问题描述】:

如果我对此进行调试,我只会得到一个无效的列名错误(“对象名称”)。我正在使用 SQL 数据库。

Protected Sub ddlKunden_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddlKunden.SelectedIndexChanged
    Dim strSql As String
    Dim kontakt As String = ddlKunden.SelectedItem.Value
    Dim dtbP As DataTable
    Using connection As OleDbConnection = New OleDbConnection(strConnection)
        connection.ConnectionString = strConnection
        connection.Open()

        'Kontaktpersonen laden
        strSql = "SELECT * FROM Kontaktpersonen WHERE Nr =" & Chr(34) & kontakt & Chr(34)

        dtbP = New DataTable()
        Using dad As New OleDbDataAdapter(strSql, connection)
            dad.Fill(dtbP)
        End Using
        ddlKontaktperson.Items.Clear()
        ddlKontaktperson.DataSource = dtbP
        ddlKontaktperson.DataTextField = "AP_Nam"
        ddlKontaktperson.DataValueField = "ID"
        ddlKontaktperson.DataBind()
    End Using

    ddlKontaktperson.Visible = True

End Sub

错误出现在

dad.fill(dtbP)

它应该选择 Nr="SELECTED VALUE" 的所有行,然后您在下拉列表中选择它。然后所有这些行都应该保存在 Datatable 中,并在另一个下拉列表中使用。

当我在没有 where 的情况下尝试完全相同的事情时,它会起作用。
示例:

'Kunden laden
            strSql = "SELECT * FROM Kontakte"
            dtbK = New DataTable()
            Using dad As New OleDbDataAdapter(strSql, connection)
                dad.Fill(dtbK)
            End Using
            ddlKunden.Items.Clear()
            ddlKunden.DataSource = dtbK
            ddlKunden.DataTextField = "Nr"
            ddlKunden.DataValueField = "Nr"
            ddlKunden.DataBind()

【问题讨论】:

    标签: asp.net database vb.net


    【解决方案1】:

    请尝试以下代码 您不需要在参数周围使用“'” 只需将这些值作为参数添加到 oledbcommand 及其值和类型 否则,你的 sql 命令将容易受到 sql 注入的攻击

    Dim strConnection As String = "Provider=sqloledb;Data Source=(local);" &
                                  "Initial Catalog=kodyaz;" &
                                  "User Id=sa;Password=sa"
    
    Dim kontakt As Int32 = 1
    
    Dim dtbP As DataTable
    
    Using connection As OleDbConnection = New OleDbConnection(strConnection)
        connection.Open()
    
        Dim cmd As New OleDbCommand()
        cmd.Connection = connection
        cmd.CommandText = "SELECT * FROM Kontaktpersonen WHERE Nr = ?"
        cmd.Parameters.AddWithValue("Nr", kontakt)
    
        dtbP = New DataTable()
        Using dad As New OleDbDataAdapter(cmd)
            dad.Fill(dtbP)
        End Using
    
    End Using
    

    【讨论】:

    • 有效!谢谢!你能告诉我为什么我的代码不起作用吗?
    • 命令应该是 => SELECT * FROM Kontaktpersonen WHERE Nr = 1 以下是可以接受的 => SELECT * FROM Kontaktpersonen WHERE Nr = '1' 但下面会导致 SQL 引擎语法错误 => SELECT * FROM Kontaktpersonen WHERE Nr = "1"
    • 也许你的代码会像 => strSql = "SELECT * FROM Kontaktpersonen WHERE Nr=" & kontakt
    • 但 kontakt 是一个字符串,不是整数或数字,没有这些 Chr(34) 也无法工作。
    • 然后在我原来的帖子中将“Dim kontakt As Int32 = 1”中的数据类型更改为字符串类型,而不是像“Dim kontakt As String = “01””这样的 int32。并尽可能使用参数而不是动态查询
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 2017-09-03
    相关资源
    最近更新 更多