私は、通常のように機能する SQLFormat 関数に取り組んでいます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
(すでにそのパラメーターを追加しているため)
これがフォーマットを行う私のクラスです。現在、インデックス作成に static int を使用しています
現在のパラメーター インデックスを取得できるかどうかはわかりません)。
1 つの方法は、フォーマットをスキップすることですが、これが必要なので、自分でトークンを置き換えることをスキップできます。(私String.Format
が生成できるコードよりも速いと思います:P)
UPDATED : 現在のコードでコードを更新しました。事前にすべてのトークンを準備し、パラメーター名を値ではなく値としてプッシュします。
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
この場合。