我正在使用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