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

时间:2011-07-22 18:00:53

标签: 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)

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

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

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

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

1 个答案:

答案 0 :(得分: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)