以下のNudierへの返信に基づいて、選択したメッセージのmessageIDを次のように渡そうとしています。WHERE MessageID = MessageID
これが機能しない理由、および常に最初の行が返される理由は、SQLがMessageIDが渡そうとしている変数であることを認識していないためです。SQLが知る限り、MessageIDは列です。名前なので、SQLに要求するのは、MessageID列= MessageID列である行の「Body」列を選択することだけです。MessageIDはそれ自体と等しく、常にtrueになります。また、ExecuteScalarは常に最初の行の最初のセルを返すため、クエリは常にメッセージテーブルからすべての行を返し、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