Я работаю над функцией SQLFormat, которая работает как обычный String.Format
.Текущий индекс в пользовательском String.Format
А теперь я застрял на том, зависит от какой индекс тока Format
в.
К примеру, у нас есть этот SQL-запрос (псевдопользователей, а не фактическое использование).
SELECT *
FROM users
WHERE userID = {0:SQL;userID}
AND 10 != {1:SQL;strangeID}
AND 100 = {0:SQL;userID}
Это был отформатирован, как это прямо сейчас:
SELECT *
FROM users
WHERE userID = @p0 /* userID */
AND 10 != @p1 /* strangeID */
AND 100 = @p2 /* userID */
Где он выводит @p2
, я хочу, чтобы повторно использовать @p0
(так как я уже добавил, что параметр)
Вот мой класс, который выполняет форматирование. В настоящее время я использую статический int для индексации
Я не узнал, могу ли я получить текущий индекс параметров).
Один из способов - пропустить форматирование, но мне это нужно, поэтому я могу пропустить замену самих токенов. (Я думаю, что String.Format
быстрее, чем код, который я мог бы произвести: P)
Обновлено: Я обновил код с моим текущим кодом, я готовлю все маркера на заранее и нажать в параметре названиях в качестве значений вместо от значений.
public class SqlFormat : IFormatProvider, ICustomFormatter
{
public object GetFormat(Type formatType)
{
if (formatType == typeof(ICustomFormatter))
return this;
return null;
}
internal int IndexCounter = 0;
Dictionary<string, int> dict = new Dictionary<string, int>();
public string Format(string format, object arg, IFormatProvider formatProvider)
{
if (!this.Equals(formatProvider))
return null;
if (string.IsNullOrWhiteSpace(format))
format = "SQL;field";
var formats = format.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
format = formats[0];
if (format == "SQL")
{
string ind = IndexCounter.ToString();
if (dict.ContainsKey(formats[1])) ind = dict[formats[1]].ToString();
else dict.Add(formats[1], IndexCounter++);
var pName = arg;
return pName + (formats.Length > 1 ? " /* " + formats[1] + " */" : "");
}
else
{
return HandleOtherFormats(format, arg);
}
}
public string HandleOtherFormats(string format, object arg)
{
return string.Format(format, arg);
}
}
Пример использования:
var sql = @"SELECT {0:SQL;userID}, {0:SQL;userID}";
var retSql = String.Format(new SqlFormat(), sql, new[] { 650 });
Console.WriteLine(retSql);
Это возвращает SELECT @p0 /* userID */, @p1 /* userID */
вместо
SELECT @p0 /* userID */, @p0 /* userID */
Есть ли какой-нибудь способ, что я могу получить текущий индекс? 0
в этом случае.
Удивительный, с этим мне есть с чем работать. Я просто должен его поменять, поэтому я могу обрабатывать и неименованные жетоны. Большое спасибо! – NoLifeKing
Хорошо; было несколько вещей, чтобы рассмотреть, например. в другом ответе тоже. – TaW
Да, я бросаю все в SqlParameters, чтобы быть уверенным, что я избавлюсь от рисков, связанных с инъекциями, и так далее. :) – NoLifeKing