VB.NET - 为什么这个sql命令作为字符串工作但不作为参数化查询?

cos*_*ost 1 sql vb.net

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)
Run Code Online (Sandbox Code Playgroud)

以上不起作用.查询尝试说没有什么能与之匹配.但是,当我尝试将其作为简单的字符串连接时,它工作正常.

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

我自己和同事一直盯着这个,我们无法弄清楚为什么它不起作用.问题在于@ID的值(因为当我将另一个参数化时,它仍然有效).有趣的是,上面只有几行代码我有一个不同的查询,为同一个ID设置参数化值,使用For Each循环从中获取匹配变量的相同选项列表.

选择是一个long列表,当我使用choice(0)来参数化查询中的ID时,它可以工作.但现在在这个循环中,我有新的比赛,并且它不想让它对我有用.有什么想法吗?

Lar*_*ech 5

尽管OLEDB类可以使用命名参数,但它实际上只是使用'?' 标记在后台,所以参数是按INDEX顺序.你的sql在Subsp变量之前有ID变量.

切换它,像这样:

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