根据您在下面对 Nudier 的回复,您正在尝试使用WHERE MessageID = MessageID
这不起作用的原因以及您总是返回第一行的原因是 SQL 不知道 MessageID 是您尝试传入的变量。据 SQL 所知,MessageID 是一列名称,所以您要求 SQL 做的就是选择列 MessageID = 列 MessageID 的行的列“Body”,因此 MessageID 等于其自身,这始终等于 true。由于 ExecuteScalar 总是返回第一行的第一个单元格,因此您的查询将始终返回 Messages 表中的所有行,并且 executeScalar 将抓取第一个单元格。
希望这是有道理的,如果没有,只需复制您的查询并针对您的 SQL 数据库运行它,您应该明白我的意思是什么,它返回所有行,因为 where 子句总是等于 true。
要修复它,您需要考虑 Anuraj 所说的关于添加参数的内容。
要将变量传递给代码中的 SQL 字符串,您需要对其进行参数化,然后添加相关参数,因此您的 SQL 应变为:
SELECT Body FROM Messages WHERE MessageID=@MessageID
(注意在参数名称前添加了@符号?)
在该行的正下方,您需要使用以下代码在代码中添加参数:
com.AddParameterWithValue("@MessageId", MessageId);
(我想是的,我是从 Anuraj 那里复制过来的,我通常做的方式略有不同)
同样,要查看此操作,您可以使用参数直接针对数据库运行它
DECLARE @messsageID AS INTEGER
SET @messageID = 1
SELECT Body FROM Messages WHERE MessageID=@messageID
阅读此内容以获取更多详细信息(或者如果我还没有完全清楚)http://www.csharp-station.com/Tutorial/AdoDotNet/lesson06