0

パラメータ化されたクエリに検索キーとして 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 を返します。

この問題について何か助けていただければ幸いです。上記の説明で何か間違ったことを述べた場合は、私に知らせてください。また、なぜ私が間違っていたのかについて説明を提供していただけないでしょうか。

4

1 に答える 1

2

Chris が述べたように、パラメーター化されたバージョンにはアポストロフィは必要ありません。これは、NVarChar タイプであると述べているためです。ただし、パラメータ化されていないバージョンでは、次のように NVarChar 文字列を検索していないことに気付きました

SQl_Command.CommandText = "SELECT COUNT(ID) As MyCount FROM members WHERE ([Primary Exp] = N'" + exp + "') AND ([Approved] = 'True') OR ([Approved] = 'True') AND ([Secondary Exp] = N'" + exp + "')";

一方、パラメーター化されたバージョンは、NVarChar 文字列が指定されているため、これを使用して自動的に検索します。これは、データの保存方法 (NVarChar ではなく VarChar 文字列として保存している可能性がありますか?) と、データに Unicode 文字が含まれているかどうかによって、2 つの結果セットが異なる理由である可能性があります。

SQL Server プロファイラーを使用して、データベースに送信されるクエリの違いを確認することもできます。

これを回答として投稿して申し訳ありませんが、コメントとして投稿するという評判はありません:)

于 2013-08-23T08:28:15.523 に答える