ストアド プロシージャ内の動的 SQL がパラメーターを使用するかどうかはわかりません。そうでない場合、最善の解決策は、クエリ実行時に一重引用符の文字列をエンコードすることです
たとえば、メソッドを作成しますstring EncodeSqlString(string s) { return s.replace("'", "''"); }
次に、このメソッドを呼び出します
cmd.CommandText = "SP_FOO";
cmd.CommandType = CommandType.StoredProcedure;
EntityParameter param = new EntityParameter();
param.Value = EncodeSqlString(myString);
param.ParameterName = "MyParam";
cmd.Parameters.Add(param);
これは、ストアド プロシージャに渡される文字列値のみをエンコードするため、最も安全な方法です。他の場所や、引用符のエンコードが適切でないコンテキストでは値を使用せず、切り捨てのリスクを軽減します ( SP 内で切り捨てが発生しない限り)。これは、SP が SQL クエリを構築するための値のみを使用する場合にのみ正しく機能します。SP が値を使用して何か他のことを行う場合、これはおそらく適切ではありません。
このメソッドには文字列値のみを渡します。その他の引用符で囲まれていない型については、パラメーターに渡す前に正しい型であることを確認する必要があります。例えばint
string number = Request.QueryString["Number"];
if (int.TryParse(number, out myInt))
{
cmd.CommandText = "SP_BAR";
cmd.CommandType = CommandType.StoredProcedure;
EntityParameter param = new EntityParameter();
param.Value = myInt;
param.ParameterName = "MyParam";
cmd.Parameters.Add(param);
}
else
{
// handle appropriately but do not use value
}