我正在尝试将这些项目从一个列表框(总共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个记录,但每个记录都填充了列表框中的第一个项。
messagebox确实显示了代码循环通过列表框,那么为什么它不反映在access表中呢?
发布于 2020-05-07 22:49:49
这是因为您继续在每个循环中向集合添加一个新参数。该方法不会用相同的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是邪恶的
https://stackoverflow.com/questions/61673579
复制