パラメータ化されたクエリに検索キーとして nvarchar 値を追加すると、問題が発生することはほぼ 100% 確信しています。問題は@exp
、プレースホルダーを意味するアポストロフィで囲まれている場合、クエリが @exp がプレースホルダーではなく検索キーであると解釈されるという問題が発生します。検索キーがアポストロフィで囲まれていない限り、クエリが構文的に正しくないことを除いて、アポストロフィを削除します。実行計画はすでに評価されており、検索キーの値は文字通りスペイン語ではなく「スペイン語」になるため、パラメーターに挿入される値にアポストロフィを追加することはできないと説明されました。私の質問は、これをどのように回避するかです。この問題のより広範な背景については、以下の説明を参照してください。
タイトルにあるように、パラメータ化を使用するものと使用しないものの 2 つの動的クエリがありますが、どちらのクエリもまったく同じことを行うためのものです。クエリは、特定の言語でプライマリまたはセカンダリの経験を持つメンバーの数を返すために使用されます。
そうは言っても、クエリはこのように設定されています。接続は適切に設定されておりString exp
、両方のクエリで使用される値はテスト用にスペイン語にハードコードされています。
パラメータ化を使用しない:
SQl_Command.CommandText = "SELECT COUNT(ID) As MyCount FROM members WHERE ([Primary Exp] = '" + exp + "') AND ([Approved] = 'True') OR ([Approved] = 'True') AND ([Secondary Exp] ='" + exp + "')";
パラメータ化の使用:
SQl_Command.CommandText = "SELECT COUNT(ID) As MyCount FROM members WHERE ([Primary Exp] = @exp) AND ([Approved] = 'True') OR ([Approved] = 'True') AND ([Secondary Exp] = @exp)";
SQl_Command.Parameters.Add("@exp", SqlDbType.NVarChar, 255).Value = exp;
私も試しました:
SqlParameter param = new SqlParameter("@exp", SqlDbType.NVarChar, 255);
param.Value = exp;
SQl_Command.Parameters.Add(param);
エラーは、パラメーターに値を追加する方法、または検索キーを囲むアポストロフィが必要なコンテキストでパラメーターを SqlCommand に追加する方法に関係していると確信しています。その時点で CommandText にアポストロフィを入れると、プレースホルダーも入れてクエリを実行すると、0 が返されます。取得したコマンド テキストを出力します。
`SELECT COUNT(ID) As MyCount FROM members WHERE ([Primary Exp] = '@exp') AND ([Approved] = 'True') OR ([Approved] = 'True') AND ([Secondary Exp] = '@exp')`
つまり、@exp で経験のあるメンバーを検索していることを意味し、その経験を持つエントリがないため 0 を返します。
この問題について何か助けていただければ幸いです。上記の説明で何か間違ったことを述べた場合は、私に知らせてください。また、なぜ私が間違っていたのかについて説明を提供していただけないでしょうか。