アップデート
「\」がエスケープ ヘルパーの場合、次の 4 文字をエスケープする必要があります %[]_
- http://msdn.microsoft.com/en-us/library/aa933232(v=sql.80).aspx - いいね
- LIKE 式で安全に使用できるように、SQL Server で文字列をエスケープします。
- SQL Server で _ をエスケープするにはどうすればよいですか?
質問
いろいろ調べたのですが、以下のスタックオーバーフローに完全に一致する問題を見つけることができませんでした。
Log_Description というデータベース列があります。これには 2 つのレコードがあります。
1) 「サンプル%値レコード」
2)「サンプル無料記録」
以下に示すように、SQLコマンドを使用してパラメーターを設定しています
commandText = commandText + “Log_Description LIKE @Log_Description”;
command.Parameters.AddwithValue(“@Log_Description”, “%”+obj. LogDescription+”%”);
ユーザーが txtLogDescription テキストボックスの検索パラメーターとして「%」を入力すると、最初のレコードのみを表示する必要があります。しかし、現在は両方のレコードを表示しています。
- これを克服するために可能な方法は何ですか?
- 上記のコードでこのような問題を引き起こす可能性のある他の文字は何ですか?
注: ユーザーが入力として「%」を入力するのを防ぐことはできません
注: SQL Server をデータベースとして使用しています
編集:
私が現在使用しているソリューションは、エスケープ文字のエスケープが機能しない – SQL LIKE 演算子です。
private static string CustomFormat(string input)
{
input = input.Replace(@"\", @"\\");
input = input.Replace(@"%", @"\%");
input = input.Replace(@"[", @"\[");
input = input.Replace(@"]", @"\]");
input = input.Replace(@"_", @"\_");
return input;
}
LINQアプローチ (パフォーマンス ヒットあり) は以下のとおりです。
Collection<Log> resultLogs = null;
if (!String.IsNullOrEmpty(logSearch.LogDescription))
{
resultLogs = new Collection<Log>();
var results = from o in logs where o.LogDescription.Contains(logSearch.LogDescription) select o;
if (results != null)
{
foreach (var log in results)
{
resultLogs.Add((Log) log);
}
}
}
else
{
resultLogs = logs;
}