我目前正在开发一个简单的程序,可以在拾取包时将包记录到访问数据库中。一切都很好,但有一点。
如果列表框中有多个包(lstPackages),则将它们全部记录为具有相同的包ID(pid)。变量packageInfo包含id,商店名称和运行时。所以它读作“id shop run”。
所以我拆分packageInfo变量来创建pid(只是包ID),所以我可以得到每个包的唯一ID。
我觉得因为我在每个循环中使用a,所以应该如下所示。
拆分,连接到数据库,查询信息,关闭连接,并对列表框中的每个项重复。
每个项目都会重复,但就像我说的那样,数据库中的每条记录都包含与列表框中最后一项相同的ID。
提前致谢!
For Each item In lstPackages.Items
Dim idArray() As String = packageInfo.Split(" ")
pid = idArray(0)
con.ConnectionString = My.Settings.con
cmd.Connection = con
con.Open()
cmd.CommandType = CommandType.Text
cmd.CommandText = "INSERT INTO packages
(ID, Shop, Run, [Time of Pickup], [PPU Name], [PPU ID], [tmSig])
VALUES ('" & pid & "', '" & shop & "', '" & run & "', '" & time & "', '" & ppu & "', '" & ppuid & "', ""C:\Users\Sam\OneDrive\Signatures\" & shop & "\" & runPath & "\" & shoptime & ".jpg"")"
cmd.ExecuteNonQuery()
con.Close()
Next
答案 0 :(得分:2)
您的代码存在一些问题,即用于汇编SQL命令的字符串串联。这是一种安全风险,您应该使用Parameters
对象上的Command
集合。
否则,您只需重新排列代码即可使用以下结构。我在代码中留下了一些评论,我认为你有数据和/或逻辑问题: -
con.ConnectionString = My.Settings.con
'Open the connection and hold it open
con.Open()
cmd.Connection = con
cmd.CommandType = CommandType.Text
For Each item In lstPackages.Items
'*** THIS IS THE PROBLEM
'"packageInfo" does not change for each iteration. Did you mean item.Split(" ")?
Dim idArray() As String = packageInfo.Split(" ")
pid = idArray(0)
'*** WHERE ARE ALL OF THE VARIABLES FOR THIS SQL STATEMENT LOADED? ***
'*** ARE THEY THE REMAINING ELEMENTS OF "idArray"?
'*** THEY NEED TO BE INITIALISED SOMEWHERE
'Use the same instantiated Command object to improve performance
cmd.CommandText = "INSERT INTO packages
(ID, Shop, Run, [Time of Pickup], [PPU Name], [PPU ID], [tmSig])
VALUES ('" & pid & "', '" & shop & "', '" & run & "', '" & time & "', '" & ppu & "', '" & ppuid & "', ""C:\Users\Sam\OneDrive\Signatures\" & shop & "\" & runPath & "\" & shoptime & ".jpg"")"
cmd.ExecuteNonQuery()
Next
con.Close()
有关使用Parameter
集合的示例,请参阅此Microsoft文章。它适用于SQL UPDATE,但原理仍适用于SELECT。