보통 String.Format
처럼 작동하는 SQLFormat 함수에서 작업하고 있습니다.커스텀 String.Format의 현재 인덱스
그리고 지금 나는 현재 Format
가에있는 인덱스에 의존되는에 붙어있어.
예를 들어, 우리는이 SQL 쿼리 (사이비가 아닌 실제 사용)가 있습니다.
SELECT *
FROM users
WHERE userID = {0:SQL;userID}
AND 10 != {1:SQL;strangeID}
AND 100 = {0:SQL;userID}
이
지금이 바로 같은 형식되고있다 : 그것은@p2
을 출력하는 경우 (이미 해당 매개 변수를 추가 했으므로)
SELECT *
FROM users
WHERE userID = @p0 /* userID */
AND 10 != @p1 /* strangeID */
AND 100 = @p2 /* userID */
, 나는 그것이 @p0
을 재사용 할 여기
내 형식을 지정하는 클래스 현재 색인 생성에 정적 int를 사용하고 있습니다.
현재 매개 변수 색인을 얻을 수 있는지 알 수 없습니다.)
한 가지 방법은 서식을 건너 뛰는 것이지만 필요하므로 토큰을 직접 건너 뛸 수 있습니다.
가 업데이트 : (P 나는 String.Format
내가 생산할 수있는 코드보다 빠르다는 것을 생각) : 내 현재 코드로 코드를 업데이트 한, 나는 사전에 모든 토큰을 준비하고 대신 값으로 파라미터 이름에 밀어 값의.
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 */, @p0 /* userID */
의 SELECT @p0 /* userID */, @p1 /* userID */
반환? 이 경우 0
.
굉장하고, 이것과 함께할만한 것이 있습니다. mod를 사용해야 만하므로 이름이 지정되지 않은 토큰도 처리 할 수 있습니다. 고마워요! – NoLifeKing
좋습니다. 예를 들어 고려해야 할 몇 가지 사항이있었습니다. securitywise 다른 대답도. – TaW
그래, 나는 주사 위험을 없애는 등 SqlParameters에 모든 것을 던진다. :) – NoLifeKing