0

アップデート

「\」がエスケープ ヘルパーの場合、次の 4 文字をエスケープする必要があります %[]_

  1. http://msdn.microsoft.com/en-us/library/aa933232(v=sql.80).aspx - いいね
  2. LIKE 式で安全に使用できるように、SQL Server で文字列をエスケープします。
  3. SQL Server で _ をエスケープするにはどうすればよいですか?

質問

いろいろ調べたのですが、以下のスタックオーバーフローに完全に一致する問題を見つけることができませんでした。

Log_Description というデータベース列があります。これには 2 つのレコードがあります。

1) 「サンプル%値レコード」

2)「サンプル無料記録」

以下に示すように、SQLコマンドを使用してパラメーターを設定しています

commandText = commandText + “Log_Description LIKE @Log_Description”;
command.Parameters.AddwithValue(“@Log_Description”, “%”+obj. LogDescription+”%”); 

ユーザーが txtLogDescription テキストボックスの検索パラメーターとして「%」を入力すると、最初のレコードのみを表示する必要があります。しかし、現在は両方のレコードを表示しています。

  1. これを克服するために可能な方法は何ですか?
  2. 上記のコードでこのような問題を引き起こす可能性のある他の文字は何ですか?

注: ユーザーが入力として「%」を入力するのを防ぐことはできません

注: 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;
        }
4

1 に答える 1

1

escaping%に関しては、質問に対する Tommy Grovnes のコメントを参照してください。

List<T>a の代わりに aを使用できる場合Collection<T>(こちらを参照)、これはより簡潔に記述できます。

var descr = logSearch.logDescription;
var results = (
    from o in logs
    where String.IsNullOrEmpty(descr) ||
            o.LogDescription.Contains(descr)
    select o
).ToList();

それでも が必要な場合Collection<T>は、LINQ クエリの結果を Collection コンストラクターでラップできます。

var results = new Collection<Log>((
    from o in logs
    where String.IsNullOrEmpty(descr) ||
            o.LogDescription.Contains(descr)
    select o
).ToList());
于 2012-11-15T09:47:27.167 に答える