admin

VB.NET-为什么此sql命令作为字符串而不是参数化查询起作用?

sql

Dim command_sbsp As New OleDbCommand("SELECT * FROM SNOMED_ORG_INFO WHERE ConceptID=@ID AND Genus='SALMONELLA' AND SubSpecies=@Subsp", SNOMED_DB)

For Each match As Long In choices
 command_sbsp.Parameters.Clear()
 command_sbsp.Parameters.AddWithValue("@Subsp", word)
 command_sbsp.Parameters.AddWithValue("@ID", match)

上面的方法不起作用。查询尝试表明没有与此相匹配的内容。但是,当我将其作为简单的字符串连接尝试时,它可以正常工作。

command_sbsp = New OleDbCommand("SELECT * FROM SNOMED_ORG_INFO WHERE ConceptID=" + match.ToString + " AND Genus='SALMONELLA' AND SubSpecies='" + word + "'", SNOMED_DB)

我自己和一个同事已经盯着这个东西很多了,我们不知道为什么它不起作用。问题出在@ID的值中(因为当我将另一个参数设置为参数时,它仍然有效)。有趣的是,上面只有几行代码,我有一个不同的查询,使用与For
Each循环从中获取match变量的相同选择列表,为相同ID设置了参数化值。

Choices是一个long列表,当我使用choices(0)在查询中参数化ID时,它可以工作。但是现在在这个循环中,我有很长的新比赛了,它不想让它对我有用。有什么想法吗?


阅读 175

收藏
2021-07-01

共1个答案

admin

尽管OLEDB类可以使用命名参数,但实际上只是使用’?’。标记在背景中,因此参数按INDEX顺序排列。您的sql的ID变量位于Subsp变量之前。

像这样切换它:

For Each match As Long In choices
 command_sbsp.Parameters.Clear()
 command_sbsp.Parameters.AddWithValue("@ID", match)
 command_sbsp.Parameters.AddWithValue("@Subsp", word)
2021-07-01