我有一个包含几条记录的数据表。数据表的每一行都有一个存储图片的字段。当我遍历数据表行以将它们插入到数据库的表中时,该行的每个字段都被正确保存;但是对于每条记录,都会保存数据表第一行中的图片。我跟踪了代码,它确实访问了访问的行并尝试将图片保存在数据表的每一行中。我使用的是VB.NET,数据库是MS Access。
我的代码如下所示:
For Each dr As DataRow In dt.Rows
cmd.CommandText = "INSERT INTO Table1 (" & _
"[ID], " & _
"[Name], " & _
"[BDate], " & _
…….
"[TelNo], " & _
"[Photo]) " & _
" VALUES(" & _
dr("ID") & ", '" & _
dr("Name") & "', " & _
dr("BDate") & ", '" & _
…….
dr("TelNo") & "', " & _
img & ")"
cmd.Parameters.Add(img, OleDb.OleDbType.Binary).Value = dr("Photo")
cmd.ExecuteNonQuery()
Next
答案 0 :(得分:1)
代码完全符合您的要求:
在循环中,所有字段都会根据数据集行中的值而变化,因为您为每个字段执行此操作:dr(thefield)
除之外的图片,因为您只是执行此操作:img
因此,它始终是相同的图像。
你应该有类似dr(image)
的东西(但我怀疑它是否有效)
答案 1 :(得分:0)
我自己找到答案。问题相当微妙。在OleDbCommands中,参数未命名。参数用?表示? (问号)。在我的问题的代码片段中,变量img的值为?,它由循环前的语句指定。参数的值必须按其外观的顺序提供。我的情况是,只有一个参数,我通过语句提供了一个参数:
cmd.Parameters.Add(img, OleDb.OleDbType.Binary).Value = dr("Photo")
但是,在循环的每次迭代中,将添加另一个参数。对于第二个记录,参数的实际值将是第二个参数,第三个记录将在第三个位置具有其值,等等。因为在OleDbCommands中参数的值由它们的顺序标识,并且因为只有一个参数在我的情况下,总是使用首先提供的图片(即第一个记录的图片)。 因此,问题归结为“我如何在每次迭代中提供单个参数?”答案是通过包含这个宝贵的陈述来删除每次迭代添加的参数:
cmd.Parameters.Clear()
作为循环中的最后一个语句。 很抱歉有冗长的解释。