0

我正在尝试将列表框中的项目(总共 19 个)转移到 MS Access 数据库

以下代码

        For i = 0 To Me.lstResourceTypes.Items.Count - 1
            command.Parameters.AddWithValue("@ResourceType", lstResourceTypes.Items(i).ToString)
            MsgBox(lstResourceTypes.Items(i).ToString)
            command.ExecuteNonQuery()
        Next

在 Access 表中创建 19 条记录,但每条记录都填充有列表框中的第一项。

消息框确实显示代码循环通过列表框,那么为什么它没有反映在访问表中呢?

4

1 回答 1

1

发生这种情况是因为您在每个循环中不断地向集合中添加一个新参数。该方法不会用相同的 ParameterName 替换先前的参数。因此,查询只使用第一个。
您需要清除循环内的参数

    For i = 0 To Me.lstResourceTypes.Items.Count - 1
        command.Parameters.AddWithValue("@ResourceType", lstResourceTypes.Items(i).ToString)
        MsgBox(lstResourceTypes.Items(i).ToString)
        command.ExecuteNonQuery()
        command.Parameters.Clear()
    Next

但更正确的方法是在循环外定义参数并仅更改循环内的参数值。所以假设参数是指一个字符串类型的列,你可以写

    command.Parameters.Add("@ResourceType", OleDbType.VarWChar)
    For i = 0 To Me.lstResourceTypes.Items.Count - 1
        command.Parameters("@ResourceType").Value = lstResourceTypes.Items(i).ToString
        command.ExecuteNonQuery()
    Next

请注意,我使用的是 Add 而不是 AddWithValue。第二个有许多缺点,如下所述:AddWithValue is Evil

于 2020-05-08T06:49:49.723 回答