2010-01-29 2 views
0

생성 된 LINQ to SQL 클래스 (예 : DataContext)에 대해 일부 반향을하고 있습니다. 클래스 (테이블)의 각 속성 (열)에 대해 ColumnAttribute.DbType 값이 표시됩니다.SQL 데이터 형식에 대한 문자열 구문 분석

  • 지능 NOT NULL
  • 지능
  • VARCHAR (255)
  • VARCHAR (255) NOT NULL
  • 비트
  • : 그것은 여러 가지 다른 값이 될 수

    , 여기에 몇 가지 예입니다

... 등등.

이러한 문자열을 "DataType", "Nullable"및 "MaxLength"와 같은 별도의 의미있는 값으로 구문 분석하려는 경우 가장 좋은 방법은 무엇입니까?

전체 렉서/구문 분석기 또는 언어 인터프리터가 필요하지 않지만 M과 같은 코드는 필요하지 않습니다. Substring과 관련된 일부 (끔찍한) 특정 수동 구문 분석 이외에 무엇을 권하고 싶습니까? C#에서

답변주세요 - 그게 내가이 일에 대한 좋은거야 모든 꽤 많이 있어요 :)

답변

1

당신은 그 패턴과 일치하는 정규 표현식을 사용하려면 수 :

string input = @" 
    Int NOT NULL 
    Int 
    VarChar(255) 
    VarChar(255) NOT NULL 
    Bit"; 
foreach (Match m in Regex.Matches(input, 
    @"^\s*(?<datatype>\w+)(?:\((?<length>\d+)\))?(?<nullable> (?:NOT)?NULL)?", 
    RegexOptions.ECMAScript | RegexOptions.Multiline)) 
{ 
    Console.WriteLine(m.Groups[0].Value.Trim()); 
    Console.WriteLine("\tdatatype: {0}", m.Groups["datatype"].Value); 
    Console.WriteLine("\tlength : {0}", m.Groups["length" ].Value); 
    Console.WriteLine("\tnullable: {0}", m.Groups["nullable"].Value); 
} 
1

이 할 것인가를, 아래와 같이 정규 표현식을 사용 : 위 예

 
public Regex MyRegex = new Regex(@ 
     "(?<datatype>([tiny|big]?int|long)?|(?<varchar>varchar)?)\s?"+ 
     "(\((?<len>\d{1,})\))?\s?(?<nullable>(?<not>not)?\s+(?<null>null))?", 
    RegexOptions.IgnoreCase 
    | RegexOptions.CultureInvariant 
    | RegexOptions.IgnorePatternWhitespace 
    | RegexOptions.Compiled 
    ); 

Match m = MyRegex.Match(InputText); 

// Example invocation... 
if (m.Success){ 
    string DataType = m.Groups["datatype"].Value; 
    int DataLen = m.Groups["len"].Value; 
    string Nullable = m.Groups["nullable"].Value; 
} 

그것은 일치 :

 
int null 
varchar(255) not null 

또한 regexp는 tinyint, bigint, int, long 및 varchar 와만 일치합니다.

호프가 도움이 되었으면 안녕하세요, 탐.